From d2924d72659a93d158a9b57f93cccc5f85d2657a Mon Sep 17 00:00:00 2001 From: Jonathan Chan Date: Thu, 20 Dec 2018 19:39:07 -0800 Subject: [PATCH] Day 20 -- really slow... --- README.md | 2 +- app/Main.hs | 2 +- input/20.txt | 1 + package.yaml | 1 + src/Day20.hs | 74 +++++++++++++++++++++++++++++++++++++++++++++++++++- 5 files changed, 77 insertions(+), 3 deletions(-) create mode 100644 input/20.txt diff --git a/README.md b/README.md index 9801e72..1aae072 100644 --- a/README.md +++ b/README.md @@ -31,7 +31,7 @@ Now located in this repository's wiki. | 17 | ~ 15 | | 18 | ~ 6 | | 19 | ~ 3 | -| 20 | | +| 20 | ~ 40 | | 21 | | | 22 | | | 23 | | diff --git a/app/Main.hs b/app/Main.hs index 7762ee4..a81d67f 100644 --- a/app/Main.hs +++ b/app/Main.hs @@ -30,4 +30,4 @@ import qualified Day24 import qualified Day25 main :: IO () -main = Day19.main +main = Day20.main diff --git a/input/20.txt b/input/20.txt new file mode 100644 index 0000000..e4f0cfa --- /dev/null +++ b/input/20.txt @@ -0,0 +1 @@ +^ESSESENENESESSEENNNENWNENEENWNNWWWSSS(ENENWESWSW|)SSW(SESSNNWN|)WWNNWWNEENENE(NWWWNWNNWNENEENWNENENWNNNNWSSWNWNENEENWNNWNEENWNNNWSSWS(SSWNWWWNNEENNNEE(NNENESSS(WNSE|)ENESESWWSES(W|SEENEEESWWSESSSSWNWWNNW(NEESSEN(SWNNWWEESSEN|)|WSESSSSEEEESENN(NNESSSENNNNENENWNENNWNWWNNNWSWWW(WNEENWWWSWNNNWWS(E|WNWSWSE(SWS(WWWWWWSSWWNNWSSWSEEESENENNESES(EENNW(S|W)|SSSSWSEENEESWSEEE(ENWWEESW|)SWWSSSE(SWWSSWSWWSSSESENNN(WSNE|)ESEE(SSWNWSSWSEENEESWSWWSESSSENNE(SSS(WWWSSSWWSWWNNNENNEE(SSW(N|S(WSNE|)E)|ENWN(WNN(ESNW|)NWN(NWWNENNNWNENWWWSWSESE(NN|S(ENSW|)SSWNNWNWSSWWWNEENNWNWWSES(WSWWWWSWNNEENNWSWWNNNEENWNWSWNWSWNNEEENNNWSWNNWWWWSEESS(E(EE|NN)|WWWSEEESWWSWWN(E|WSWWNNNWNWSSESWSSSWSEESESWWNWWNWWSESESSWNWWN(E|NWSWNWWSWSWWWWNNNENNENENNWNWNEEEEESESEENNW(NENWNNEENNEENNNENNNWSWWSE(E|SWSS(ENSW|)WNWWWSWSWNNENNESEEENNNNENWNWNNEES(EEENENNNWSWS(SWNWNNE(S|ENENNNESENENENWWSWWNNWNEEES(WSNE|)EEEESSW(N|SWSESESEESSWSSSSESSESESENNESEENWNNNNESENEEENNENEENWWWSWNNWWNENEENEENWNEN(ESSSSENNESESSENNEENWNEEESEENN(EESESEENWN(EESSSENENWNEESSEESSWNWWSSE(N|SWSWNNWWWNE(NWWWSESSSWWWSWNWSSESSSWWWNWWSWWSEEE(N|SWSEEEESSES(WWW(SS|NN(ESNW|)WWWNNWWWSSSSENNNESSES(ENESNWSW|)SSWWSESSWSESESENNN(WSNE|)ESESENENE(N|SSWSSSEESSSSWS(ES(WSEWNE|)ENNNE(NWN(N|E)|S)|WNWSWNNEENWWWNNEE(NNWSW(NN|WSWNWNWSSSWWWNWNWWW(SSSEEN(NWSNES|)ESESSENNEEESWSW(N|SES(WWNWWS(ESWSESW(ENWNENSWSESW|)|W(WWSNEE|)NNENWW)|ESE(S|NNE(S|NW(WSNE|)NE(ESSNNW|)NWN(WNSE|)E))))|NEEENWNWSWNWNNWWWSSWWNNWNNNEN(NWWWWSEE(E|SWWWWNWSW(NNENESE(NNWWNEENWWN(WSSS(WNNWW(W|SESWSW)|S)|ENWNNEENN(NW(SSWNNWS(NESSENSWNNWS|)|N)|ESE(E|SSW(N|SESW(WNNWESSE|)SESSE(S(WWNNSSEE|)E|N)))))|S)|SSSSESEENESSWSWWWN(WWNN(WSSW(W|SSEESSSE(NNN(NWWEES|)EEEES(W|ESE(SWW(S|N)|NE(EE|NNNNN(ESSEEEEE(ESW|NWNE)|W(SSSWSE|NWWW(WNEEEEE(NWWWWW|S)|S))))))|SWWW(NENWNE|SSEE(ENWWEESW|)SWWWWWWS(EEE|WWWS(W(WSEEWWNE|)NNENESENENWNE(EEESSWWNE(WSEENNSSWWNE|)|NWW(SS|N(E|W)))|E)))))|E(SEWN|)NNN)|EE)))|ESSES(W(WNSE|)SS|ENESENENWWWN(WSNE|)EEN(EENWNNWNEEEESSENE(SSSSSWNWNN(ESNW|)W(NWNEWSES|)SSW(SSEE(NWES|)SSS(SENNNNESSE(NNNEEN|E|SSW(SSE(NEWS|)SSWNWNN(SSESENSWNWNN|)|N))|WNWSWNNEE(WWSSENSWNNEE|))|W)|NENE(NNN(WWSS(ENSW|)SW(NN|S|WWW)|ENWNNE(N(WWSWNNWSSWNW(ESENNEWSSWNW|)|N)|SEEESWSW(S(SWNSEN|)EENEE(S(ESWENW|)W|NNNENENWN(EESE(SESWW(N|W)|NN(N|E))|W(N|SSWNWSS(ESSNNW|)WW)))|N)))|S))|WW)))))|S(EESSNNWW|)W))))|EENWNENE(SSS|ENWNWSWW(S(E|S)|WN(WSWNSENE|)EENNEEENESSW(SESEENWNNNENN(ESESESEESSESENNWNNWNNESENNNWSWNW(NEENENEENNN(WSSWNW(SS|WWNEEE)|EESWSESSW(N|SESWSSWW(NNN(NESSSNNNWS|)W|SSESW(WNSE|)SSENESESESENNNENWNNWSWS(WNN(W|ENEENNW(SWEN|)NENWNNNEESS(WNSE|)ENENESSWSSWW(NEWS|)SEEEESSWWN(WWSESWSEENESSEEESENENWNWW(NEENWNNEEESW(W|SEEESSSSWW(SEESWWSSESSSSESSWWWNE(NNNWWNNE(SEWN|)NN(N|WSWNWSWSWNWNN(EE(SWEN|)E|NWSSWSSSWWSSWSS(ESEESENEEENESENNWWWSWWWWN(EEENNW(WWSEEWWNEE|)NN(N|ESEEENESSWWWSEEEEESWSSSWWWWWSWSWW(N(N|E)|SSSSENNNESSEESSWSESWSSWNWSSSSEESWWSEEENENENWW(S|N(WSWNSENE|)ENESENENENESESWWSWSEEESWWSESESWSESWWSWSWSWWSWWWWSSSSESWWNWNWSSESSSESESWWNWWSSE(ESENEENNENEESEENWNNENWWSSWNNNEEEENEEENWWNWWN(ENESEES(W|ESENEEESESSENENNW(NENNWWWWNWWW(WSEEESES(ENE(SS|E)|WWWN(E|WWN(W|N)))|NNESENNESEESW(W|SEENNESSENNNWNNESENNWWWNNWSWNWNWWW(S(WW|ESSSW(NN|SSENEENEN(WW(S|N(N|E))|ESESWS(WNSE|)E)|W))|NEEEESEEENESSS(WNSE|)EESESSEESWWSWSEENESESWSWSEESESENNESEEEENWNNEENNNNWSSWNWSWSSWS(EE(NNEE|SW)|WNW(NNNNNW(NENESESSS(SW(SEWN|)NNN|ENEENNENWWSW(SEWN|)NNW(WWNENENNWNWSWWWSWWW(SESS(WNSE|)ENESENE(SSWW(SSENSWNN|)W|NEN(WWSWWEENEE|)E)|WNENNESE(SWEN|)NESENNNNWWSS(ENSW|)WWWSWS(SWS(E|W(SEWN|)NWNWWNEENNENNWWS(E|SWNNNWWWSEESSWNWWWSESSSWNNWNWSWSSSSW(S(WSNE|)EENEN(WNENWESWSE|)EEEEE(NNWW(SEWN|)N(EEEE|N)|S(ENESEWNWSW|)WW)|NNNNNNWW(SEWN|)NEEES(S|ENN(ES(S|EENWNEEEEENWNENNW(S|WNENWNN(W|ESENEESSSW(WNENSWSE|)SSENESSSESWWW(NNESNWSS|)SEEEESWSES(ENEE(SWEN|)NNENESENEENWWWWWWWW(SESSENNE(WSSWNNSSENNE|)|NENWW(NNENEENWNWSWSW(NNNE(NESEENWNWNENESES(EESESENNWNNNWSSWNWNNE(EENWNNESENNWNNWWWSSE(ENWESW|)SSWNWWWSSENES(EE|SWWS(EE|WS(E|SSWWS(E|WWS(EE|WNNNNNNESEESS(WNWSSE|ENNNNNNNNWWWNEN(WWWWWWSEEESSWNWWWNWN(WSW(NWWW(WWW|S)|SSEE(NWES|)ES(EE(NWES|)ESEEN(W|N(NN|EEESSWW(NEWS|)S(ESENSWNW|)WWW))|WWWWSEESS(NNWWNEWSEESS|)))|E)|ESEEN(W|EEE(EEEEESENESSSEEESEENESE(NNWNN(ESNW|)WWWSS(WNNWSS|E(ENWESW|)S)|SWSSE(SSWSSE(N|SSWSWWNNNWSSWSSWWSWSSWSES(WWWWNWNEESENNENNN(E(EENNNE(S|NENENE(E|SS(SS(S|E)|W)|NWNN(ESNW|)WWNWSWNW(NNWESS|)SSWSSEEEE(NN(ESSNNW|)WSW(N|W)|SWWWWSEE(SSW(SEWN|)N|E))))|S)|WSSWSWNW(SWWS(ESSEWNNW|)W|NENW(W|NE(ESS|NW))))|ENNNEEN(ESSSESSSSENEE(SSW(N|WSESSE(SWWSSWSSWNW(NENENWNWWS(ESWENW|)WWW(S|NEENNESENNNWSWN(WWS(ESSWNSENNW|)WWW|NEN(NNNESSSSE(NN|SSESS(WN|SEN))|W)))|SS(ESEEN(W|EE(SWSSS(W|E(SSSSSSSSSW(NNNWESSS|)WSSESSWWWSEESSWWSSWSEEESEE(NWNN(WWSEWNEE|)E(NNW(S|NENNNNW(ESSSSWENNNNW|))|S)|SWWWWSWSESWWNWNWNWWWNNWSSWWNNWNENENEESWS(WSSNNE|)EENNENNESSESWSW(SS(WNSE|)EEN(NE(NNNNE(NWNEEE(E|NWNWN(EESNWW|)WSWWWSWSEES(WWWNWNNWWNENNE(SSENES(SWSNEN|)E|NN(WSW(NNNNENN(SSWSSSNNNENN|)|WSS(ENSW|)SSSESE(N|SWSEE(ES(ENSW|)WWWSWNWNENW(NEWS|)WWSESWWSWWSEEENEES(E|SSSWNN(WWSESSSWNWSSSSSENEENN(WWSEWNEE|)NNESE(NN|ESWWSSSWSW(SWNWWNNNNWWNNNNWWWWN(WSSSESESWSWWWNEN(ESNW|)WNNE(S|NNWSWSW(NNENSWSS|)SSWSEE(SSSWWNENWWSWSSWWNWNNNENESE(SWS(WNSE|)S|ENWN(EENWESWW|)WWNWSSWSSWWSWWSESENENESSESWSESSWWSSSSSSEESESESWSSENESSESSWNWSWWSSEEEN(EENNEEESSSEEENNEESWSSSWNWWSWWN(NW(NENWESWS|)SSSESSEESSENESSENEENNNENWW(NEEENNNNWNENWWWNENESENEESWSESEENESESSWSSSESWSEEENNNW(SS|WNENENEESSESSENNNENWW(NWNNENWWSWSESWW(S|NWNNE(S|ENWNNWNWNENNNNNENNNENEENWNWW(S(SWSWSS(ENSW|)SSWNNNWSWWWNN(EESWENWW|)NWWWNNW(WSESWWSESENEESWSSSEEEN(WWNENN|ESEE(NWES|)SWWSWSSSESENESE(NNNENW(NEWS|)WSSWWNEN(SWSEENSWWNEN|)|ESWWS(WNWSWWNN(ESNW|)NNNNWWSWNWSWSSENESEE(SSSWNWSS(E|SWNWSSS(EE(NWES|)EESSESSWNWS(NESENNSSWNWS|)|SW(SEWN|)NNNWNWWWNW(WNEEEES(ENNNE(NNWWNWNNNWNENNWN(W(SWSSWSSW(SWSW(NNEWSS|)SES(ENNEEN(W|NNE(NNEWSS|)SSSE(NN|SSE(SS(ENNEWSSW|)WWWWN(EE(NNWWSE|E)|W)|N)))|W)|NNNENW)|N)|EEESE(NNN(ES|WS)|SWW(N|SESSS(WNNSSE|)EE(SWWEEN|)ENWWNEEE(NWW(W|N)|SSEEEE))))|SSS(S|EENN(WSNE|)EE))|W)|SSESEE(NWES|)E)))|N(W|N))|ESE(NENSWS|)SWW(S|N))))|NEE(EESSWWNE(WSEENNSSWWNE|)|NNNW(N(W(W|S)|E)|SS)))|E)|NEENEEEE(NWWWWEEEES|)SE(ESSSWNWN(WSSESEESWWWWSESSESWSEEEEENNWNN(EENENESESE(SWSESSWNWSWW(SEEEESWWWSEEESWSSE(SWSESWSESSSWWNENWWSSWNNWSSWWNNE(S|NNEEES(ENNWNNNE(SS|NWWNNWWWSWNWSWWNWWNEE(NWWNWSSSW(SEESS(WNSE|)EN(N|EESEEESESES(WWWSWNNE(E|NWW(W(WW|N)|SSS(SEE(ENSW|)SSSWSSSESSWSSSESWWSSENEEENEENNESSSWSESWWN(WSSESWS(WNWSWNWSWWWNWWS(WWWWWWNNWSWS(E|WWWNEENENNWWS(SWNWNNN(WSSSWNWSWSWNNNWWSESSWSS(ENESEEN(W|NEESE(SWWNSEEN|)N)|WWWNWSWWWNEENWWWSSWWWNEENNWSWWNNE(S|NNNWWNWNNNWSSSWNNWWSWSWSESEESSWWSWNN(EE|WSSSEEENEENENEN(ES(ENSW|)SSSSWNW(NENSWS|)WSES(EEENSWWW|)WWN(N|WWWWS(WWNNNNE(SSS|NWWWSESSWSWS(EENSWW|)WNNEN(E|WNNE(NEENESENE(SEWN|)NWWNENNNWSSWWSS(ENSW|)WS(E|WWNNNENE(SSWSNENN|)NWWWWSWWNNE(S|NESEENEENESS(SE(SWEN|)NNNENNESSSES(WWNSEE|)ENNNNNENESSSENNNNENWNEENWNENNNENNNWSSWNWNWSWSSEE(NWES|)ESSWNWSSWNNWSSWNWWWSWWWWWSWNWNEENWNWWWWNENWWNWWNWWWWWWNEENWNENWNWNEEEENNWNWNEEENWNNESEENWNNNEEEENNENWNNWNWNWWSWNNEENNWWS(WNWNEENNNN(ESSSSENEEEEN(WW|ESESSENESESEEESWSESEE(SSWWWSWSSWWSWWSSSENEEN(WW|NEESENE(SESSEEESENNENESEEN(ESEE(NNWSNESS|)SEEN(W|EEESWSSSSWNWWWSSSWSSWSEEE(NN(WSNE|)NEEN(WNWSNESE|)EENNNE(N(W|NNNWNW(NENENE(SSWSESENN(SSWNWNSESENN|)|N(WWSNEE|)NENENNWNENESS(EENEE(SWEN|)NWNEENESE(SWSWNSENEN|)NNNE(NNW(SWSWS(E|WSWNWSWNWSWNNWNNWNNWN(WWSSSSSWNNNNNWN(E|WS(WNSE|)SSE(N|SWWSEESSWW(NEWS|)SSS(EENWNEEEESSS(WW(NENWESWS|)W|ENE(EN(EEEESWS(NENWWWEEESWS|)|WNN(ESNW|)NWN(NNW(SSSS(ESSNNW|)WW|N)|E))|SSS(WNSE|)(S|E)))|WNWNENW(ESWSESNWNENW|))))|NESENENE(SSWSWSESE(S(S|W)|NN)|NWN(EEE(SWSE|NE)|W(NENSWS|)SS))))|N)|SS(ENNSSW|)S)|SSS(S|W)))|S))|S)|SSESSWSEENNE(NN(E(SSEWNN|)N|W(WNSE|)S)|SSSSSSWSESWWSESSESENNN(WSNE|)E(NWES|)SSSSWSE(EEN(WNNNNSSSSE|)E|SWWNNWNWNNWNNWSWSSWSEESWWWSEESENEN(NNWNSESS|)ESSSW(N|WWWNWWSW(SWWSW(SSWWSSE(SWEN|)NE(S|EEENWN(WSNE|)NEENE(N|EESWSS(WN(W(S|W)|N)|EESSSW(NNWSSNNESS|)SEESSENNESSSWWSEEENNESEEESSW(NWSW(N|WW)|SEESENN(NW(S|NENWNENWWNNESEENNW(NENE(SSSE(SESWW(WSEEES(WWW|EN(E(SSWWSNEENN|)E|NN))|N)|N)|NNWSWWS(E|WWWWSWSWWNW(NEE(S|ENNW(WS(WNWSSW|E)|N(NN|EESE(N|S(EE|W)))))|SSSEEN(EENEE(N(EESWENWW|)W|SWSWSW(N|SEENE(SESWWEENWN|)N))|W))))|S))|E)))))|NNN)|NNEN(W|NEN(NNNNNENEESS(W(N|SW(N|SS))|EENNENWN(E|WS(SS|WNWW(SEWN|)NEENWWNENN(ESSEWNNW|)WWWWSEE(SWWS(WNNWSSWNNWNWSWSWWWSEEESSEE(SSWWWN(NNWWSWWNNWSSSS(WNWNWSWNNWNNESENENNWSWWWNWWSS(WNWNENWWSW(NN(W|EEEEES(ENEENWWWWWNNW(SS|N(W|ENNEESEESWSES(WWNNW(SS|N)|ENEEESSENNEENNESESEEEEENESENENENNN(WWSS(ENSW|)SWWWWWS(WNNW(NWNW(N(EESE(SESENESEE(WWNWSWENESEE|)|N)|N)|WWSSSE(NNESEWNWSS|)SWWWWNW(S|NNE(NNNW(NNE(S|EENWNW(S|NNNW(NNWS(WNWNNESEENE(SSSESSEESW(W|SESENNNE(S|E(NWNNWSWS(WNNENWWS(NEESWSNENWWS|)|E)|EE)))|NWW(S|WW))|S)|SS)))|WSS(ENSW|)SW(SEWN|)WNNWNEESS(NNWWSEWNEESS|))|EESW(SEWN|)W)))|S)|EE)|EESSE(SWW(NN|SWSSES(ENN(ENWESW|)W|SSWNNWWSWSW(NNN(WSWWWWWSSSES(WWS(SS|WNNENWWN(EENWNEE(EEEE|N)|WWW(NNESNWSS|)S(WWSEWNEE|)EESESWS(SWS(ESNW|)W|E)))|ENENWN(EESEN|WS))|E(EENSWW|)S)|SEENEN)))|EEN(ESENN|WWN))))))|W))|SSE(E|N))|E(N|S(W|E(N|S))))|SENNEESWSS(WW|ENE(EEE|NNN)))|EE)|N(WNENWESWSE|)E)|S|EE)|E))))|W))))))))|WNWNNW(SSWSW(WWSEEWWNEE|)N|N))|NWWNEENW(ESWWSEWNEENW|)))|E(NWWNEENWNW(N(E|WWS(WNWN(ENSW|)WW|E))|S)|E)))|NNNWN(E|WWNWSWSESEE(NWES|)SSSE(NNN|SWWNWWNEN(ESNW|)WWN(E|NWWSSW(NWNWN(EE(S|EEE)|N)|SESEE(NWNNSSES|)SESE(E(EE|SSSESSWSSEE(N(NN|W)|SSESES(EEENNNWNW(N|WS(WNSE|)SE(ESWENW|)N)|WWNWWSSE(SS(ENE(NWES|)S|WWSWNWNNNWSWSESSSE(N|SWSSWSSWWNWSSWSWNWNENE(S|NWWSWWNNNES(EENWNNNNESENNWWWSSSSWNWWWSEESWWWSESSWNWSWWNWNWWSESSE(N|ESEEESENN(ESSSWWSSEEEENNNW(SSWWEENN|)NN(ESE(SESEEENESENN(EESSE(NNNEEN(ESEWNW|)NWW(S(WSNE|)E|NENE(S|N(ESENNW|W)))|ESSWNWSSWSWNWSWWNNWN(EES(S|ENEE(SWEN|)NN)|WSW(SWWWSWSEENESENEE(NWES|)SWSSENEEESSSSSSEEENNWSWNNEEENWNNWW(SESWENWN|)N(EENE(N|SSSESEENNEEE(EESSWWWSSEEEEEESSSSSWSESSWNWNNNWWWNWSWNWSWWWN(ENWNEENEE(SWS(WSNE|)EEEEEN(ESS(E(NN|S)|WW)|WWW)|N(NNEEE|WWWSW))|WSSSESSSSENENNNN(EESENESENESSWWSSSWWNNN(ESSNNW|)W(SSSSW(N|SSWSSSWSWNNNE(S|NNWN(EESNWW|)WSWNWSSSESSE(SSWSESWWWWSSEEESEENWN(EESSSWS(WNWSWNNWWSS(ENSW|)WWWNNESENNNNNWNEESENE(S|N(E|WWWWNENENE(SESWWEENWN|)NWWWS(E|SWNWWSSWWNWWNEEE(NEENNEENWWNENENNWWWSE(E|SWWNNNWWSWNNEEENWNEENNWWS(WWSS(ENSW|)WSSSSWWNWNEE(NNWNENNWNNWWW(SEESWSSSS(E(NNNEWSSS|)E|SSSSSW(NNNNNNNNN|SEEEESWWWWSESEEN(ESE(NEEE(SWWEEN|)EENWWNEN(ESNW|)WNN(N|WWSESSWS(E|WNN(NWSWNW(S|N)|E)))|SWWWSWNW(SSSEEN(W|ENEESWSWSWSSSWSW(NNENNWS(NESSWSNENNWS|)|SSEES(WW|ENENWW(NEEENWNW(S|NENENESSWSEEEEENEE(SWSWSE(SWSWS(EENSWW|)WWNENNN(ESSNNW|)WSSW(NN|WSESWW)|ENE(S|N))|NWN(ENWNSESW|)WWS(WNW(NW|SSEE)|E)))|W))))|N))|W)))|NENNNW(SS|NEESEEENNE(SE(SSW(WWWSW(N|SEENESESSS(ENNENEN(ESSWS(W|EESENEN(WWNENW|ESSWSWSESSS(EEEENESE(SWWWWSEEEESSE(NN|SWWNNWWWW(NN|S(W|ESWSS(WWSNEE|)ENE(NENWESWS|)S)))|NNWWWSWNNW(SS|NENE(NWNNES|SS)))|WWWNEN(ESNW|)(NN|W))))|WW(S|W))|W(NNWSNESS|)SS))|N)|E)|NNWSWNWWNN(ESEEEWWWNW|)WW(NN(ESNW|)NNNNNENWNNNNESSEESESSENENNW(WNNWW(SEWN|)NENWWW(SEWN|)NNENNNW(SS|NEEEENEEENWN(EN(ESE(N|SWSEEESESSWNWWN(E|WWWWSSEEE(NWWEES|)SWSEEESSWSWSSW(WWNEENNEN(E|WWSSWWNENNWN(EESNWW|)NNWWSESSS(E|W(W|NN)))|SEEEE(NWWNENEENNNN(W(WWNEWSEE|)SSS|ENNESSENENWNNNW(WS(SENSWN|)WNWNWS|NEN(WNSE|)ESEE(NWES|)EESESSENESSWWSSESWWSWSEENESE(S(ENESNWSW|)WS(ESSW(SEEWWN|)N|WNWWS(WWWS(SSSSEEE(NWWNENWNEE(WWSESWENWNEE|)|SSWNWSWS(WNN(WNEWSE|)E|ES(W|E(NEWS|)S)))|WWNENNESENNE(NNNW(NENNWW(SEWN|)NEEESSE(N|SWSESWS(NENWNEWSESWS|))|SSW(N|WWS(EE|SSW(NNN|SW(SEWN|)W))))|SS))|E))|NNNN(E|W))))|SWWWWS(EEEE|SWS(SSW(S|NNWWS(ESNW|)WWNENENWNW(ESESWSNENWNW|))|E))))))|W|N)|WSWNWWSS(ENSW|)WNNW(SS|NNNNNNE(S|NEN(E|WN(W(SS|NNE(NNW(NNENWNENNENNESSE(NENWNWNWWS(SW(S(SS|E)|NNNEENNWNNEES(ESWSSENESESW(SEENNESSSENNNNWNWW(SEWN|)WNEEENNWNENWNNENNNWSSWNWNNNES(S|ENN(WWWSSSWWWNNESENNWWWSSSSSENESEE(NWES|)SWSWWW(NEEWWS|)SSENESS(ENEN(W|EN(W|N(N|ESSSSW(S(WNSE|)EE|N))))|WWSSSSE(WNNNNEWSSSSE|))|EESS(WNSE|)SEESENE(SSSWWWW(S(W|SE(NEE|SSWN))|NNESEE)|NWWNN(WSS|ES))))|W)|W))|E)|SSSSEEN(W|ESE(NN(W|E(NW|SEN))|SSS(S|WWNENWWWWW(SEES(ENSW|)WW|NNNNESSS(NNNWSSNNESSS|)|W)))))|S)|S))|E))))))|S)|SESWSEEES(SENSWN|)WWW))))|S)|E))|S))))|EENEEENWNNESENESSESEES(EEENWNNWS(S|WWNENENESESEEEE(SSSWWWNN(EESWENWW|)W|NWNWNNWNNWWSWSEE(N|S(WWWNWWNEENENE(EEESSE(NNNEWSSS|)SSE(E|S)|NWNNE(NWWSWNNEN(WW(NEEWWS|)SSSWWSESESWS(EENNN(ESSNNW|)W|SWNNNWNN(NEEWWS|)WSSWSESWSEE(SSWNWW(N|SES(W(WWNNES|SSSENN)|EEENE(NWES|)SEE(E|SWS|NW)))|NN))|EES(E(S|NENWNNEENNN(WSW(SEWN|)NN(E|NNN(WWW(NN|WWW)|E))|ESSESSSWN(W(W|SSS(E(S|NEE(SWEN|)ENWNEEE(SWSEWNEN|)NWNEEEENNEESWS(EENNN(ENSW|)WWWWNWSSESWWWWSW(SEWN|)NNW(S|NEESENES(NWSWNWESENES|))|SWWWSEESSS(NNNWWNSEESSS|)))|W))|N)))|W))|S))|SE(SEWN|)N))))|WWWNW(SWWWEEEN|)N))|WWW)|NNN(E|W))))|N)|W(W|SSS)))|NWWWWS(WNSE|)S))|WWW)|NN)))|W)|N)|NWNNES)|WWW))|S))))|N))))|N))))))|E)|WW)))|S)))|EEE))|WW(N(WWNENSWSEE|)EE|S)))))|EENESS(WWSNEE|)EENWNNESEESWSSEESW(WWNSEE|)SSEEENE(S|ENNENNNWSWS(E|WW(NENWW(SSWENN|)NNNE(EESS(WWNEWSEE|)(EEESEE(NE(S|NNN(NWSWSS(ENSW|)(WN(WSWNSENE|)NNNE(NWN(W|N)|S)|S)|E))|SSWSESES(ENENESSW(ENNWSWENESSW|)|WSWNWWNE(NNNEWSSS|)E))|S)|NWNNWW(SESSSSWNWWNEENWN(SESWWSNEENWN|)|NNNEEE(SWS(WN|ESS)|N(WWWNSEEE|)E)))|SS(SW|ENES)))))|E))|E)|EEEEENE(S|NNWNENNNNNNNWWSWWNENEENWWWN(EEEESS|WWSSSW(NNWNEWSESS|)SEE(S(SSWNW(SS|N(WSNE|)E)|EEEE(SSW(N|SESWSSS(SWWNEWSEEN|)E)|N))|NN(E|N)))))|N)|W)))|ENNNW(S|WN(ENWESW|)WWW)))|NNNNEENWNEE(NN(WSWENE|)E(NNNN(WSNE|)E|E)|SESSWN))|E(EEEEE|S)))|WW))|N)|NENENW(NEWS|)W(S|W))|NNNW(S|NENWWNENWN(EESSNNWW|)WSSSWWSW(N|SSE(SWEN|)NE(EENWWEESWW|)S)))|WSSW(NNWS|SEE))|E)|N))))|S))|SSSWNWNW(S|N(WSWN|N|EES)))|E)|WW))|NN))|ENWNN(W|NEN(W|ESSWSESSEENWNNNNN(EEN(ENESESSSWWN(ENWESW|)WWSES(EE|WSESSSENESS(E|WSW(SEWN|)N))|W)|WW))))|N))|N))|N)))|E))|E(NN(EE|W)|SS)))|S(SS|EE))|SSS(ENEEWWSW|)(W|S))|W)|N))|NN))|NNNW(NE|SSWN)))|W))|NN))|NWWNNENE(SSWENN|)NNWN(ENSW|)WW(WNSE|)SSE(SWEN|)(E|N))|W)))|N))|SSWS(WN(NEWS|)WSSSSS|E))))))))))|S)|W)|S)|S)|S))|SW(WSSENSWNNE|)N))))|WWW)))))|E))|S))|SSS)|S(S|W))))))|S))|WSSE(E|SWWWNWS(WNNEEES(NWWWSSNNEEES|)|SSSWS(W(NWS|SE)|E))))|N))))|W)|WNNNENWWNE(E|NWWSSS(E|W(NWWN(EE|NWW(SSENSWNN|)WWNEEENWWWWNE(N|E))|S))))))|E)|NNWNEESS(NNWWSEWNEESS|)))|S(WNSE|)E)|E))|SE(N|S)))))|SSS(WN(W|N)|S))|NWW(NEEWWS|)SESWWWN(WSWSEE|E))|WW)))))|EE))|W)|W(S|WWWWWSW(SE|WWNEE)))|WWWWWSEES(ENSW|)WS(E|WSWSWWSSSWSEES(ENNWNE(NWES|)ESSE(NN|S(ENSW|)W)|WSWWWW(NENNE(SSEWNN|)NENNNENE(S|EN(NNWWSWWN(E|WWSESES(ENEENSWWSW|)SSWWNW(NN(ESESNWNW|)NNWWWW|WSESEE(S|E)))|E))|SESENEESWS(W(W|S)|E)))))))|E)|W))|S))))|E))|E)|E))|EESWSE)|N(E(NW|SENE)|W))|ENWNNEN(EN(WNSE|)ESSWS(S|W)|WWSS(W|S)))|NN))|E)|E))|SSES(WWSNEE|)ENN(ESSEES(WSESSWNWSSE(WNNESEWNWSSE|)|E)|W))|WWWWNE)))|SSW(SSWWEENN|)N)|E)|SSSW(SEWN|)N)$ diff --git a/package.yaml b/package.yaml index b350a4c..0c38a01 100644 --- a/package.yaml +++ b/package.yaml @@ -27,6 +27,7 @@ dependencies: - matrix - vector - array +- parsec library: source-dirs: src diff --git a/src/Day20.hs b/src/Day20.hs index ab47399..a480945 100644 --- a/src/Day20.hs +++ b/src/Day20.hs @@ -1,6 +1,78 @@ module Day20 (main) where +import Prelude hiding (null, sum) +import Data.Foldable (foldl', toList, sum) +import Control.Applicative ((<*)) +import Text.Parsec (Parsec, eof, try, choice, many1, sepBy1, (<|>)) +import qualified Text.Parsec as P (parse) +import Text.Parsec.Token (makeTokenParser, parens) +import Text.Parsec.Char (char, endOfLine , oneOf) +import Text.Parsec.Language (emptyDef) +import Data.Map.Strict (Map, empty, unionWith, unionsWith, fromList, insert, filterWithKey, (!)) +import Data.Set (Set, singleton, null, union, unions, size, (\\)) +import qualified Data.Set as S (fromList) + +type Parser = Parsec String () +data AndPath = Simple String | OrPath [Path] +type Path = [AndPath] +type Graph = Map Coordinate (Set Coordinate) +type Coordinate = (Int, Int) + +(//) = div +dirs = many1 $ oneOf "NEWS" +pars = parens $ makeTokenParser emptyDef + +parser1 :: Parser Int +parser1 = char '^' >> parserRec <* char '$' <* endOfLine <* eof + where + parserRec = sum <$> (many1 $ choice [length <$> dirs, pars maxSubexp]) + maxSubexp = do + lengths <- sepBy1 (try parserRec <|> return 0) (char '|') + return $ if any (== 0) lengths then 0 else maximum lengths + +parser2 :: Parser Path +parser2 = char '^' >> parserRec <* char '$' <* endOfLine <* eof + where + parserRec = many1 $ choice [Simple <$> dirs, pars subexp] + subexp = OrPath <$> sepBy1 (try parserRec <|> (return $ [Simple ""])) (char '|') + +parse :: String -> Parser a -> a +parse input parser = case P.parse parser "" input of + Left e -> error $ show e + Right r -> r + +pathToGraph :: (Coordinate, Graph) -> Path -> (Coordinate, Graph) +pathToGraph cg [] = cg +pathToGraph cg ((Simple str):rest) = pathToGraph (foldl' addEdge cg str) rest + where + addEdge (coord, graph) dir = + let newCoord = step coord dir + newGraph = unionWith union (fromList [(coord, singleton newCoord), (newCoord, singleton coord)]) graph + in (newCoord, newGraph) + step (x, y) 'N' = (x, y + 1) + step (x, y) 'E' = (x + 1, y) + step (x, y) 'S' = (x, y - 1) + step (x, y) 'W' = (x - 1, y) +pathToGraph cg@(coord, graph) ((OrPath paths):rest) = + let newGraph = unionsWith union $ map (snd . pathToGraph cg) paths + in pathToGraph (coord, newGraph) rest + +-- bfs :: graph -> map from distances to rooms with that minimum distance +bfs :: Graph -> Map Int (Set Coordinate) +bfs graph = bfsRec (fmap (\\ initialRoom) graph) 1 initialRoom (fromList [(0, initialRoom)]) + where + initialRoom = S.fromList [(0, 0)] + bfsRec graph n coords distances = if null coords then distances else + let coordsReachable = unions . map (graph !) $ toList coords + newDistances = insert n coordsReachable distances + newGraph = fmap (\\ coordsReachable) graph + in bfsRec newGraph (n + 1) coordsReachable newDistances + +part2 :: Path -> Int +part2 = sum . fmap size . filterWithKey (\k v -> k >= 1000) . bfs . snd . pathToGraph ((0, 0), empty) + main :: IO () main = do input <- readFile "input/20.txt" - print input \ No newline at end of file + print $ parse input parser1 + print . part2 $ parse input parser2