diff --git a/.idea/codeStyles/codeStyleConfig.xml b/.idea/codeStyles/codeStyleConfig.xml new file mode 100644 index 0000000..a55e7a1 --- /dev/null +++ b/.idea/codeStyles/codeStyleConfig.xml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/input/day12.txt b/input/day12.txt new file mode 100644 index 0000000..ca8717f --- /dev/null +++ b/input/day12.txt @@ -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 diff --git a/input/day12_example1.txt b/input/day12_example1.txt new file mode 100644 index 0000000..cc5f968 --- /dev/null +++ b/input/day12_example1.txt @@ -0,0 +1,4 @@ +AAAA +BBCD +BBCC +EEEC \ No newline at end of file diff --git a/input/day12_example2.txt b/input/day12_example2.txt new file mode 100644 index 0000000..cc213c5 --- /dev/null +++ b/input/day12_example2.txt @@ -0,0 +1,5 @@ +OOOOO +OXOXO +OOOOO +OXOXO +OOOOO \ No newline at end of file diff --git a/input/day12_example3.txt b/input/day12_example3.txt new file mode 100644 index 0000000..0b328f1 --- /dev/null +++ b/input/day12_example3.txt @@ -0,0 +1,10 @@ +RRRRIICCFF +RRRRIICCCF +VVRRRCCFFF +VVRCCCJFFF +VVVVCJJCFE +VVIVCCJJEE +VVIIICJJEE +MIIIIIJJEE +MIIISIJEEE +MMMISSJEEE \ No newline at end of file diff --git a/src/day12.rs b/src/day12.rs new file mode 100644 index 0000000..c7af9a0 --- /dev/null +++ b/src/day12.rs @@ -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, +} + +#[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, +} + +struct Area { + patches: Vec>, + fences: Vec +} + +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) -> 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> = 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, + plant: &char, + to_check: &mut Vec>, + in_patch: &mut HashSet>, + cur: Coord, + side: Side, + ) -> Option { + 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, 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::(); + 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()); +} diff --git a/src/main.rs b/src/main.rs index f865547..fcbcd71 100644 --- a/src/main.rs +++ b/src/main.rs @@ -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> { 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 } }