Solved day 12

This commit is contained in:
2024-12-13 22:59:34 +01:00
parent 4ef0232710
commit b1f53dfd72
7 changed files with 356 additions and 1 deletions

5
.idea/codeStyles/codeStyleConfig.xml generated Normal file
View File

@@ -0,0 +1,5 @@
<component name="ProjectCodeStyleConfiguration">
<state>
<option name="PREFERRED_PROJECT_CODE_STYLE" value="Default" />
</state>
</component>

140
input/day12.txt Normal file
View File

@@ -0,0 +1,140 @@
AAAAAAMMMMMMMMMMMMMMMMMMCCCCCCCCACAYYYYYYYYYYYYYYYYWWJWWIIIIIIIIIIIIIIIIIIIIIFVFMMMMMMMMMYRRYRRRRRNXXNAANIIIIIEEEEEEEEEEEEEEERRRRRRRRQQQQQCQ
AAAAAAAAMSMMMMMMMMMMMMMMMCCCCCCCCCYYYYYYYYYYYYYYYYYWWWWWWWIIIIIIIIIIIIIIIIIIFFFFFFMMMMMMMYYRYRRNNNNNNNNNNNNNIEEEEEEEEEEEEEEERRRRRRRFQQQQQQQQ
AAAAAAAFSSSMMMMMMMMMMMMXMCCCCCCCCCUCYYYYYYYYYYYYYYYWWWWWWWWIIIIIIIIIIIIIIIIIFFFFFFFMMMMYYYYYYYYNNNNNNNNNNNNIIIIEEEEEEEEEEEEERRRRRRRQQQQQQQQQ
AAAAAASSSSSSMMMMMMMMMMMXXXCCCCCCCCCCYYYYYYYYYYYYYYYYWWWWWWWIIIIIIIIIIIIIIIIFFFFFFFIMMMYYYYYYYYNNNNNNNNNNNNNNIIIIIEEEEEEEEEEEERRRRRRQQQQQQQQQ
AAAAASSSSSSSSMMMMMMMMMXXXXXCCCCCCPCCYYYYYYYYYYYYYYYYWWWWWWWWIPPIIIIIIHHHIHIFFFFFFFIMMMYYYYYYYYNNNNNNNNNNNNNNNNNIEEEEEEEEEEEERRRRRRROQQQQQQQQ
AAASSSSSSSSSMMMMMMMMMXXXXXXCCCCCCPPYYYYYYYYYYYYYYYYWWWWWWWWWIPPIIIIIHHHHHHIFFFFIIXIIMMYYYYYYYYYYNNNNNNNNNNNNNNNNERREEEEEEEEWWRRRRRRQQQQQQQQQ
AAAVSSSSSSSMMMMMMMMMMMXXXXXCCCCCVCYYYYYYYYYYYYYYYYWWWWWWSWWWWPPIIIIHHHHHHHHHFFFIIIIIIIIIYYYYYYYYNNNHNNNNNNNNNNNNRREEEEEEEEEEERUROORQQQQQQQQB
AAAAKKSSSSSSMMMMMMMMMMXXOXCCCCCCCCYYYYYYYYYYYYYYWWWZWWWWWWWPPPPPIPHHHHHHHHHHFFFFIIIIIIIRYYYYYYYNNNNNNNNNNGNNNNRRRRREEEEEEEEEEEUUUUQQQQQQQQQQ
AAAKKKKKSSSSMMMQQQMMMXOOOOCCCCCCCCCYYYYZZYZYYYYYYZZZZWPWPPWPPPPPPPPHHHHHHHHFFFFFFIIIIIIIIYYYYYYYYYNUNNNNNGNNNNNRRREEEEEEEEEENEUUUUQQQQQUQXXX
AAAKKKDDQQQQQQQQQQQQMXOOOOOOOCCCCCSYYOOZZZZZYZYYZZZZZPPPPPPPPPPQQPHHHHHHHHHFFFFFFIIIIIIIIIIYYYYYYNNNNNNWWWNNNNNRRRRREEEEEEEGNNWUUUQQQUUUUUXX
HHHKKDDDDDQQQQQQSSSQSXOOOOOOCCCCCSSSYYOZZZZZZZYYZZZZPPPPPPPPPPQQQVEEEFHHHHHFFFFIIIIIIIIIIIYYYYYYYNYNNNNWWWNNNNNZRRRRREEENNNNNNNUUUUUUUUUUUUX
HHHHHDDDBDQQQQQQSSSSSOOOOOOOOOCCSSSSSZZZZZZZZZZZZZZZPPPPPPPPPPPQQQEEEEBHHHFFFFFFIIIIIIIIIIYYIYIYYYYYYYWWWWWWWNXZZZZZRREENNNNNNNNUUUUUUUUUUUU
HHDDDDDDDDQDQQQQQSSSSOOOOOOOOOOOOOZZZZZZZZZZZZZZZZZZZPPPPPPPPPPQQQQEEEHHHFFFFFFFIIIIIIIIIIIIIYIYYYYYYYYWWWWWWWZZZZZZZRRENNNNNNNNUUUUUUUUUUUU
HHDDDDDDDDDDQQQQSSSOOOOOOOOOOOOOOOTZZZZZZZZZZZZZZZZZZPPPPPPPPPQQQQQEEEEFFFFFFFFFIIIIIIIIIIIIIIIYYYYYYYYYWWWWWZZZZZZZZZCDDNNNNNNNUUUUUUUUUUUU
HHDDDDDDDDDQQQQQSSSSOSOOOOOOOOOOOOOZAZZZZZZZZZZZZZZZZZPPPPPPPPQQQQQQEEEEFFFFFFFFIIIIIIIIIIIIIIIYYYYYKKKKKKKWWZZZZZZZZTCDDDNNNNNNNUUUUUUUUUUU
HHHHKQQQQQDQQQQSSSSSSSSSOOOOOOOOOAOAAAZZZZLZZZLZZZZZZZPWPPWWPWWQQQQQEEEEFFFFFFFFIIIIIIIEWIITTTIYYYYYCCCKKKWWZZZZZZZZZTCCDNNNNNOUUUUUUUUUUUUU
HHHHKQQQQQQQQQQQSUSSSSUSOOOOOOOOOAAAAAZZZLLLLZLLLZZZZZPWWPWWWWWQQQQEEEEEFFFFFFEEECEEIIIEEEEEETTYTGYYYKCCKKWWWZZZZZZZZTCCNNNNNNOOUUUUUUUUUUUZ
HHHKKKQQQQQQQQQQQUSSSUUUOOOOOOUAAAAAAZZZZZLLLLLLLZZZWWWWWWWWWWWQQQQEEEEEEFFFFEEEEEEEEIEEEEEEETTTTGGGTKKKKKWWWWZZZZZZZCCCCCCCNNNUUUUUUUUUUUZZ
HKKKKQQKQQQHHQQQQUUUUUUOOOUOXUUUUAAAAAZZZZLLLLLLLZZWWWWWWWWWWWWWQQQEEEEEEFFFFEEEEEEEEIEEEEEETTTTTGGGTKKQKQQQQWZZZZZZZCCCCCCCNNNNUUUUUUUUUWZZ
KBKKKKQKQQQHHQQQUUUUUUUUUOUUUUUUAAAAAAAAAALLLLLLLZZWWWWWWWWWWWWWQQQEEEEEEFFFFEEEEEEEEEEEEEEEEEETGGGGQQQQQQQQWWWZZZZZFCCCCCCNNNNUUUUUUUUUWWWW
KKKKKKKKKQQHHHHQUUUUUUUUUUUUUUUUUUUUAAAALLLLLLLLLZZJWWWWWWWWMWWFFFFEEEEEEFFEFEEEEEEEEXEEEEEEETTTGTTGGQQQQQQQWWWWZZZZCCCCCCCNNNNUUUUUUUCUWWWW
KKKKKKKKQQKHHHHQQUUUUUUUUUUUUUUUUUUAAAAALLLLLLLLLLJJWLLWWWWWWWWFFFFEEVVVEEEEEEEEEEEEEEEEEEEEETTTTTTTGZQQQQQVQWWWWWECCCCCCCXXNNNXXUUUUUCUCWWW
KKKKKKKKKKKHHHHHHUUUUCCUUUUUUUUUUUUAAAAAAUUUULLLLLLJJWWWWWWWFFFFFFFVVVVEEEEEEEEEEEEEEEEEETTETTTTTTTTQQQQQQQQQXWWWCCCCCCCCXXXXXXXXUUUUUCCCCWW
KKKKKKKKKKKKHHHHHHUUUUCCCUUUUUUUUUUUAAAAAUUULLLLLLLLLCWWWWWCCCCCFFVVVVVVEVEEEEEEEEEEEEEEETTTTTTTQQQQQQQQQQQQQQQWWCCCCCCCCCXXXXXXXXUUUUTTTWWW
KKKKKKKKKKKKHHHHHHHHCCCCCCUUUUUUUUUUAAAAUUUUUUULLLLCCCCCCCCCCCCZZZVVVVVVVVVEEEEBEEEEEEEEEEETTTTTQQQQQQQQQQQQQQZWWZZCCCCCCCCCXXXXUUUUUTTTTWWT
KKKKKKKKKKKKHHHHHHHCCCCCCUUUUUUUUUTTTTAUUUUUUUULUULCCCCCCCCCCCCZZZVVVVVVVVVEEEEBBEEEEEEEEEEETTTTQQQQQQQQQQQQQQZWZZZZCCCCCCCVVVXUUUUUTTTTTTTT
KKKKKKKKKKKHHHHHHHHCCCCCCUUUUUTUTUTTTTTUUUUUUUUUUUQQQCCCCCCCCCZZZZVZVVVVVVVVVVEBBBEEEEEEEEETTXXQQQQQQQQQQQQQQZZZZZZZZZCCCCCVVVVUUUUUUTTTTTTT
KKKKKKKKKKKHHHHHHHHCCCCUUUUUTTTTTTTTTTTTTUUUUUUUUQQQQCCCCCCCCCZZZZZZVVVVVVVVVVVBBBBBBEEEEETTTXXXXXXQQQQQQQQQZZZZZZZZZZZCCVVVVVVVVUUUUTTTTTTT
KKKKKKKKGKHHHHHHHHHHZZCUUUUUTTTTTTTTTTTTUUUUUUUUQQQQQCCCOOOOOCZZZZZZVVVVVVVVVBBBBBBBBEEEEETXXXXXXXXQQQQQQQQQQZZZZZZZZDDDCVVVVVVVVVUUUTTTTTTT
KKKKKKKKKHHHHHHHHHCCCCCCUUUUTTTTTTTTTTTTUUUUUUUUQQQCCCCCOOOOOZZZZZZZZVVVVBVVVVBBBBBBBNENEETTXXXXXXQQQQQQQQQQZZZZZZZDZDDDDVVVVVVVUUUUUUUUTTTT
KKKKKKKKHHHHHHHHHHHBCCCBBBBUBTTTTTTTTTTTTUUUUUUUQQQQQCCCOOOOOZOOOOOOOZEEVVTBBBBBBBBBNNNNNTTTXXXXXXQQQQQQQQQQNZZQZZZDDDDDDVVVVVPVUUUUUUUTTTTT
KKKKKKEEHHHHHHHHHHBBBBBBBBBBBTTTTTTTTTTTUUUUUUUUQQQCCCCCOOOOOOOOOOOOOZEEUUBBBBBBBBBBNNNNTTTTTXXXXCQQQQKKQQQQZZZQZZZDDDDDDVVVVVPUUUUUUUUTTTTT
PPKKKKEEHHHHHHHHHHBIIBBBBBBBBTTTTTTTTTUTUUUUUUUUOOOOOOOOOOOOOOOOOOOOOOOEUBBBBBBBBBBBBNNTMTTTTXXXCCCCKGKKKKKKZZZZZZDDDDDDJVGGPPPPPPUUUUUUTTTT
HPPKEEEEHHHHHHHHIIBIIIIIBBBBBBTTTTTTTUUUUUUUUUUUOOOOOOOOOOOOOOOOOOOOOOOEBBBBBBBBBBBBBCCTTTTTTCCCCCCKKKKKKKKZHHHZZZDDDDDDPGGGPPPPPPUUUUUTTTTT
HPEEEEEEEHHHHHHHIIIIIIIIIBBBBBTTTTTUUBBBBUUUUUUUOOOOOOOOOOOOOOOOOOOOOOOYYBBBBBBBBBBBBBCTCCCCCCCCCCCKKKKKKKKKHHHZZZDDDOOPPPPPPPPPPPUUUTTTTTTT
SSSEEEEEEHHHHHHHIIIIIIIIBBBBBBTTTTTUUUBBBUUUUUUUOOOOOOOOOOOOOOOOOOOOOOODDBBBBBBBBBVVBCCCCCCCCCCCCCCKHHHHKKKZHHHZZEOOOOOOOPPPPPPPPUUUUTTTTTTT
SSSEEEEEEEEHHIIIIIIIIIIIIIIIIBBBTBTUBUBBBUUUUUUUOOOOOOOOOOOOONNZZZOOOOODQBBBBBBBBBVVKVVVVCCCCCCCCCCCHHHHKKKKHHHTZZOOOOOOOMMMPBPPPUAAATTTTTTT
SSSSSSSEEEEEIIIIIIIIIIIIIIIIBBBBBBBBBBBBBHHHHHHHOOOOOOOOOOCNNNNNZZOOOOODDDBBBBBBBVVVVVVVVCCCCCCCCCCKHHHHKKKKHHHHHHHHHHHOMMMPPPPAPQQQQTTTTTTT
SSSOSSSSEEEIIIIIIIIIIIIIIISIBSSBBBBBBBBSSSHHHHHHOOOOOOOOOOCNNNNNNNZVDDDDDDDABBBBBAVVVVVVCCCCCCCCCCCCHHHHKKKKHHHHHHHHHHHMMMMMPPAAPQQQZZZZZZZZ
SSSSSSVVEEEIIIIIIIDIIIIIISSSSSSSBBBBBBBBHHHHHHHHOOOOOOOOOONNNNNNNNZVVDDDDDDABBBBBBUUVVVVVVCCCCCCCCCKHHHHKKKHHHHHHHHHHHHMMMMMPAAAAQQQZZZZZZZZ
SSSSESEEEEEEIIIIDDDIIICICCSSSSSMMSBBBSFHHHHHHHHHOOOOOOOOOONNNNVVVVVVDDDDDDDDBBBBBBUUVVVVVVCCCCCCCCCKHHHHKKKHHHHHHHHHHHHMMMMMAAAAAQQQZZZZZZZZ
SSSEEEEEEEMMIDDDDDDDDDCCCSSSSSSSSSSSSSFHHHHHHHHHOOOOOOOOOOKKVVVVVVVVVDDTTTTYBBUUUUUUVVVVVVCVCCCCKKKKHHHHKKKHHHHHHHHHMMMDDDDAAAAAAQQQZZZZZZZZ
SSEEEEEEEMMDDDDDDDDDDDCCCSSSSSSSSSSSSSSHHHHHHHHHHHHHHHDDEEKVVVVVVVVVVDTTTTTYYBUUUUUUUVVVVVVVVCCKKKKKHHHHKKKHHHHHHHHHMMMDDDDDDAAAAQZZZZZZZZZZ
SSEEEEEEEEMDDDDDDDDDDDDDDSSSSSSSSSSSSSHHHHHHHBHHHHHHHHFEEEKVVVVVVVVVDDKKTTTYEUUUUUEEEEVEEEVCCCCCCKKRHHHHHHHHHHHHHHHHDDDDDDDDDDDAAZZZZZZZZZZZ
EEEEEEEEEEMDDDDDDDDDDDDDSSSSSSSSSSSSSSSSHHHHHHHHHHHHHHWWWWWWWVVVVVVVVKKTTTPEEEEUEEEEEEEEECCCCCCCCCCCHHHHHHHHHHTTTTBDZDDDDDDDDDRAAZZZZZZZZZZZ
CCEEEEZEEMMMMMMDDDDDDDDRSSSSSSSSSSSSSSSSSRHHHHHHHHHHFFWWWWWWWVVVVVVVVVKKTTEEEEEEEEEEEEEEEVCDDCCCCCCCRRHHHHHHHHTTTTTDDDDDDDDDDRRAAZZZZZZZZZZZ
CCECCEZZMMMMCMDDDDDDDDDRRRWSSSSSSSSPSSDSDDHHHHHHHHHHQQWWWWWWWWWWVVVVPTTTTTEEEEEEEEEEEEEEEVVDDCCCCCCCCRHHHHHHHHTTTTDDDDDDDDDZZZZZZZZZZZZZZZWW
CCCCCCMMMMCCCDDDDDDDDDJJJWWWWSSSSSSSSSDDDDHHHIIHHHHHQFWWWWWWWWWWVVVVVVTTTTTEEEEEEEEEEEEUEDDDDDDCCCCMXXHHHHHHHHTTTTDDDDDDDDDZZZZZZZZZZZZZZZWW
CCCCCCMMMMZCCDDDDDDDDUJJJWWWWSSSSSSSSDDDDHHHYDIIHIFFFFWWWWWWWWWWVVVVMTTTTTTTEEEEEEEEEEEEEDDDDCCCCCXXXXHHHHHHHHTTTTTDDDDDDDDZZZZZZZZZZZZKKWWW
CCZZZZDDDDZCCDDDDDDDDDJJJWXWWWSSSSSSSDDDDDHDDDIIIIIFCFWWWWWWWWWWVVVVMTTTTTTTEEEEEEEEEEEEZDDDDCCCXXXXXXHHHHHHHHTTTTTDDDDDDDDZZZZZZZZZZZZKKKWW
ZZZZZZZDDZZCDDDDDDDDDUJJJWWWWLSSSSSHDDDDDDDDDDDDIIFFFFWWWWWWWVVVVVVVVTTTTTTTTEEEEEEEEEEEZDDDDDXXXXXXXXHHHHHHHHTTTTTTDDDDDDDZZZZZZZZZZZZKKKKK
ZZZZZZZZZZZCDDDDDDDPMMJJJWOOLLBLSSSSDDDDDDDDDDDDDFFFFFWWWWWWWVVVVVVVHHTHTTTTTEEEEEEEEEEDDDDLLLLXXXXXXXXXXXXZXXTTTTTDDDDDDDDZZZZZZZZZZZZKKKKK
ZZZZZZZZZZZBBDDDDDDMMMJJJHLLLLLLLLSDDDDDDDDDDDDDDFFFFFFLWWWWAVVVVVAAAHHHHTTTTEEEEEEEEELDDDDLLLLLXXXXXXXXXXXXXTTTTTTTDDDDDDDZZZZZZZZZZZZKKKKK
ZZZZZZZZZZRRRDDDDDCMMMMMMLLLLLLLLLLDDDDDDDDDDDDDDFQFIFLLWWWWAVAVAAAAAHHHHHTTTEEEEEEEEELLLLLLLLLLLXXXXXXXNXXXXTTTTTTTDDDDDDDZZZZZZZZKKKKKKKKK
ZZZZZZZZZZZRRRRDDDCMMMMMMLLLLLLLLLLLDDDDDDDDDDDDCCCQAAAAWWWWWWWWAAAAAAAAHTTTTTEEEEEEEELLLLLLLLLLXXXXXXXXNXXXTTTTTTTTDTDDDDQQQZZZZZZKKKKKKKKM
JJJJJZZZZZRRRRRRMMMMMMMMMMELLLLLLLLLLLDDDDDDDDWWWWWWWWAAAWWWWWWWAAAAAAAAHHHHCTCEEGEEEEOLLLLLLLLLXXXXXXXXXTTTTTTTTTTTTTTQQQQQQZZZZZZKKKKKKKKM
JJJJJZZJZZRRRRRRMMMMMMMAAEELLLLLLLLLLDDDDDDDDDWWWWWWWWAAAWWWWWWWAAOAAAAAHHHHCCCGGGGGEEOLLLLLLLLLLLXXXXFXXAKTTATTTTTTTTTQQQQQQZZZZZZKMKKKMKKM
JJJJJJJJVRRRRRRMMMMMMMMMAALLLLLLLLLLLLLDDDDFCCWWWWWWWWAAAWWWWWWWAOOOOAAOHHHHCCCGCGCCCCCLLLLLLLLLLLXXXXXXAAAAAAAAAATTTTTTQQQQQQQQMKMMMMMKMMMM
XJJJJJJVVVRRRRRRMMMMMMMMAALLLLLLLLLLLLLDDDCCCCWWWWWWWWWWWWWWWWWWOOOOOOOOHHHHCCCCCCCCCCLLLLLLLLLLLLAAXXXXAAAAAAACAATTTTTQQQQQQQQQMMMMMMMMMMMM
XXXXJJVVVVRRRRRMMMMMMMAMAAALLLLLLLLLLLLWDDDCCCWWWWWWWWWWWWWWWWWWOOOOOOOHHCHHCCCCCCCCCCCLLLLLLLLAAAAAAAAAAAAAAAAAAATTTTTQQQQQQMQMMMMMMMMMMMMM
XXXJJVVVVVVVRRRMMMMMMMAAAAAAAALLLSLLLLWWDDRCCCWWWWWWWWWWWWWWWWWWOOOOOOOHHCCCCCCCCCCCCCCCLLLLLLLAAAAAAAAAAAAAAAAAAATTTTTQQQQQQMMMMMMMMMMMMMMM
XXXXXVVVVVVVVVVVRVVMMAAAAAAAALLLLSLLLLLLLQCCCCWWWWWWWWWWWWWWWWWWOOOOOGOOCCCCCCCCCCCCCMMLLLLLLAAAAAAAAAAAAAAAAAAAAAAAATVQQQQQMMMMMMMMMMMMMMMM
XXXXXVVVVVVVVVVVVVVMAAAAAAAAAASSLSLLLLLLQQXCCCWWWWWWWWWWWWWWWWWWOOOOOOOOOOCCCCCCCCCCCCLLLLLLGAAAAAAAAAAAAAAAAAAAAAAAAVVVQQVMMVVMMMMMMMMMYYMM
XXXXXVVVVVVVVVVVVVVMAAAAAAAAAAASSSFFFFLLQQQQHCWWWWWWWWWWWWWWWWWWFFFFFFFFOOOCCCCCCCCCCCXLLXXXAAAAAAAAAAAAAAAAAAAAAAAAAVVVQVVVVVVMMMMMMMMMYYYM
XXXXXXXVVVVVVVVVVVVVOOAAAAAAASSSSSFFNNLSQQQQQCWWWWWWWWWWWWWWWWWWFFFFFFFFOOVCCCCCCCCCCXXXXXXXXAAAAAAAAAAAAAAAAAAAAVVACIVVQVVVVVVVVMMVMWWYYYYM
XXXXXXXVVVVVVVVVVVVOOOAAAAAAASSSSSSFNNNNNQQQQQQQQQQWWWWWWWWWWWWWFFFFFFFFOOVCCCCCCCCCCXXXLLXXXAAAAAAAAAAAAAAAAAADCVCCCVVVVVVVVVVVVVVVMWWWYMMM
XXXXXXVVVVVVVVVVVVVVOOAAAAAASSSSSSSSNNNNLLQQQQQQQQQQQQFFFWWWWWWWFFFFFFFFVOVCCCCCCCCXXXXLLLLXXAAAAAAAAAAAAAAAADDDCCCCVVVVVVVVVVVVVVVVVWWWWMMM
XXXXXXVVVVVNNVZVXXXXXXRRRAAAISSSSSSSSNNNNNQHNQQQQQQQQQQQQQQFFAFFFFFFFFFFVVVVCCCCCCCXXXXLLLLLLLKKAAAAAAXAAAAAADDDCCCCVVVVVVVVVVVVVVVVEEWWWWMM
XXXXXXTTVVVVVTXXXXXXXXXXRRRASSSSSSSSSSNNNNNNNQQQQQQQQQQQQQQQQQFFFFFFFFFFVVVVCVCCCCXXJJJLLLLFWKKWWWAAAXXXAAAADDCCCCCCCCVCVVVVVVVVVVVVEWWWWWWM
XXXXXXTTTTTTTTXXXXXXXXXRRRRRRRSSSSNNNNNNNUNNNNQQQQQQQQQQQQQQQHFFFFFFFFFFVVVVVVVVCCCXJJJJJLLFWWWWWWAAXXXXXXAAADCCCCCCCCCCVVVVVVVVVVVVEXWWWWWW
XXXXXTTTTTTTTTXXXXXXXXXRRRRRRRSSSSNNNNNNNNNNNJQQQQQQQQQQQQQQHHFFFFFFFFFFFFFFTVTVVCJJJJJJJJJFWWWWWAAJXXXXXXXACCCCCCCCCCCVVVVVVVVVVVVVVXXWWWWW
YXXXTTTTTTTTTTTXXXXXWXRRRRRRRSSSNSNNNNNNNNNNNJJJQQQQQQQQZQQQQQFFFFFFFFFFFFFFTTTTVVVJVJJJJJJWWWWWWWAWXXXXXXXUUUCCCCCCCCCVUVVVVVVVVVVXXXWWWWWW
YXXXTTTTTTTPTTTXXXXXXRRRRRRRRRNNNNNNNNNNNNNVVVJVVVQQQQQQQQQQVQFFFFFFFFFFFFFFTTTTVVVVVVJJJJJJWWWWWWWWWXXXXXUUUUUCCCCCCCCVVVVVVGVOVXXXXXXXWWWW
YXTTTTPPPTPPPPXXXXXXXRRRRRRRRRRNNNNNNNQNNNYVVVJVVVVVQQQQQQQQQQHHWWWWWBFFFFFFTTTTVBBBVJJJJPJWWWWWWWWWWXXXXXXXUUUWCCCCCCCCVCCVGGVOXXXXXXXXWWWW
YTTTTTPPPPPPPPNXUXXXXRRRRRRRRRRNNNNQQQQNNVVVVVVVVVQQQQQQQQQQQQHWWFFFFFFFFFFFTTTBVVBBBOOJJJWWWWWWWWWXXXXXXXXHUUWWWCCCCCCCCCCCGGVOXXXXXXXXXGGG
YTTTTTPPPPPPPPPXUUXXXPRRRRRRRRRNNNNQQQQQVVVVVVVVVVQQQQQQQQQQQQHRRFFFFFFFFFFFBBBBBBBBOOWWWWWWWWWWWWWWWWWXXXXXUUWPBCCCCCCCCCCCGGGVXVXXXXXGGGGG
TTTTTTPPPPPPPPPXUUXXXPPPPRRRRRRQQFNNQQQQQVVVVVVVVVQQQQQQQQQQQQQQWFFFFFFFFFGGBBBBBBBOOOOWWWWWWWWWWWWWWWWWXXXPPPPPBCCCCCCCCCCCGGVVVVXXXXXGGGGG
MTTTTTTPPPPPPUUUUUPXPPPPPRRRRRRQQQQQQQQQQQVVVVVVVDQQQQQQQQQQQQQAAFFFFFFFFFGGGBBBBBBWWWWWWWWWWWWWWWWWWWWWTTTBBPPBBBCCCCCLCCCCGVVVVUXXXGGGGGGG
MMTTTTTPYPPPPUUUUUPPPPPPPPRRRRQQQQQQQQQQQQVVVVVDDDQRQQGPPAAAAAQAAFFFFFFFFFBGBBBBBBWWWWWWWWWWWWWWWWWWWWWWTTUUBBBBBBCCCBBBCCCCCVVVUUGGGGGGGGGG
MTTTTTTPYPPPPUUUUPPPPPPPPPPPRRQQQQQQQQQQQQQVJVVPPPRRQGGPPAAAAQQAAFFFFFFFFFBBBBBEUBBWWWWWWWWWWWWWWUUUWWUTTTUJBBBBBBBBBBBBBBDCVVVUUUUUUGUUUQQG
MTTTTTTPPPPPUUUUPPPPOOPRPPRRRRRQQQQQQQQQQQQQQQPPPPRRQQGPPPPPAAAAAAAAAAAAABBBBEEEUBWWWWWWWWWWWEWEWUUUWUUUUTUUUUBBBBBBBBBBBBBIVVVVUUUUUUUUUQQQ
RRRTTTPPPPPPPUUUUUPPPOPRRRRRRRJQQQQQQQQQQQQQPPPPPPRRRGGGPPPAAAAAAAAAAAAAAEBBCEEEUEEEFWWRRRWRREEEEBUUUUUUUUUUUUBBBBBBBBBBBBBBVVVUUUUUUUUUEQQS
ZZRTZZPPPZZZUUUZUUPOOORRRRJRRJJQQQUQQQQQQQQQQQPPPPPPPPGGPPPAPAAAAAAAWAXAAAAAAEEEEEEUBWWWWRRRREEEEBUUUUUUUUUPUUBBBBBBBBBBBBBBVVVUUUUUUUUUUQQS
ZZRTZPPPZZMZUUZZZZPEORRRRRJJRJJQQQUUQQQQQXQQQQPPXXXXPPPPPPPPPPAAAAAAWAAAAAAAAAEEEEEEBWWRRRRREEEEUUUUUUUUUUUUUUUBBBBBBBBBBBBBVVVUUYUUUUUUUQQQ
ZZZZZZZZZZZUUZZZZZEEEERJJJJJJJJJUUUUUQQXXXXQQQXXXXXXPPPPPPPPPPPPAAAAAAAAAAAAAAAEEEEEBBBBRRREEEEEUUUUUUUUUUUUUUUUBBBBBBBBBBBBVVVVUUUUUUUYYQQQ
ZZZZZZZZZZZZZZZZZZEZGEJJJJJJJJJJUJUUUUEXXXXXXXXXXXXXPXPPPPPPPAPAAAAAAAAAAAAAAAEEEEEEBBBEEEREEEEEUEUUUUUUUUUUUUUUBBBBBBBBBBBBVVUUUUUUUUUUYQQQ
ZZZZZZZZZZZZZZZZZZZZJJJJJJJJJJJJJJEUUUEEXXDDDDXXXXXXXXPPPPPPPAAAAAAAAAAAAAAAEEEEEEEEBBBEEEEEEEEEEEUUUUUUUUUUUUMUBBBBBBBBBBBBVVVVUUUUUUUUYQQQ
TZZZZZZZZZZBBBZZAAAAJJJJJJJJJJJJJEEEEEEXXDDDDDDDDXXTXTTPPPPPPPAAAAAAAAAAAAAAAEEEEEEEEBBBEEEEEEEEEEUUUUUUUUUUUUMBBBBBBBBBBBBBVVVVVUUUUUUUQQQQ
TZZZZZZZZZMMBBBZZAAALJJJJJJJJJJJJEEEEEEDXDDDDDDBBTTTTTBPPPPEPEEEAAAASAAAAAAAAEEEEEEEEBBEEEEEEEEEUUUUUUUUUUUUUUUBBBBBBBBBBBBBVVVVUUUUPUUZZZZZ
TTTZZZZZZZZBBZZZZAAAJJJJJJJJJJJJLLEEEEEDDDDDDDDBBBBTTCBCPPPEEEEEAASSSSQQAAAAAEEEEQEBBBBBBEEEEEEEUUUUUUUUUUUUUUUBBBBBBBBBBBBBZVWUUUUUUZZZZZZZ
TTTTZZZBBBLBBZZZAAAAAADJJJJJHHJJLEEEEEEDDDDDDDDDBBBBBCBCPPEEEEEEESSSSSSSGAAAAEEEEBBBBBBBBBBEEEEEUUUUUUUUUUUUSBBBBBBBBBBBBBBBUVUUUUUZZZZZRRZZ
TTBZZDBBBBBBBBBZDAAAADAJRRJJHHHHLHOHEDDDDDDDDDDBBBBBBCCCPPPEEEEEESSQSSSAAAAAWEEOBBBBBBBBBBBEEEEEUUUUUUUUUUUUSBBBBBBBBBBBBTTTUUUUUUUUZZZZZRZZ
TTBBBBBBBBBBBBWAAAAAAAAARRRHHHHHHHHHFDDDDDDHHDHHBBBBBCCYEEEEEEEEESSSHHHHAAAAWAOOBBBBBBBBBBEEEEEEUUUUUUUUUUUUSBBBBBBBBBBBTTTTUUUUUUUCUZUUURUZ
TTBBBBBBBBBBBBWAAAAAAAAARHHHHHHHHHHHFHDDDDHHHHHHHHHCCCCYEEEEEEEEEHSSHHHAAAHAAABBBBBBBBBBBEEEOOEEEEEQUUUUUUULSBBBBBBBBBBBTTTTTUUUUUUUUUBURRUU
TTTTBBBBBBBBBBBBOAAAAAAAAHHHHHHHHQQHHHHHHHHHHHHHHHHCCCCCCCCEEEEEHHHHHHHHAAHHHYBBBBBBBBBBXXXEXOEEEEEQUUUUUUUBBBBBBBBBBBBBTTTTTUUUUUUUUUUUUUUU
TTTBBBBBBBBBBBBBBAAAAAAAAHHHHHHHHHQHHHHHHHHHHHHHHHHICCCCCHHEHHEEHHHHHHHHHAVVVVVVVVVBBBBBBXXXXXXEEVVHHHHLLLLBBBBBTTTTTTTTTTTUUUUUUUUUUUUUUUUU
TQHHBBBBBBBBBBBBBAAAAAAAAHHHHHHHHHHHHHHHHHHHHHHHBBVCCCCCCHHHHHHHHHHHIHHHHHVVVVVVVVVBBBBBXXXXXXXXVVHHHHHLLLLBBBBBTTTTTTTTTTTTUUUUUUUUUUUUUUUU
TQQHBBBBBBBBBBBBBAAAAAAAAHHHHHHHHHHHHHHHHHHHHHHHBCCCCCCCCCHHHHHHHHHHHHHHHHVVVVVVVVVBBBBBXXXXXXXXVVHHHHLLLLLBBBBBTTTTTTTTTTTTTTUUUUUUUUUUUUUU
QQQHHBBBBBBBBBBBVAAAAAHAAAHHHHHHHHHHHHHHHHHHHHHHBCCCCCCCCEEHHHHHHHHHHHHVVVVVVVVVVVVBBBBXXXXXXXXXVVVHELLLLLLBBBBBTTTTTTTTTTTTTTUUUUUUUUUUUUUU
QQQHHBBHBBBBBBBBVAAAYAHHHHHHHHHHHHHHHHHHHHHHHHHBBBCCCCCCCEEEEEEHHHHHHHHVVVVVVVVVVVVBBBBXXXXXXXXHVHHHHLLLLLLBBBBBBBTTCCCCTTTTTTTVVUUUUVUUUUEE
QQHHHHHHBHBBBBBBBKAOYAHHHHHHHHHHHHHTHHHHHHHHHSBBBBCCCBCCEEEEEEEHHHHHHHHVVVVVVVVVVVVBBVYXXXXXXXHHHCHHHLLLLLLLLBBBBBTTCCCCTTTTTTTTVVVVVVEUUEEE
QQHHHHHHHHBBBBBKKKOOYAHHHHHHHHIIIIHHHHHHHHHHHSBBBBVCAECCEEEEEDDDDHHHHHHVVVVVVVVVVVVBBYYXXYXXXXXHHHHHHHHLLLLLLBBBBBCCCCCCTTTTTTTTVVVVVVEEEEEE
QQHKKHHHHHHIBBKKKKOOYYHHHHHHHHIIIIHHHHHHHHHHHLBBBBBXEEEEEEEDDDDDHHHHHHHVVVVVVVVVVVVHYYYYYYXXXXHHHHHHHHHHHLLCCBBBBBCCCCCCCCCCCCCCCCVVTVVVVVEE
QQQHKHHHHHHHKKKKKOOOYYHHHHHHIIIIIICCCCCHHHHHLLBBBBTEEEEEEEEDDDDDHHHHHHHVVVVVVVVVVVVHYYYYYYYHHHHHHHHHHHYYLLLNCBBBBBCCCCCCCCCCCCCCCCVVVVVVVVEV
QQQHHHHHHHHHKKKKOOOOOHHIIIIIIIIIIIICCCCCCCLLLLLLLBTTELEEEEEDDDDDHDDHHHHVVVVVVVVVVVVRYYYYYYYHHHHHHHHHHHYYLLCCCBBBBBCCCCCCCCNNNNCCCCVVVVVVVVEV
QQQHHHHHHHHKKKKKKKKOOOOEIIIIIIIIIIITTCCCCLLLLLLLLLLTTEEEEDDDDDDDDDDHHHHHHHHHRVVVRRRRYYYYYYHHHHHHHHHHYYYYYYCCCBBBBBCCCCCCCCNNNNCCCCVVVVVVVVVV
QQHHHHHHHHHHHKKKKKOOOOEEIIIIIIIIIIITTTTTCCLLLLLLLLTTTTTTEDDDDDDDDDDHHHHBBBBRRVVVRRRRRYYYYYHYHHHHHHHHHHYYYYCCCCCCCCCCCCCCCCNNNNCCCCRVVVVVVVVV
QQQHHHHHHHHKKKKKKKOOOOIIIIIIIIIIIITTTTTCCCLLLLLLPLTTTTTTDDDDDDDDDDDDDBBBBBBBRVVVRRRRYYYYYYYYHHHHHHHHHHHYYYYCCCCCCCCCCCCCCCNNNNCCCCRRVRVVVVVV
QQQHHHHHHHKKKKKKKKOOOOVIIIIIIIIIIITTTCTCTLLLTTLLLLTTTTTTDDDDDDDDDDDDDBBBBBBBRVVVRXXYYYYYYYYYYYHHHHHHHHYYYYYCCCCCCCCCCCCCCCNNNNCCCCRRRRVVVVVV
QQQQQHHHHHKKFFKKKFOOFFFFIIIIIIIIIITTTCCCTLTTTTLLTTTTTTTTTTTDDDDDDNNDBBBBBBBBRVVVVVVYYYYYUUUUYYYYHHYYYYYYYYYYCZCCCCCCCCCCCCNNNNCCCCYYRRVVVVVV
QQQQQQHKHKKKFFFFFFXFFFFNDDIIIIIIIITTTCCCTTTTTTTTTTTTTQQTTTTDDDDDDNMMBBBBBBBBBVVVVVVVVVYYYUUUUYYYHYYYYYYYYYCYCCCCCCCYYCCCCCCCCCCCCCRRRRVVVVVV
QQQQQQQKKKKFFFFFFFFFFFFFFDDIIIIIITTTTTCCTTTTTTTTTTTTTQQTTTTDDMDMDDMMBTBTTTBTBVVVVVVVVVYYUUUUUYYYYYYYYYYYYCCCCJCCCCCYYYYHDDDDCCCCCCRRRRRVVVVV
QQQQQQQKKKFFFFFFFFFFFFFUFDDIIIIQQQTTTTCTTTTTTTTTTTTQQQTTTTQQMMMMMMMMMTBBTTBTTBVVVVVVVVYWUUUUUYYYYPYYYYYYCCCCCCCCCCCCYHHHHDDRRRRRRRRRRVVVVVVV
QQQQQQQQKQQQFFFFFFFFFFFFFDDIIIIQTTTDTDDTTTTTTTTTTTTQQQQQQQQMMMMMMMMTTTTTTTTTTBXVVVVVVVWWUUUUTPPPPPPPPPYCCCKCCCCCCCCCCCHHCRRRRRRRRRRRDVVVVVVV
QQQQQQQQQQQFFFFFFFFFFFFFFDDDIIIQQQTDDDDWTTTTTTTTTTTTQQQQQQQQMMMMMMMTTTTTTTTTVTXVVVVVVVWWUUUUUPPPPPZPPYYCCKKCCCCCCCCCCCCHCRRRRRRRRRRRRVVVVVZV
QQQQQQQQQRFFFFFFFFFFFFFFDDDIIIQQQQTDDWWWTUTTTTTVVVTTQQQQQQQQMMMMMMMTTTTTTTTTTTXXVVVVVVWWWWWUWWWPPPPPPPPKKKKKCCCCCCCCCCCCCURRRRRRRRRRRRVVVZZZ
QQQQQPQQOFFFFFFFFFFFFFDDDDDDNQNQQQDDDWWWWUTTTTVVVVVQQQQQQQMMMMMMMTTTTTTTTTTTTRXXXXWWWWWWWWWWWWPPPPPPPPKKKKKKCCCCCCCCCCCCCCRRRRRRRRRRRIZZZZII
QQQPPPQQOPFFFFFFFFFFEEDDDDDDNNNNQQQQQWWWWUUTTTZVVVVVQQQQQQMMMMMMMMTKTTTTTTTTXXXXXXLWWWWWWWWWWWPPPPPPPPKKKKKCCCCCCCCCCCCCCXXRRRRRRRRRRIIIZIII
QQQQPPPPPPFFFFFFFFFEEEEEEDDDDNNQQQQQQWWWUUUTTVVVVVVRRGQQQMMMMMMMMMMKTTWTTTTTCXXXXXWWWWWWWWWWWPPPPPPPPKKKKKCCCNNCCCCCCCCCCCRRVRRRRRRHHIIIIIII
QQQPPPPPPPFFFFFFFFEEEEEEEDDNNNNQQQQQWWWWWWUTUUVVVVVRRRRMMMMMMMMMMMMTTTWTTTTTTTXXXXWWWWWWWWWWPPPPPPPPKKKKKKCCCCCCCCCCCCCCCKKMMMRRRRRIIIIIIIII
QQQPPPPPPPWFFFFFFFFFEEEEEDDDNNNQQQWWWWWWWUUUUUUVVVVRRRRMXMMMMMMMMMMMWWWWWTTTTTXXXWWWWWWWWWWWWWPPPPPPKKKKKCCCCCCDCCCCCCKCCKMMMMRRRMRRIIIIIIII
MMMPPPPPPPPHHHFFFFFFEEEGEDDDNNNNQQWYWWWWUUUUUUUVVVVRRRRRMMMMMMMMMMMMMWWWTTTTTTXDTTWWWWWWWWWWWWWWWKKKKKKKKCCCCCCCCCCCCCCCKKKMMMMMMMMMIMMMIIII
MMPPPPPPPPPHHHHFFFFEEEEEEDDDNNNQQQQWWWWWUDDDUUVVFFVRRRRRMMMMMMMMMMMMMWWWWTTTTTTTTTTWWWWWWWWWWWWAWAAKAAKKCCCCCCCCCCCCCCCKKKKMKKMMMMMMMMMMMIII
MMMMPPPPPPPPHHHEEELLEEEEDDDDNNNQJJQQQWWWDDDDUUVVEEERRRRRRMMMMMMMMMMMMWWWWWITVVTTTRRRRWWWWWWWWWWAAAAKAKKKKCCCCCCCCCCCCKKKKKKKKKMMMMMMMMMMEFII
MMMMMPPPPPEEHHEEEEEEMDEDDDDDDJJJJJQQWWWWDDDDDUVGEEERRRRRMMMMMMMMMMMMMWWWWWWTWWRRRRRRWWWWWWWWWWWAAAAAAKAKCCCCCCCCCCCCCKKKKKKKKMMMMWMMMMMMMFIF
MMMMMMMPPPPEEHEEEEEEDDDDDDOJJJJJJJQWWWWTDTTDDDTEEEERRRWWMMMMMMMMMWWMWWWWWWWWWWRRRRRWWWWWWWNWWWWWAAAAAAAACCCCCCCCCCCCKKKKKKKKKMMMMWWWMMPPFFFF
KMMMMMMPPPEEEEEEEEEEEEEEDDDJJJJJJJJTTWTTTTTTTTTEEEEERRWWWWWWWWMWWWWWWWWWWWWWYYYRRRRWWWNNNNNNWWWWAAAAAAACCCCCCCCCCCCDDDDDKKKKKKMWMWWWMFFFFFFF
KKMMMMPPPPEEEEEEEEEEEEEESDSJJJJJJJJJTTTTTTTTTTTEEEEEBBWWWWWNNWWWWWWWWWWUUWWYYYYYRRRXXXNNNNNNAAAAAAAAARURCCCCCCCCDQDDDDDDDKKKKKWWWWWWTFFFFFFF
KKWWMWWPPPPLLEEEEEEEEEEESSSJJJJJJJJJTTTTTTTTTTTEEEEEEEANNSNNNWWWWWWWWWWWUIIYYYWYYRYEXXNNNNAAAAAAAARRRRRRCCCCCCCDDDDDDDDDDKKKKWWWWWWWTFFFFFFF
KKWWWWWPPPPLLLEEEEEEEEEESSSJJJJJJJJJJTTTXXXTTXXEEEEEECNNNNNNNNNWWWWWWWWUUIIYYYYYYYYXXXXXNNAAAAAAAAAARRRRCCCCCCDDKDMDDDDDDKKKKWDWWWWQFFFFFFFF
KKKWWWWPPPPLLLEEEEEEEEEESSSJJJJJJJJJJTJJXWWXTXXEEEEEECCNNNNNNNNNWWWWWWUUUUUYYYYYYYXXXXNNNNNAAAAAAAAARRRRRRCCCCKKKDDDDDDDDDKKWWWWWWWWFFFFFFFF
KKKKWKWLLLLLLLEEEEEEEEEESJJJJJJJJJJJJJJWXXWXXXXCEXWWNNNNNNNNNNNNNUUUWUUUUUUUYYYYYYYXXXNNNNAAAAAAAAAAARRRRRRCCKKKKDDDDDDDDKKKWWWWWWWWWWFFFFFF
KKKKKKKCLLLLLLEEEEAEEEEEEJJJJJJJJJJJJJJXXXXXXXXXDXXNNNNNNNNNNNNUUUUUUUUUUYYYYYYYYYYXXNNNNAAAAAAAAAIARRRRRNCCCKKKDDDDDDDDDFFFWWWWWWWWWFFFFFFF
KKKKKCCCLLLLLLEEEEEFEEEENJJJJJJJJJJJJJJXXXXXXXXXDXGGTTNNNNNNNNUUUUUUUUUUUUYYYYYYYYYYYNNNNNIIAAAAAAIAIRRRRNKCKKKKDDDDDDDDDDDFWWWWWWWWWFFFFFFF
KKKKKKKCLLLLLLEEEFFFEEEEJJJJJJJJJJJJJJXXXXXXXXXXXXGTTTTNNNNNNUUUUUUUUUUUUYYYYYYYYYYYKYNNNNNIIIAIIIIIIIRRRNKKKKKDDDDDDDDDDDDWWWWWWWWWLWFFFFFF
KKKKKPLLLLLFFFEFFFFFFFKKJJJJJJJJJJJJXXXXXXXXXXXXXXXTTTTTNNNNNNUUUUUUUUUUUUYYYYYYYYYYYYNNNIIIIIAIIIIIIIIIKKKKKKKDDDDDDDDDDDDWWWWWWBWWWWWWFFFF
KKKKKPPLLLLLFFFFFFFFFFJJJJJJAJJJJJJXXXXXXXXXXXXXXRXTTTTTTNNNNNNUUUUUUUUUUUUYYYYYYYYYYNNNNNIIIIIIIIIIIIIIKKKKKDDDDDDDDDDDDDWWWWWWWWWWFWFWFFFF
KKKKKPPLLLPLFFFFFFFFFFFJJJJJJJJJJJXXXXXXXXXXXXXXXRTTTTTNNNNNNUUUUUUUUUUUUUUYYYYYYYYYYNNNNNNIMMIIIIIIIIIIKKAAKDDDDDDDDDDDDDWWWWWWWWFFFFFFFFFF
PKPPPPPPPPPPPFFFFFFFJJFJJJJJJJJJXJXXXXXXXXXXXXXXRRTTTTTTNNNNNUUUUUUUUUUUUUUYYYYYYYYYNNNNNNNNMIIIIIIIIIAAAAAAADDBBDDDDDDDDDDDWWWWFFFFFFFFFFFF
PPPPPPPPPPPPPFFFFFFJJJJJJJJJJJJJXXXXXXXXXXXXXXXXRRRTNNNNNNNNNUUUUUUUUUUUUUUYYYYYYYYYNNNNNNMMMMIIIIIIIIIAAAAAAADBDDDDDDDDDDDDDWWFFFFFFFFFFFFF

4
input/day12_example1.txt Normal file
View File

@@ -0,0 +1,4 @@
AAAA
BBCD
BBCC
EEEC

5
input/day12_example2.txt Normal file
View File

@@ -0,0 +1,5 @@
OOOOO
OXOXO
OOOOO
OXOXO
OOOOO

10
input/day12_example3.txt Normal file
View File

@@ -0,0 +1,10 @@
RRRRIICCFF
RRRRIICCCF
VVRRRCCFFF
VVRCCCJFFF
VVVVCJJCFE
VVIVCCJJEE
VVIIICJJEE
MIIIIIJJEE
MIIISIJEEE
MMMISSJEEE

189
src/day12.rs Normal file
View File

@@ -0,0 +1,189 @@
use crate::day_solver::DaySolver;
#[cfg(test)]
use crate::util::read_file;
use crate::util::{Coord, Grid};
use itertools::Itertools;
use std::collections::HashSet;
pub struct Day12 {
garden: Grid<char>,
}
#[derive(Debug, PartialEq, Copy, Clone)]
enum Side {
N,
E,
S,
W,
}
const SIDES: [Side;4] = [Side::N, Side::E, Side::S, Side::W];
struct Fence {
side: Side,
pos: Coord<usize>,
}
struct Area {
patches: Vec<Coord<usize>>,
fences: Vec<Fence>
}
impl Day12 {
pub fn create(input: String) -> Self {
Day12 {
garden: Grid::parse(input, None),
}
}
fn calc_area(&self, start_x: usize, start_y: usize, visited: &mut Grid<bool>) -> Area {
let plant = self.garden.get(start_x, start_y);
let mut to_check = vec![Coord::new(start_x, start_y)];
visited.set(start_x, start_y, true);
let mut in_patch: HashSet<Coord<usize>> = HashSet::new();
in_patch.insert(Coord::new(start_x, start_y));
let mut fences = Vec::with_capacity(32);
while let Some(cur) = to_check.pop() {
for side in SIDES {
if let Some(f) = self.check_neighbor(visited, plant, &mut to_check, &mut in_patch, cur, side) { fences.push(f) }
}
}
Area {
patches: in_patch.into_iter().collect(),
fences
}
}
fn check_neighbor(
&self,
visited: &mut Grid<bool>,
plant: &char,
to_check: &mut Vec<Coord<usize>>,
in_patch: &mut HashSet<Coord<usize>>,
cur: Coord<usize>,
side: Side,
) -> Option<Fence> {
let neighbor = match side {
Side::N => cur.north(),
Side::E => cur.east(),
Side::S => cur.south(),
Side::W => cur.west()
};
if let Some(n) = neighbor {
if self.garden.in_bounds(n.x, n.y) && self.garden.get(n.x, n.y) == plant {
if !visited.get(n.x, n.y) {
to_check.push(n);
in_patch.insert(n);
visited.set(n.x, n.y, true);
}
return None;
}
}
Some(Fence { side, pos: cur })
}
fn calc_total_price(&self) -> usize {
let mut visited = Grid {
data: self.garden.data.iter().map(|_| false).collect(),
width: self.garden.width,
default: Some(true),
};
let mut sum = 0;
for y in 0..self.garden.height() {
for x in 0..self.garden.width {
if *visited.get(x, y) {
continue;
}
let area = self.calc_area(x, y, &mut visited);
sum += area.patches.len() * area.fences.len();
}
}
sum
}
fn count_side(fences: &Vec<Fence>, side: Side) -> usize {
let cur_side_fences = fences.iter()
.filter(|f| f.side == side)
.sorted_by(|a, b| {
match side {
Side::W | Side::E => a.pos.x.cmp(&b.pos.x).then(a.pos.y.cmp(&b.pos.y)),
Side::N | Side::S => a.pos.y.cmp(&b.pos.y).then(a.pos.x.cmp(&b.pos.x)),
}
});
let mut sides = 0;
let start_fence = Fence { side: side.to_owned(), pos: Coord::new(usize::MAX, usize::MAX) };
let mut last_fence = &start_fence;
for fence in cur_side_fences {
if !match side {
Side::W | Side::E => last_fence.pos.x == fence.pos.x && fence.pos.y == last_fence.pos.y + 1,
Side::N | Side::S => last_fence.pos.y == fence.pos.y && fence.pos.x == last_fence.pos.x + 1,
} {
sides += 1
}
last_fence = fence;
}
sides
}
fn calc_modern_total_price(&self) -> usize {
let mut visited = Grid {
data: self.garden.data.iter().map(|_| false).collect(),
width: self.garden.width,
default: Some(true),
};
let mut sum = 0;
for y in 0..self.garden.height() {
for x in 0..self.garden.width {
if *visited.get(x, y) {
continue;
}
let area = self.calc_area(x, y, &mut visited);
// Now we need to find full "sides"
let sides = SIDES.iter().map(|s| Self::count_side(&area.fences, s.to_owned())).sum::<usize>();
sum += area.patches.len() * sides
}
}
sum
}
}
impl DaySolver for Day12 {
fn solve_part1(&mut self) -> String {
self.calc_total_price().to_string()
}
fn solve_part2(&mut self) -> String {
self.calc_modern_total_price().to_string()
}
}
#[test]
fn test_part1_example1() {
let mut day = Day12::create(read_file("input/day12_example1.txt"));
assert_eq!("140", day.solve_part1());
}
#[test]
fn test_part1_example2() {
let mut day = Day12::create(read_file("input/day12_example2.txt"));
assert_eq!("772", day.solve_part1());
}
#[test]
fn test_part1_example3() {
let mut day = Day12::create(read_file("input/day12_example3.txt"));
assert_eq!("1930", day.solve_part1());
}
#[test]
fn test_part2() {
let mut day = Day12::create(read_file("input/day12_example1.txt"));
assert_eq!("80", day.solve_part2());
}

View File

@@ -3,6 +3,7 @@ extern crate core;
use std::time::Instant;
use crate::day10::Day10;
use crate::day11::Day11;
use crate::day12::Day12;
use crate::day1::Day1;
use crate::day2::Day2;
use crate::day3::Day3;
@@ -28,6 +29,7 @@ mod day8;
mod day9;
mod day10;
mod day11;
mod day12;
const DEFAULT_BENCHMARK_AMOUNT: u32 = 100;
@@ -110,7 +112,7 @@ fn build_day_solver(day: u8, input: String) -> Option<Box<dyn DaySolver>> {
9 => Some(Box::new(Day9::create(input))),
10 => Some(Box::new(Day10::create(input))),
11 => Some(Box::new(Day11::create(input))),
// 12 => Some(Box::new(Day12::create(input))),
12 => Some(Box::new(Day12::create(input))),
_ => None
}
}