diff options
Diffstat (limited to 'src/20')
| -rw-r--r-- | src/20/.gitignore | 1 | ||||
| -rw-r--r-- | src/20/input | 1 | ||||
| -rw-r--r-- | src/20/part1 | 187 | ||||
| -rw-r--r-- | src/20/part2 | 207 | ||||
| -rw-r--r-- | src/20/solve.py | 151 | ||||
| -rw-r--r-- | src/20/test1 | 1 |
6 files changed, 548 insertions, 0 deletions
diff --git a/src/20/.gitignore b/src/20/.gitignore new file mode 100644 index 0000000..53752db --- /dev/null +++ b/src/20/.gitignore @@ -0,0 +1 @@ +output diff --git a/src/20/input b/src/20/input new file mode 100644 index 0000000..9c6c2aa --- /dev/null +++ b/src/20/input @@ -0,0 +1 @@ +^WSWSWSWNWSSWWWWWNENESENNWWNENENESENEEES(SWNWSS(WW(SS|N(W|E))|E)|EEENNEENESSWSSSSEENNESSENESSWWWWSWWWSWWSSSEEENEENWW(WWSEWNEE|)NEEESSENEENN(WSWNWESENE|)ESENENEEENEESWSESWWNWWSESWW(N|WSEESSSWWWNN(ESENSWNW|)N(WSW(SESSWSSSESSSSWWWSWWNNNENESS(WSNE|)EENWN(E|NWNENWNEN(NWWS(WN(NEEEWWWS|)WWWSEESSESWWNNWWSWNWSWNWNWWSSWWWSESENESENN(ESSSSSSENNNESENNN(WWSEWNEE|)ESE(ESWSW(N|SESSWWW(NE(NWES|)E|SESWWWWWSESWWWWWNWWSWWWSSSWWNWSWWNENWNENENNESSE(EEENWNNWSSWNNNNWWSWNWNENNWNNENEESENESEENNW(WWWWNWSWSWSSSWNNWSSWWNENWWNNNNWNWSWSSSSSWNNNWWSWSWSESEE(NWNENSWSES|)SENEENNE(SSE(N|SEESENESSSE(NNNEWSSS|)ESSE(NEENSWWS|)SWWS(WNWSWWWWSWWWNWNEEE(SWEN|)EEENWWWWNENESENEEE(NWWNWWS(WWWS(WNN(WSWNN(WSWWWNWWWWWWNWNEESENENESS(EEEE(SWEN|)(NWNWSWNNEENEE(SWSNEN|)NE(S|NWNENNENESESWWSEE(SSWNWS|ENENWNWNWWWWWWSEE(SWS(E|SSWS(E|WWNNNWSSWWNWWSSE(N|EEES(WWS(WWN(E|WWNNWNENE(SSS|EEEE(S|NENEE(NNNWNWNWNWNNEENEEESSWW(NEWS|)S(WNWESE|)ES(W|SESEES(WW|ENNWWNEENWW(WSNE|)NNNNNESEEESSSW(WWNNEESW(ENWWSSNNEESW|)|SSEESWSEENNNNNNEEENNEENESSESSWNWNWSSWSWW(NEWS|)SSEEN(W|EEEEN(ESESSWSSSWWWSESWWSS(WNWNNWNWN(WWWNNSSEEE|)EEENES(EEENNN(E|WWWS(ESEN|WWWSE))|SSW(NWES|)S)|SSEEEE(SWSWWWNEE(WWSEEEWWWNEE|)|NNES(S|EENNW(S|NWN(WSS(W(WSW(SEENSWWN|)N|NN)|E)|ENNEENWW(WSSNNE|)NENWNEESSENEENWNNWNWNEEEESSS(WNNWESSE|)EENNNW(SS|NENNENWNNEENNEENWNWSWNWSSWNNNNNWSWSESSWNWSWWSSSWWNWSWWNENWWSWSSE(ESENESESWWSS(SSSENNNEN(EEEENNNNESESSS(ENNNNWN(EEENSWWW|)NWWS(E|W(N|SSSSWNNW(SS|W)))|SW(WWWWSSSS(W(W|NNN)|E(ESNW|)N)|NNN))|W)|WNNWNWWWWSES(ENEWSW|)WWWSES(ENSW|)WW(SSSSWENNNN|)NWNWW(SEWN|)WWWNNWNWSWWWWNNNWNWWNWNWWWSESWSSESWSSSEENN(WSNE|)EENWNEE(NWWW(W|SS|N(E|N))|SSE(NN|SEESENEESSW(N|S(WSWWSWWWWWWSSW(NNNNNEESWSEENNNEE(NWWEES|)SWSSENE(EEN(WNWSNESE|)E|S)|SSESWSSSSENNESENESENESEE(ENNN(ESSENSWNNW|)WSW(SEWN|)WNNE(S|N(ESEWNW|)WNN(ESNW|)WWSSWW(NNESNWSS|)(SESWS(EEENN(WSNE|)NN|W)|W))|SWWWWWWS(SSSESSES(E(EEE|N)|WSSSSWSWW(SEESSEENNN(WSSNNE|)EN(EESSEEESWSWWSESWSEENEENN(WSWENE|)EEESESSWWW(SESSSWSESSENNENWNNEN(EESWS(EENN(NWNNW(NNW(WNN(WSWS(WNN(E|NWSWNWS(NESENEWSWNWS|))|E)|ESEESSEENW(ESWWNNSSEENW|))|S)|SS)|EEESSWNWSSWSWW(NEWS|)SEESESSWWWSESEESESWWNWWSWNWSWWSEESWWSSEEN(ENNEE(N|EESSWWSW(NNEEWWSS|)WSWWWWWWNENWWSSSSSSWNNNWSSWNWWNENWNNEES(W|S(S|EENNNENNENEE(EENNNN(WWSSWS(EENNSSWW|)WWSWSWWNENNNEEE(SWWSNEEN|)ENWNWNEEE(ESWWEENW|)NNNN(ESNW|)WWWSEESSWWN(WWWSESSWNWWSWWNNE(ENWNWSW(SSSSSSSESESSENNE(NENNWN(EEE(NNN|E)|WSS(SWNWNENW(ESWSESNWNENW|)|E)|N)|SSS(WWSWNNW(SSSSEE(NWES|)SWSW(SSSSEENWNEEE(SSESSESENNWNN(NWSNES|)EEENENNW(NEEEEESENESSSSEESSESSWNWWNN(ESNW|)WWWNWSWW(WSW(NWES|)SESWSS(ENENNNEEEEESWSSWS(WW(NNNEESWS(NENWWSNEESWS|)|W)|EENESEN(NWWEES|)EES(ENNEENWNW(NWNEENWNENWWWNEENESENESEENNNENWNWNENENESENNNWWNNNNNESSESWSEEESEENWNNWNW(SSEWNN|)WN(NWWNEENWN(E|WSWWSESSWSSE(SWSESS(EE|WWN(E|NWNNE(S|NWWN(WSWSESSE(SSW(SESESSW(SSS(ENNE(NNNEN(WWNNSSEE|)E|SE(S(W|S)|N))|W(NNN|WWS(W(SSSSEENW(ESWWNNSSEENW|)|W)|E)))|N)|N|WW)|NN)|ENE(NN(WS|NEE)|S|E)))))|N))|EEEES(W|SEENEENW(WWSNEE|)NENEN(WWSNEE|)E(N|SESSWW(NEWS|)SEEENENWNEN(WW|ESSESESSSWSSWSWNWNENE(S|NENW(N|WSWSWSSWSEESWWWSSWSWWNENWNWN(NNN(W|EESWSES(E(S(S|W)|ENWNNEE(SWEN|)N(E|WWW))|W))|WSWWSW(NN(N|EE)|SWWS(WNSE|)SESSESESESEESSSWSEESWWSESWSEEEES(EENESEEEEENWNEENNNWWNENESESSENEESSSSWWNW(NEE(S|N)|SS(WNSE|)EEEENEES(W|EEENWWNNNEESWSEEESS(WNSE|)ENENWNWNNNEEESSW(NWSNES|)SEEENWNENNW(NEEENENWNENNENENNWSWSWNWNNNEENWNENNENNWNNEENENNNWWWNNESENNNNWWSESWWNNWWSSSE(ESSSEEESWSWNWWNWSWWWSESENEEESWSESS(E|WSWNWNE(E|N(N|WWSWWSESE(ESWSSWNNWNWWNNNWWWNWNEESENEENNNEES(ENE(N(EESWENWW|)WNWSWNWW(S(WWWN(EE|WNW(SSESSES(ENN(W|EESWSE)|WWNWSSSSE(ESWWWNWSWSESEESSSWWSESWWSEEESSSENNESSESSWNWSWNWSSEEESSEEEEEENNESE(NNNNNNWSSWSWS(EENSWW|)WNWSSW(S(WN|EENES)|NNNENWNEESE(SWEN|)ENWNENEEN(EE(NENN(EN|WSWS)|SWS(WW|SSSESWSSEE(SWWEEN|)N(W|NENWNWNN(SSESESNWNWNN|))))|WWNNWWWWWWSEESESS(ENENNW(S|W)|WW(SS|N(E|NWSSWNN(WSNE|)NNNNEN(WWW|ESS(EE(NWNN(ESNW|)W|EE)|W)))))))|SSW(WWWWWSS(WWWW(SSSEENWNE(WSESWWEENWNE|)|NNWWNEEN(WWNWWSESS(SEEWWN|)WNWNWWNWSWNWWSWSSWNWWNNEE(SWEN|)ENNNNENNN(EENESSWSW(N|SSWSEENNESSS(EENES(SWEN|)EENWNWWNENE(EESE(SW(WNWESE|)SS|N)|NWNENENWNWW(NENE(ES(ES(ENSW|)W|W)|NWNENENWNWN(WS(SES|WN)|EESENE(SSWENN|)NN(E(NNWSNESS|)E|WWS(WNWSNESE|)E)))|SS(ENSW|)SSSW(W|NNNN|SSS)))|WWW))|WSSWSSSWWWNWSSS(E(NEEEWWWS|)SSSEESEESESSS(WW(S|NENWNWW(NWES|)SSS(ENN|WN))|ENNNNNEE(SSSW(NN|SSS(ENNENES(NWSWSSNNENES|)|W))|N(WW(WSSNNE|)N|E(S|E))))|WNWNWNWNEENENE(SS(EESENSWNWW|)WS(S|W)|NWWSWSWW(EENENEWSWSWW|))))|ESSSENES(NWSWNNSSENES|)))|EE(NWES|)SS)|N))|NN))|NENN(WSNE|)NNE(ENNNWESSSW|)S))|E)|NEEEENE(SS|NNWW(NENWNEEEESESS(WWN(WNEWSE|)E|ENNNESSEEENWWNNEEENWWWNENENWWNEENENNWSWW(S(WSWW(NEWS|)WSSSEENE(NWWSNEES|)(SSWS(W(S|WWN(EE|WWS(E|W(WSNE|)N)))|E)|E)|E)|NENNNW(WWWNWSWWNWW(WWNWW(WSSNNE|)NENNNW(NWNNENWWNNWNWWSESWSSWSSWSWSWS(WWNWSWWS(E|SWSSSWSSWNNWWSSSWWSWSSS(WNNNNWNNEEENE(SSWW(W|S)|NN(WSWSNENE|)ESENNESE(SWEN|)NN(WWWSNEEE|)NNE(SS|NWNNNEENNENENENW(WSW(SW(SS|W)|N)|NNENWNW(WWWNW(NEENESES(WW|ENESEESESSWSEEEES(ENNNWNWNENNWWS(E|W(NNNEEES(WW|ENEEESSSWWN(NESNWS|)WSSSESESESSEENNNESSSESEESEENESEENNNESENENEEENNENWNNENWWSSWWNENWWSWWSESSES(ENEN(ESSW|WWN)|SWNWNNWWWWWNWWWWNW(SSEEEESSW(NWWWS(WNWN(W|E)|SS)|SSENEENN(WSNE|)EEESWSW(SEE(NEWS|)S(WWW(S|W(NEWS|)W)|S)|N))|NNNENNWWWNNWNENESSSEENNW(NNEEENWWNWSWSWNWWNEEENWWNEEENWWNNWNENWNEEESSW(SSEEENNNNNNNWNWNNEES(W|SEESWSEESSEEEESESSENEEENENNNESEENNNWNWNEEEESENN(WWWWWWSWWWWSSESESE(NNN(W(S|W)|ESSE(ESNW|)N)|SSWSWWNEN(NWNWNNNWSWNN(WSSWW(SES(SSEEEE(NWWNENWWSS(NNEESWENWWSS|)|S|E)|W)|WNN(ESENSWNW|)W(WWWWWWSSEE(NWES|)SSESES(SSSSWENNNN|)WWNWSWWNENWN(EESNWW|)WWWSESE(N|SWSSENESSSSESWWWSWWWWWNNESENNWWNNESEESSE(SWEN|)ENN(ESSNNW|)W(S|NNNWSSWNWWWSWWSSSSENE(NWNEWSES|)SSWSSSENEN(EEESENESE(NENWESWS|)SSEESWSWNWSWWSWSSWWNNWSWSESSWNWNNWWSESWWNWWWWWWWNWNENEENWWWSWWWWSEESE(SESWSESWWNWNN(ESNW|)WSSSWNNNWSSWSESEESWWWSSSSSENES(SWSWNWWNENWNNWNWSSWSWNNWWNEEE(NENWWWWNENESEENWNWNWWNWNWSWWWNWSSSEEN(ESEE(NWES|)S(ENEWSW|)SWNWWWWSESSENNESEES(EEE|SWSESWWSWNNWN(WSSESWSWS(SENEEEEEESSWNWWS(WW(NE|WWSEE)|ESEEEEEEESS(ENNEEN(ESNW|)WWN(WSWNNENN(WSWWSSE(N|SWWNNNNNWSWWS(EE|WWW))|N)|E)|W(S|NWWS(WNWSWN|E))))|WNWWNEENNE(SS|NNN(ESNW|)NNWSSWWSSSE(NENWESWS|)SWW(S|NWNNNE(SS|NWNWWSW(NNEENNENWWW(SESWENWN|)NEEENNNESESWSESSW(N|SWSEENES(SW(SEWN|)W|ENNWNENWNENESS(SSSS|ENNENWNEESSSWSEE(SWEN|)NNNESEEENENNWWWS(SENEWSWN|)WWNWNWSWWNNNNESS(EENENWNENWWNWSWWWWNWWNWSSSWW(NNE(S|NWNEENNNESSEESEENWNNNN(EESSS(WNNSSE|)SESS(W(SWNW(WWNWESEE|)S|N)|ENNENESSEENNNESSESWSEESSESSENENWNWNNNNNWNEN(ESEEN(W|ESSWWSSSW(SEES(SEENESEEESWWWSSSWSWNWSSWWSESWW(SEESENNNESEESWSW(N|SEESE(S(WWWWWNN(ESEEWWNW|)WNWW(SWW(SEEE(ESW(SEES(W|EE(N(ESNW|)W|SWSSW(NN|SEE(N(N|E)|S(SS|W)))))|WW)|N)|WWNEEE)|N)|EE)|NN(ENNW(NWN(W(S|W)|EN(NENWNEEENNEEENENWNWNENEENNWWWN(EEEEEEEESWWSSWSW(NNNESNWSSS|)SSENEEN(ESESSE(NENWNNW(S|N(WSWNSENE|)NEN(W|ESS(SSENESESS(ENE(NNE(SSEWNN|)NNEES(W|EENWN(E|WWWWWWWSS(WNNSSE|)EE(ENWWEESW|)S(W|S)))|S)|WW(SW|NE))|W)))|SSSSWSESESSSSESENESS(E(NE(S|NWN(W|NESEES(SWN|EN)))|SS)|WWSWNNWNWNWNEE(NWWWWNNNWWNWSSESWWSWNNENNN(WWWSES(ENSW|)SWWSW(NNEEWWSS|)WSEEESSEEN(WNNWESSE|)EEEN(W|E(SEESWWWWS(ESSSWS(WNSE|)EENNNESEEE(S(ENSW|)WSWNWS|NWNW(S|WW))|W(WWWSWWNENNW(S|W)|N))|NN))|NEN(NNWNEWSESS|)ESENEESWSS(WNWWEESE|)EE(SWSES(W|E)|N(W|E(S|NWNNWW))))|S)))|W)|WSWNWWSWSESWSESEESS(EN(ESNW|)NNWNN(ESENEE|W(SS|N))|WWWN(NWWW(WNEN(ENNE(SSSWENNN|)N(E|W)|W)|S(EE|S))|EE)))|W))|S)|W)))|NNNNWN(EEE(SWSEWNEN|)NESENN(ESSNNW|)W|NNWWWW(NNE(EESWWEENWW|)NWWSWNN(SSENEEWWSWNN|)|SEESWWSWSE(EEE(N(WW|NN)|E)|S))))|W)|NNN))|WWWS(ESSESS|WWWS(ESSNNW|)WWW(SEWN|)NEEN(EEE|WW))))|WWS(ESSWNSENNW|)WWN(E|WSSW(SSENSWNN|)NN)))|SEESENEEN(WWNEWSEE|)EE(EEESSNNWWW|)SSW(N|WWSWSEEESSE(NNNWWEESSS|)ESWW(WNNWSWNWWNW(NNESES|SSSSSENE(NWNEWSES|)S)|S)))|S))))|SESWSEE(SWS(WNSE|)EE|NNN))))))|EE(NEWS|)S))|W)|S)|EEENWWNENN(ESSENNEESSW(N|SE(EENWNEE(S|NWWNNEES(E(NNWWWNN(WSSSSWWN(E|WW(SEWN|)N)|ESENEEESSESE(NESEN(NWWWEEES|)ESSENESEE(SWEN|)NWNNE(S|EEEEEEEEN(E|WWWNN(ESNW|)WSWS(WNN(WSSWWWSSW(ENNEEEWWWSSW|)|NE(S|EE))|E)))|SWWWN(NNWESS|)E))|S)|W))|SWS(ES|WNN)))|WSWW(NE|SE)))|N)|W)))|SS))|EEEEEE)|E))|ESESENN(ESSSWWSSSWSSWSWWNWSSESSSWWWSSENEEESWWSWWWWWSEEESWSSWWNWSWNWSSWNNNEENNE(SSEESNWWNN|)NENESENNWWWSWWWWNWWNNESENE(SENEES(WSWWEENE|)ENN(W|EENEE(NWNEEEE(S|ENWNW(S|NEN(WNWESE|)ESSENNN(SSSWNNSSENNN|)))|SSW(WS(EEEN|WN)|N)))|NNWNWSS(WWWSESSWSESW(SESWSESWWNW(SSSESWSEEEENWWNN(EENNNENN(EESS(ENNEWSSW|)W(N|SSW(N|SESW(SSSWWWSWNWSWSESENESENNESESWSEEENNEENENESENNWWWSWNN(ENEEEEENEN(NNESESWSSWSEEENN(WSNE|)NENNW(N(WSNE|)EENNW(NWNENN(WSNE|)ESSES(EENNEEEESENEESWSESENENWNNWNNNENENEESEEENWNEESESWSWSSEESSSENEE(NWNNE(S|NNNWSW(NNEENNNNWSWWWWWWWSWSWWNNN(WWSESWWWWWSSENESSWWWN(WWSESEESWWSEEESS(EENE(S|NWNW(SS|WNEEE(S|NE(S|EN(EEENE(SS|EEN(ESE(S|EN(ESNW|)W)|WW))|WWW(NEEWWS|)S)))))|WWN(E|WSWNNW(NENSWS|)S(SSESNWNN|)W))|NNNNESEEENWW(EESWWWEEENWW|))|EE(SWSNEN|)EEEEEEE)|S(E|S(W(N|W)|SS))))|SSSSWSWWWSSWNWSSSSWSWNNENWNWWWSWNWWSSWNWNWNEE(S|EENEN(ESS(W|EENNENW(WSSNNE|)NEEESWSEE(SWWWSES(NWNEEEWWWSES|)|ENESENEN(WWWW(S|NENWWSWNNWWW(SEESWENWWN|)NN(WSNE|)ESENEN(WW(W|N)|ESS(SEEWWN|)W))|N)))|WNWWN(E|WNWWSESESS(ENESNWSW|)WNWNWSSSWW(WSSESWWSSESEENWN(ENENE(SSSSW(SESSSEESSSWNWSSSWNNWSSWWNENWWWNNNENNESESWSES(WWNSEE|)EEN(EE|WNNN(ESSNNW|)WN(WWWN(E|WSSESWW(SS(E(N|SWSSE(SSENNESSESWSWWSWWWSESWWNNNNESEEN(NW(N(N|E)|WWWSSSSWWW(NEN(W|E(S|N))|WSESENESE(SWWWSSSSSESS(WNW(WNENNNWSSWWWNWSWSS(EEE(S|N(ESNW|)WW)|WNNNW(SS|NEE(S|NWNWNW(S(SEWN|)W|NNWNEE(EESSENEEEESWSEESSWNWWWSW(SEESENNW(ESSWNWESENNW|)|NN(EENWESWW|)W(WNWNEWSESE|)S)|NWWW(SS|WNWN(E|N)))))))|S)|EENEENNNNESSENNNEEESWSESENEENNWW(SEWN|)NWWWNNW(NEESSENNESES(ENNEEESSSESWWSW(NN(NE(NWES|)S|WW)|SSSSWSWWNN(E(ENWESW|)S|WWSESWSSSSENENESSSSSSSWSESWSSWSWSWNNENNNE(SS|NNNWNN(ESE(SS|NN)|WNWWW(NNNW(SSWNNSSENN|)NEENNEE(N(NN|E)|SWSESSWNWSSEE(WWNNESNWSSEE|))|SEESWSW(SW(SES(WW|SENENN(WSNE|)NE(N|SS(ENSW|)SSWS(E|SWW(NEWS|)SSSSWSEENNE(NWNEWSES|)SENEEESWSSSSESEENWNNN(WSSNNE|)EESEEENNWW(SEWN|)NENNENWWWWW(SWS(EEE(SSWNWS|N(ESNW|)W)|W)|NEENNENNEESWSEENESSSW(NWWS(WNSE|)E|SEESESEESENNNWNNESENENENWWNNWNWNNNNESENNEEENWNNWWSWS(EENSWW|)WNNNE(NWWSWSSE(N|SS(SWSESWWWNWNNWWNNESEESSE(S|NN(ESNW|)NWNNWNWN(ENEESS(WNSE|)(ENENNESSENNENWNWWS(WS(S|WWWNEENNWWW(NWNENNW(SWWN(E|WSW(SWS(E(EEN(ESNW|)W|S)|WW)|N))|NEN(W|ESEENWNNEEEESEEESESESWWWSEEEENNEENNNNWSSSWWNWNNNNNWSWSSW(SEENNSSWWN|)NNWWWSEESWWWNNWNWNNENN(WWW(N(N|E)|SE(E|SWSESS(WNSE|)ESS(ENSW|)SS))|EN(N|ESEEE(NNWSWENESS|)SWWSSS(ENNEEEEEN(W|NNEN(W|ENESSWSESENE(SSWSSWWNW(NE(ES|NWN)|W(SESWSSE(S(W|S)|NENESEE(N(NN|W)|SSW(N|SSE(N|SWSWWSSESWSESSENE(SSWSSWNWN(WWSESSSEESWWS(WNNWWWNENE(ESWENW|)NNW(SWSNEN|)NEEEN(ESNW|)NWNENWWSSS(E|WNW(WWNWSW(S|NNNWSWS(WNNEN(EENNE(NWWEES|)ESE(NESEWNWS|)SWSES(SENES|WWNNN)|W)|E))|S))|SSSEENESE(NNNNW(SWS(E|W(S|N))|NEN(WWWNSEEE|)NN)|SSWNWSWNWSSWSSS(WWNNNN(WWSESNWNEE|)NNESE(SWSSSNNNEN|)N|ENESESWSSEEN(W|E(SSWSESWSSWWSWNNWNEENWN(WW(WSSW(SSSWWSEEEENWNNE(NNEWSS|)SESSSWSESSWSWNN(E|NWSWNWWN(EEEE|NNNWSSSSSWNNNNNWSSSW(SSE(N|SESENESSSSWNNWSWWSESSESEENEN(WW(WNSE|)S|ENESESWSSWSWSWNWSSWSWSESESEEESESWWSSWNWSWWNENN(ESENEWSWNW|)WWS(WNNWNEE(NWWNWWWWNNESENNEEENWWNWSWWS(E|WSSSWSSWSSWNWWWNENWNWNWWNNW(NNESEESS(WNSE|)ESENEEES(SWS(E|W(SEWN|)N(NEWS|)W)|ENNNENWWWWSEESWWWWNNWWNENESE(NESENENNNNN(NNNN(WWSESSSWWNN(ESNW|)NWSSWW(SESSW(SS(WS(SWNWESEN|)E|EEENESENNNWSWW(SWEN|)N(N|E))|N)|WNNNE(SESWENWN|)NWN(EENNNWW(EESSSWENNNWW|)|WW))|N)|ESSESENESSEEENWWNN(WWW|NNEEE(NWWWWN|SSWS(WNNEWSSE|)E(EN(ESNW|)N|SSSESWW(NWSWNWWS(SENSWN|)WW(NEN(WNSE|)E|W)|SEESE(N|E(SWS(E|SWSWNWN(EEN|WS))|EEENEN)))))))|SS))|WSESWSES(WWSWNSENEE|)ESSSENE(NWN(NWES|)E|SSSEESWSESENNNESESENNWN(ENESEENEE(NWNN(ESNW|)WWWSEESW(S|WW)|ESWSSWSWWW(SWWSSWSESEENESSESSESES(WWNWNNWSSWWS(EEE|WWWWWWNNWWSESWWWNENWWNENNWSW(SSWSS(ENESNWSW|)WW(NENWESWS|)W|NNEN(W|EEN(W|ENWNENESSSSWSSSS(WNNNWESSSE|)EEEESES(WWNSEE|)EENWNWNWNNWSSWWNEN(W|NEEN(ESE(NENNSSWS|)SS(WNSE|)SE(N|SESENN(E|W))|WWNNE(SEWN|)NWNWN(WSWSNENE|)E))))))|ENNWNENNNENNWSWNWN(ENENNESE(SEESWSEESEENNEN(WWWSES|ESESWSESWW(SWWN(E|WWSESSWSESEES(WWWNWNWNW(NEN(E(NWN(EE|NNW(N|W))|S(S|E))|W)|SSES(E|W))|EEENNEEESS(WNWSNESE|)ENEENE(SSWWEENN|)NNWWWWS(ESENEWSWNW|)WNWN(WWSS(WWS(EESW|WNNEE)|E(E|N))|NEEENESENNNWSWNWNWW(WNENNW(SWWSEWNEEN|)NNNESES(SSES(EEES(E(SSSSSWWWWW(EEEEENSWWWWW|)|NNNNNWWSWS(SENE(N|S)|WNNENEENWWNWSW(SEWN|)WNNE(S|NNNEENNWSWNW(NNNESES(EEENNE(NNNWNNE(S|NNWSWWSW(NNEENEENN(SSWWSWENEENN|)|SESSW(S(EE(SSWNWESENN|)N(ESNW|)NNN|W(WWS(WWW(S|NEENNWSWNNW(ESSENEWSWNNW|))|S)|N))|N)))|SSSWWSSSWWSSENESSEE(SS|NWNENNNWSS(NNESSSNNNWSS|)))|W)|SSW(N|SWSWSWWSEEENE(NENSWS|)SSWS(S|WNWSWNWN(SESENEWSWNWN|)))))))|WW)|W)|W)|SSSEN(ESNW|)N))))|NN))|N)|WSW(S(WNWSSNNESE|)ESSEN(ESSWSNENNW|)N|N)))|NEN(E(ENSW|)S|W)))|WWWWNEE(WWSEEEWWWNEE|)))))|SE(N|E))|E)))|NNNWNEE(NWES|)E)))|N)|NENE(NWES|)S)|EESSSW)|NNNNWS(SS|WNN(WSWENE|)EE))))))|E)|NWNENWN(ENSW|)W)))))|WWWWSE))|NWNENN(N|W(S|WW)))))|WNNNWSS(W|S))))))|S(EE|S)))|E)|SS)|WSWSES(E(ESNW|)N|WSSWSSW(NWWWSNEEES|)SESENN(N|EESSW(N|SWWSS(ENEENE(SEESENN(WW|ESSESSS(WWSS(WNNNN(ESENSWNW|)WNW(WW|S)|SE(SEWN|)NN)|E(E|NN)))|N)|W(NNN|SESWSS)))))))|EE))|S))))))|N)|N))))))|W)|SSWNWWSES(E|WSWSESSWW(N(NNW(NEEWWS|)SS|E)|S))))|N))|S)|EE)|N))|W)|NNNWWSESWWNNN(E|WWW)))|E))|NN)|N(WW(W|S)|NN))|W)|NNNESS)))))|W)|S)|S)|W)|WWSESS(W(SS|W|N)|E))|WW)))|W(NEWS|)S)|W)|W)|WNNN(NNNEN(EESWENWW|)NW(NEWS|)S|WSW(S(ESNW|)W|N)|E))|E))|W)))|N)|S))))|SESSES(E|W)))|WSSSWNNWN(WSW(NN(W|NN(NWES|)E)|SWSSSSWW(NEN(W|N)|SS(SWNNWNE(WSESSEWNNWNE|)|ENESE(ENENNWNW(SS(S|E)|NENESSE(E|SS))|S))))|E)))|S)|S))))|EENWNEEESEENESSWSS(ENESENNWNNNN(WWS(E|W(NW(SWWEEN|)NN|S))|ESSEEEESWS(EES(W|EENWNWNENNN(EN(E(S|EE(E|NNW(NENNSSWS|)SW(N|W)))|W)|WWSESWWNWSWN(SENESEWNWSWN|)))|WNW(S|W)))|SWNW(SSSWSESWSS(WNW(S|NNWWW(SEEWWN|)NN(W|EEES(E(NEWS|)SS|WW)|N))|SEESS(WNWESE|)EESENE(NEEN(EESWENWW|)WNNWNEN(ESSSNNNW|)WWWSSE(N|SWSW(NWN(WSNE|)ENWNNNES(E|S)|SEENEN))|S))|NENWWN))))|EEEE(SWEN|)NN(WSWENE|)NNEESS(SWNNSSEN|)E(NNNWN(WSNE|)N|E))|SS)|SSE(SWEN|)(N|EEE))|SS)))|S(E|S))))|S)|WSSSESWW(NWES|)SS)|N))))|NN)|S)))|WWWWWNNWWNWSWWSWNWW(NENWNENNWSW(NNEN(EEESW(SSEEESS(WSWWNNE(E|S)|EEE(SWEN|)NWNENN(ESNW|)WNWSWW(NEN(E|NWW(NEN|SE))|S(EE(E|SS)|W)))|W)|W)|S(W|S))|SS(WNWSNESE|)E(N|EEEEN(EESWENWW|)W)))))))))))|S)|W))|WWWWWWWWNNNEN(EE(NN|SWSS(WNSE|)EEE(NW(W|NN)|EE))|W))|NENNNEESS(WNSE|)ENESSW)|S)|NWW(N|W))|N)|N(N|E))|ENE(E|SSS)))|NNNEEEESW(WW|SE(EEENWN(EEEEENW(ESWWWWEEEENW|)|NNNNW(SWSWWS(WWNNE(NWNEWSES|)(EE|S)|EEE(SS|N))|NNE(SEEWWN|)N))|SS)))|S)|E)|EE(EE(NWWNSEES|)E|SWSSE(E|N)))|SWSES(WWNSEE|)SS))))|W))|W)|W)|NE(NWES|)E)|NW(NN|S))|NNE(NE(NWNNW(NNE(SESSNNWN|)NNNWSS|SSS)|S)|S)))|E)))|EEENWNN(SSESWWEENWNN|))))))|N)))))))|WW(W|N))))))|S(W|SE(SWSNEN|)N)))))|EE)|EE))))|E)))|E)|W)|E)|EEEN(W|E))|E)|E)|SW(S(EEENWESWWW|)S|W))|E))|NWNNES)|S)|SWS(ES|WN))))|NN)|N)|E)|E))|N)|N)))$
diff --git a/src/20/part1 b/src/20/part1 new file mode 100644 index 0000000..b341e27 --- /dev/null +++ b/src/20/part1 @@ -0,0 +1,187 @@ +--- Day 20: A Regular Map --- + +While you were learning about instruction pointers, the Elves made considerable progress. When you +look up, you discover that the North Pole base construction project has completely surrounded you. + +The area you are in is made up entirely of [1m[97mrooms[0m and [1m[97mdoors[0m. The rooms are arranged in a grid, and +rooms only connect to adjacent rooms when a door is present between them. + +For example, drawing rooms as ., walls as #, doors as | or -, your current position as X, and where +north is up, the area you're in might look like this: + +##### +#.|.# +#-### +#.|X# +##### + +You get the attention of a passing construction Elf and ask for a map. "I don't have time to draw +out a map of this place - it's [1m[97mhuge[0m. Instead, I can give you directions to [1m[97mevery room in the +facility[0m!" He writes down some directions on a piece of parchment and runs off. In the example +above, the instructions might have been ^WNE$, a regular expression or "[1m[97mregex[0m" (your puzzle input). + +The regex matches routes (like WNE for "west, north, east") that will take you from your current +room through various doors in the facility. In aggregate, the routes will take you through +[1m[97mevery door in the facility at least once[0m; mapping out all of these routes will let you build a +proper map and find your way around. + +^ and $ are at the beginning and end of your regex; these just mean that the regex doesn't match +anything outside the routes it describes. (Specifically, ^ matches the start of the route, and $ +matches the end of it.) These characters will not appear elsewhere in the regex. + +The rest of the regex matches various sequences of the characters N (north), S (south), E (east), +and W (west). In the example above, ^WNE$ matches only one route, WNE, which means you can move +[1m[97mwest, then north, then east[0m from your current position. Sequences of letters like this always match +that exact route in the same order. + +Sometimes, the route can [1m[97mbranch[0m. A branch is given by a [1m[97mlist of options[0m separated by pipes (|) and +wrapped in parentheses. So, ^N(E|W)N$ contains a branch: after going north, you must choose to go +[1m[97meither east or west[0m before finishing your route by going north again. By tracing out the possible +routes after branching, you can determine where the doors are and, therefore, where the rooms are in +the facility. + +For example, consider this regex: ^ENWWW(NEEE|SSE(EE|N))$ + +This regex begins with ENWWW, which means that from your current position, all routes must begin by +moving east, north, and then west three times, in that order. After this, there is a branch. Before +you consider the branch, this is what you know about the map so far, with doors you aren't sure +about marked with a ?: + +#?#?#?#?# +?.|.|.|.? +#?#?#?#-# + ?X|.? + #?#?# + +After this point, there is (NEEE|SSE(EE|N)). This gives you exactly two options: NEEE and SSE(EE|N). +By following NEEE, the map now looks like this: + +#?#?#?#?# +?.|.|.|.? +#-#?#?#?# +?.|.|.|.? +#?#?#?#-# + ?X|.? + #?#?# + +Now, only SSE(EE|N) remains. Because it is in the same parenthesized group as NEEE, it starts from +the same room NEEE started in. It states that starting from that point, there exist doors which will +allow you to move south twice, then east; this ends up at another branch. After that, you can either +move east twice or north once. This information fills in the rest of the doors: + +#?#?#?#?# +?.|.|.|.? +#-#?#?#?# +?.|.|.|.? +#-#?#?#-# +?.?.?X|.? +#-#-#?#?# +?.|.|.|.? +#?#?#?#?# + +Once you've followed all possible routes, you know the remaining unknown parts are all walls, +producing a finished map of the facility: + +######### +#.|.|.|.# +#-####### +#.|.|.|.# +#-#####-# +#.#.#X|.# +#-#-##### +#.|.|.|.# +######### + +Sometimes, a list of options can have an [1m[97mempty option[0m, like (NEWS|WNSE|). This means that routes at +this point could effectively skip the options in parentheses and move on immediately. For example, +consider this regex and the corresponding map: + +^ENNWSWW(NEWS|)SSSEEN(WNSE|)EE(SWEN|)NNN$ + +########### +#.|.#.|.#.# +#-###-#-#-# +#.|.|.#.#.# +#-#####-#-# +#.#.#X|.#.# +#-#-#####-# +#.#.|.|.|.# +#-###-###-# +#.|.|.#.|.# +########### + +This regex has one main route which, at three locations, can optionally include additional detours +and be valid: (NEWS|), (WNSE|), and (SWEN|). Regardless of which option is taken, the route +continues from the position it is left at after taking those steps. So, for example, this regex +matches all of the following routes (and more that aren't listed here): + + + - ENNWSWWSSSEENEENNN + + - ENNWSWW[1m[97mNEWS[0mSSSEENEENNN + + - ENNWSWW[1m[97mNEWS[0mSSSEENEE[1m[97mSWEN[0mNNN + + - ENNWSWWSSSEEN[1m[97mWNSE[0mEENNN + + +By following the various routes the regex matches, a full map of all of the doors and rooms in the +facility can be assembled. + +To get a sense for the size of this facility, you'd like to determine which room is +[1m[97mfurthest[0m from you: specifically, you would like to find the room for which the [1m[97mshortest path to that +room would require passing through the most doors[0m. + + + - In the first example (^WNE$), this would be the north-east corner [1m[97m3[0m doors away. + + - In the second example (^ENWWW(NEEE|SSE(EE|N))$), this would be the south-east corner +[1m[97m10[0m doors away. + + - In the third example (^ENNWSWW(NEWS|)SSSEEN(WNSE|)EE(SWEN|)NNN$), this would be the north-east +corner [1m[97m18[0m doors away. + + +Here are a few more examples: + +Regex: ^ESSWWN(E|NNENN(EESS(WNSE|)SSS|WWWSSSSE(SW|NNNE)))$ +Furthest room requires passing 23 doors + +############# +#.|.|.|.|.|.# +#-#####-###-# +#.#.|.#.#.#.# +#-#-###-#-#-# +#.#.#.|.#.|.# +#-#-#-#####-# +#.#.#.#X|.#.# +#-#-#-###-#-# +#.|.#.|.#.#.# +###-#-###-#-# +#.|.#.|.|.#.# +############# + +Regex: ^WSSEESWWWNW(S|NENNEEEENN(ESSSSW(NWSW|SSEN)|WSWWN(E|WWS(E|SS))))$ +Furthest room requires passing 31 doors + +############### +#.|.|.|.#.|.|.# +#-###-###-#-#-# +#.|.#.|.|.#.#.# +#-#########-#-# +#.#.|.|.|.|.#.# +#-#-#########-# +#.#.#.|X#.|.#.# +###-#-###-#-#-# +#.|.#.#.|.#.|.# +#-###-#####-### +#.|.#.|.|.#.#.# +#-#-#####-#-#-# +#.#.|.|.|.#.|.# +############### + +[1m[97mWhat is the largest number of doors you would be required to pass through to reach a room?[0m That is, +find the room for which the shortest path from your starting location to that room would require +passing through the most doors; what is the fewest doors you can pass through to reach it? + + diff --git a/src/20/part2 b/src/20/part2 new file mode 100644 index 0000000..bef65a3 --- /dev/null +++ b/src/20/part2 @@ -0,0 +1,207 @@ +--- Part Two --- + +Strangely, the exit isn't open when you reach it. Then, you remember: the ancient Plutonians were +famous for building [1m[97mrecursive spaces[0m. + +The marked connections in the maze aren't portals: they [1m[97mphysically connect[0m to a larger or smaller +copy of the maze. Specifically, the labeled tiles around the inside edge actually connect to a +smaller copy of the same maze, and the smaller copy's inner labeled tiles connect to yet a +[1m[97msmaller[0m copy, and so on. + +When you enter the maze, you are at the outermost level; when at the outermost level, only the outer +labels AA and ZZ function (as the start and end, respectively); all other outer labeled tiles are +effectively walls. At any other level, AA and ZZ count as walls, but the other outer labeled tiles +bring you one level outward. + +Your goal is to find a path through the maze that brings you back to ZZ at the outermost level of +the maze. + +In the first example above, the shortest path is now the loop around the right side. If the starting +level is 0, then taking the previously-shortest path would pass through BC (to level 1), DE (to +level 2), and FG (back to level 1). Because this is not the outermost level, ZZ is a wall, and the +only option is to go back around to BC, which would only send you even deeper into the recursive +maze. + +In the second example above, there is no path that brings you to ZZ at the outermost level. + +Here is a more interesting example: + + Z L X W C + Z P Q B K + ###########.#.#.#.#######.############### + #...#.......#.#.......#.#.......#.#.#...# + ###.#.#.#.#.#.#.#.###.#.#.#######.#.#.### + #.#...#.#.#...#.#.#...#...#...#.#.......# + #.###.#######.###.###.#.###.###.#.####### + #...#.......#.#...#...#.............#...# + #.#########.#######.#.#######.#######.### + #...#.# F R I Z #.#.#.# + #.###.# D E C H #.#.#.# + #.#...# #...#.# + #.###.# #.###.# + #.#....OA WB..#.#..ZH + #.###.# #.#.#.# +CJ......# #.....# + ####### ####### + #.#....CK #......IC + #.###.# #.###.# + #.....# #...#.# + ###.### #.#.#.# +XF....#.# RF..#.#.# + #####.# ####### + #......CJ NM..#...# + ###.#.# #.###.# +RE....#.# #......RF + ###.### X X L #.#.#.# + #.....# F Q P #.#.#.# + ###.###########.###.#######.#########.### + #.....#...#.....#.......#...#.....#.#...# + #####.#.###.#######.#######.###.###.#.#.# + #.......#.......#.#.#.#.#...#...#...#.#.# + #####.###.#####.#.#.#.#.###.###.#.###.### + #.......#.....#.#...#...............#...# + #############.#.#.###.################### + A O F N + A A D M + +One shortest path through the maze is the following: + + + - Walk from AA to XF (16 steps) + + - Recurse into level 1 through XF (1 step) + + - Walk from XF to CK (10 steps) + + - Recurse into level 2 through CK (1 step) + + - Walk from CK to ZH (14 steps) + + - Recurse into level 3 through ZH (1 step) + + - Walk from ZH to WB (10 steps) + + - Recurse into level 4 through WB (1 step) + + - Walk from WB to IC (10 steps) + + - Recurse into level 5 through IC (1 step) + + - Walk from IC to RF (10 steps) + + - Recurse into level 6 through RF (1 step) + + - Walk from RF to NM (8 steps) + + - Recurse into level 7 through NM (1 step) + + - Walk from NM to LP (12 steps) + + - Recurse into level 8 through LP (1 step) + + - Walk from LP to FD (24 steps) + + - Recurse into level 9 through FD (1 step) + + - Walk from FD to XQ (8 steps) + + - Recurse into level 10 through XQ (1 step) + + - Walk from XQ to WB (4 steps) + + - Return to level 9 through WB (1 step) + + - Walk from WB to ZH (10 steps) + + - Return to level 8 through ZH (1 step) + + - Walk from ZH to CK (14 steps) + + - Return to level 7 through CK (1 step) + + - Walk from CK to XF (10 steps) + + - Return to level 6 through XF (1 step) + + - Walk from XF to OA (14 steps) + + - Return to level 5 through OA (1 step) + + - Walk from OA to CJ (8 steps) + + - Return to level 4 through CJ (1 step) + + - Walk from CJ to RE (8 steps) + + - Return to level 3 through RE (1 step) + + - Walk from RE to IC (4 steps) + + - Recurse into level 4 through IC (1 step) + + - Walk from IC to RF (10 steps) + + - Recurse into level 5 through RF (1 step) + + - Walk from RF to NM (8 steps) + + - Recurse into level 6 through NM (1 step) + + - Walk from NM to LP (12 steps) + + - Recurse into level 7 through LP (1 step) + + - Walk from LP to FD (24 steps) + + - Recurse into level 8 through FD (1 step) + + - Walk from FD to XQ (8 steps) + + - Recurse into level 9 through XQ (1 step) + + - Walk from XQ to WB (4 steps) + + - Return to level 8 through WB (1 step) + + - Walk from WB to ZH (10 steps) + + - Return to level 7 through ZH (1 step) + + - Walk from ZH to CK (14 steps) + + - Return to level 6 through CK (1 step) + + - Walk from CK to XF (10 steps) + + - Return to level 5 through XF (1 step) + + - Walk from XF to OA (14 steps) + + - Return to level 4 through OA (1 step) + + - Walk from OA to CJ (8 steps) + + - Return to level 3 through CJ (1 step) + + - Walk from CJ to RE (8 steps) + + - Return to level 2 through RE (1 step) + + - Walk from RE to XQ (14 steps) + + - Return to level 1 through XQ (1 step) + + - Walk from XQ to FD (8 steps) + + - Return to level 0 through FD (1 step) + + - Walk from FD to ZZ (18 steps) + + +This path takes a total of [1m[97m396[0m steps to move from AA at the outermost layer to ZZ at the outermost +layer. + +In your maze, when accounting for recursion, [1m[97mhow many steps does it take to get from the open tile +marked AA to the open tile marked ZZ, both at the outermost layer?[0m + + diff --git a/src/20/solve.py b/src/20/solve.py new file mode 100644 index 0000000..63695b7 --- /dev/null +++ b/src/20/solve.py @@ -0,0 +1,151 @@ +import sys
+sys.path.append("../common")
+import aoc
+from copy import deepcopy
+
+data = list(aoc.data)
+
+def get_map(p):
+ return vmap[p[1] + spos[1]][p[0] + spos[0]]
+
+def set_map(p, c):
+ global vmap, spos
+ vmap[p[1] + spos[1]][p[0] + spos[0]] = c
+
+def new_pos(p, c):
+ p = p[:]
+ if c == "N":
+ p[1] -= 2
+ elif c == "S":
+ p[1] += 2
+ elif c == "W":
+ p[0] -= 2
+ elif c == "E":
+ p[0] += 2
+ return p
+
+def calc_pos(stack):
+ p = [0,0]
+ for c in stack:
+ p = new_pos(p, c)
+ return p
+
+xmin = 0
+xmax = 0
+ymin = 0
+ymax = 0
+
+def check_size(stack):
+ global xmin, xmax, ymin, ymax
+
+ p = calc_pos(stack)
+ if p[0] < xmin:
+ xmin = p[0]
+ if p[0] > xmax:
+ xmax = p[0]
+ if p[1] < ymin:
+ ymin = p[1]
+ if p[1] > ymax:
+ ymax = p[1]
+
+def draw_route(stack):
+ p = calc_pos(stack)
+ set_map(p, ".")
+ np = new_pos(p, stack[-1])
+ cp = [0,0]
+ cp[0] = p[0] + int((p[0] - np[0])/2)
+ cp[1] = p[1] + int((p[1] - np[1])/2)
+ set_map(cp, "+")
+
+def iter_regex(func):
+ stacklens = [0]
+ stack = []
+ for i in range(1, len(data)-1):
+ c = data[i]
+ if c == "(":
+ stacklens.append(0)
+ elif c == "|":
+ for i in range(stacklens[-1]):
+ stack.pop()
+ stacklens[-1] = 0
+ elif c == ")":
+ for i in range(stacklens[-1]):
+ stack.pop()
+ stacklens.pop()
+ else:
+ stack.append(c)
+ stacklens[-1] += 1
+ func(stack)
+
+def fwriteMap():
+ f = open("output", "w+")
+ for y in range(len(vmap)):
+ f.write("".join([str(v) for v in vmap[y]]) + "\n")
+ f.close()
+
+mshape = None
+spos = None
+vmap = None
+
+def genMap():
+ global vmap, mshape, spos
+
+ iter_regex(check_size)
+ xdif = xmax - xmin + 2
+ ydif = ymax - ymin + 2
+
+ spos = (-xmin+1, -ymin+1)
+ mshape = (xdif, ydif)
+
+ vmap = [["#" for x in range(xdif+1)] for y in range(ydif+1)]
+ vmap[spos[1]][spos[0]] = "X"
+
+ iter_regex(draw_route)
+
+
+adjacent = ((-1, 0), (0, -1), (1, 0), (0, 1))
+
+def gen_countmap(sp):
+ countmap = dict()
+ next = dict()
+ next[(sp[0], sp[1])] = 0
+ counter = 0
+ steps = list()
+ while len(next) > 0 and len(steps) == 0: # first steps available will be shortest
+ countmap = {**countmap, **next} # merge dictionaries
+ counter += 1
+ temp = dict()
+ for n in next:
+ for dir in adjacent:
+ nx = n[0]+dir[0]
+ ny = n[1]+dir[1]
+ if get_map((nx, ny)) != "#" and (nx, ny) not in countmap and (nx, ny) not in temp:
+ temp[(nx,ny)] = counter
+ next = temp
+ return countmap
+
+def next_step(cmap, p):
+ # adjacent squares
+ npos = [[p[0] + dir[0], p[1] + dir[1]] for dir in adjacent]
+
+ # steps and dist
+ steps = [[np[0], np[1], cmap[np[0], np[1]]] for np in npos if (np[0], np[1]) in cmap]
+
+ if len(steps) == 0:
+ return None
+ else:
+ return sorted(steps, key = lambda x: x[2])[0] #closest
+
+genMap()
+
+def solve1(args):
+ cmap = gen_countmap((0,0))
+ ipos = sorted(cmap, key = lambda x : cmap[x])[-1]
+ return int(cmap[ipos]/2)
+
+def solve2(args):
+ cmap = gen_countmap((0,0))
+ count = len([v for v in cmap if int(cmap[v]/2) >= 1000 and get_map(v) == "."])
+ return count
+
+aoc.run(solve1, solve2, sols=[4121, 8636])
diff --git a/src/20/test1 b/src/20/test1 new file mode 100644 index 0000000..25ab237 --- /dev/null +++ b/src/20/test1 @@ -0,0 +1 @@ +^ENWWW(NEEE|SSE(EE|N))$ |
