From 4b69139ad3c866105f1bd717bebfa7ea9fed1c29 Mon Sep 17 00:00:00 2001 From: Neil Smith Date: Thu, 24 Jan 2019 10:33:45 +0000 Subject: [PATCH] Partial progress on day 20 --- advent-of-code.cabal | 13 +++- data/advent20.txt | 1 + src/advent20/advent20.hs | 127 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 140 insertions(+), 1 deletion(-) create mode 100644 data/advent20.txt create mode 100644 src/advent20/advent20.hs diff --git a/advent-of-code.cabal b/advent-of-code.cabal index 3e787cf..7a9d811 100644 --- a/advent-of-code.cabal +++ b/advent-of-code.cabal @@ -226,4 +226,15 @@ executable advent19 , containers , mtl , text - , megaparsec \ No newline at end of file + , megaparsec + +executable advent20 + hs-source-dirs: src/advent20 + main-is: advent20.hs + default-language: Haskell2010 + build-depends: base >= 4.7 && < 5 + , containers + , mtl + , text + , megaparsec + , linear diff --git a/data/advent20.txt b/data/advent20.txt new file mode 100644 index 0000000..2945cf8 --- /dev/null +++ b/data/advent20.txt @@ -0,0 +1 @@ +^EESWSWWSSSENNEESWSEEENNW(S|N(ENNNW(NENNESSENENNESESENESENNNESENNNNNWSSWNWSWNNNNNWSSSWSWWNENENNNEEENNWWNENWNWNWSSWSSSWSSSS(ENNNE(NNE(SEEWWN|)N(W|N)|SS)|WSSWWNENWWNNENNWWNNNEEENENES(ENNNWNEENEENEEESSENNENNWSWWWWNWNWSWSWSWWNWWWWNNNENEENEEENWNENEEENWNEEENWNENESSENNNWNNNWWWNNENEESWS(EENNNWWWWNNESEEENESSSEESENNWNNESEESESSWNW(SSSSESWWSWSWNW(SSSEEEN(WW|EN(W|NESSSSSSWWSEEENENESEEENNWSWNWWW(S|NENNNNENWW(NEN(WWSNEE|)NEESEEESWWW(WNSE|)SEESENESSSEEEESSWWSEEESWSEENNNWNENNENWNNEES(EEEENNWWNNWNNWSSWNNWWSESWWNWWNNWSWWWWWWNNNEEEEES(EEEEEN(WWWW|EESWS(WWSWNSENEE|)EEEESENEENWN(EEEEESWWWSEEEEESSWNWWWSSENESSWWSSENESENNNEEESEENENE(SSWSESSSWNNWNWWWW(NEWS|)SSWSSSESEENNW(N(WSNE|)ENN(WSNE|)ESSSSEN(NN|EESWSWWSWWSWSSENESSSSSEENNEE(SSSW(SESWSESWWNWSSEEESSSSWSESWSWNWNENWNWNEESENNWWWWNNWSWWWSSWWWSSSSSWNWNWNNENNWSWSSSWSWWWNWSWWWSWNNWNENNESSENENENWNNWWNENESEEEESSWSSW(NNN(WSNE|)E|SWS(WSWWEENE|)EEE(SWEN|)N(W|E(NN(WSNE|)NE(ENENNNESSSENENNNNNEENENWNWSSWNNNEENWNNESESE(SS(WNSE|)SSEE(NWES|)SSSWNNWSW(WWSESEE(NWES|)EEEEE(NWWEES|)SWWWWS(EESSNNWW|)WSWNWSW(NN(N|EEE)|SSWN(N|WSW(NWES|)SSS(S|W)))|N)|N(NWNNNNWWSWW(SWWSESWSWNWWW(NENEN(E(SSWENN|)EE|W)|SEESESWWNWSSSEESENESEE(SSWWWN(EE|WSSSE(NEEESS|SSWW(SEWN|)N(NNWNNWSSSS(ENSW|)WNNNNWSSS(WWWSWNWWSWNWWNEEEENWWNENEES(SSEENE(NWW(NNWW(WWSWNWSW(N|WWWSWSSSEESWSESSEENNW(NE(NNW(S|NW(WSEWNE|)NEEEESWW(EENWWWEEESWW|))|ESSEN(EESSW(SWW(NEWS|)WWWWSWSEENESESSSENNESSENE(SSSSSENN(ESSSSSWWSSSEENEEEESWWSESWWSWSSEEN(W|NESESWSWSSESWWWSSSWWSSWSEENEN(W|ENNESENN(EEEENENNNWNENNEESSW(SEEENWNENESEEESSWWSESWWWWSWSSWN(WSWSEEESSWSWSWSWWWSSEEEESWSESWSWWNENNWSWWN(E|WWSSSESWSEESWSWWN(WSSSESENESEESWSEEENNESENENEESWSEESSESWWNWWWW(NEE(EE|N)|WWSSESWWNWWSSE(SENESEESWWWSSWWWNEN(ESNW|)WN(NWSWNNEENNEEN(ESNW|)WWWSWNWNNN(WNNE(NWNNNEENE(SSWWSNEENN|)NWNNWNNESE(NNN(WSWNWWSWNWSSSSWNNWNWWNWWWWNENNNENNENNWNEEESSEEENNENWNNEES(SEESSSE(SSWNWSSWNWWWN(WSSESWWNWN(ENWNNSSESW|)WSSESEESS(E(NEN(W|EE(SWEN|)N(WWNEWSEE|)E)|S)|WNWWWN(N|E))|EENE(S|ENNWSW))|NNN(EESSWN|NWNNW(WNWWNWSWSE(EE|SSSW(SESWENWN|)NNWNWSSS(ENSW|)WNN(WWSS(ENSW|)SWSWSSWNWWWNN(EEN(W(N|W)|EE(SWSWWEENEN|)E)|WSW(SSSSSENNEN(WNSE|)EESSSSENNNEE(SSSW(NN|SWWSWWNN(WWSWSESSWNWNWNWN(EE(S|E)|WSSSWNWSSEEEN(N|ESESSWNWWWWSESSWNWWNNE(NWNENWWNNWNNNNEENWWWNEEEENWWNWWWWWNNNNNENWNNEENNNENWWSSSWWWNWNEESENNNNWWNNESEEESWSEENNNENWNNWWWSWS(WNWNNWSSSWNWSSWSWWSSWWWWSSESWWWNWWNEENE(SS|NWWSWWSWSWSSWWSSESSSSSWWSSSSSSEEENNESSSWSESEENWNEEEESWSESSENENWNNNENNNWSWS(SWWWNNESENNWNENWWWSWS(E(ENSW|)SSS|WWSW(SEWN|)NNEN(E(NNNEENEEESENNWNENESEESENNESESWSSWNWSWW(NENWESWS|)SWWWS(EEEENEESWSS(WNWSW(S|N)|ENESSENEENNNEEEENNNNN(ESSSSSSSSWWWNW(SSWSEENESSSEEESWWWWSWNWWSWNWNWW(SS(WNSE|)SESESEESWWWNW(N|SSWSWWWWNNNE(SSEEN(ENSW|)W|NW(WWSESSWNWNNWSSSSSSEESEESSWNWSWNNWWWNWWSWWNWSWWWWSSSEENEEN(WWWSNEEE|)EESSSESWSSEEN(NENNW(S|WNEEESE(NNWWW(N|W)|ESWSSSWN(NN|WSSWWSSWNWWNWNNESE(SEWN|)NNWWWN(ENEE(SWEN|)N|WWWNWSWWSWSESWWW(SESESESSSWWW(SSSSSENEESSW(N|WSW(SSESSW(SESWSSSESWSSESSS(WNNSSE|)EEEENNNNWSWW(SEESWW|N(W|NE(NNESENNWNEESESSW(S(WW|ESSSSENNNNNNNNWNWWNNENEENNNESSSENNNEEESSSSSWNW(NNNESS|WSESSENEEEENWNW(S|NNEEENWNWNW(SSEWNN|)WNEENWWNNNEENEEENNNESSSSSWSESENESSENNENNNNWNWNNW(NNENNN(WSSWSSSWWSWWSS(EENWESWW|)WSWWSWNWSWNNEN(WN(WSSSSWNWNNWW(NWN(W|ENESES(E(NNEN(ESSWENNW|)WW(WWNEEEE(WWWWSEWNEEEE|)|S)|SS)|W))|SSSSEN(ESEESWSSENEENN(WSNE|)ESSE(SWS(WNWSWWSWNNWNW(WN(EEESNWWW|)WSWNNEE(WWSSENSWNNEE|)|SSESWSEEESWWSWWW(N(E(NWES|)E|W)|SEESWWSSE(NEWS|)SWS(WNSE|)S))|E)|NN)|NN))|E)|EES(E|W))|EEENENWNNW(WWN(EEEESSEENWNENENEEEEESWSSWNNWWSESSEESWSSWSSSENNESENEEESENENENNNEENEE(NNNWNWWNE(E|NWWSWSESWWSWWW(SWSSSSWSEEENWNEESSENNE(S|NWWNN(WSWSEWNENE|)EENEES(EN(NW|ES)|SW(N|WW)))|NNENNN(WWW(N|WW(WNWNSESE|)SEESE(ENW|SW))|ESE(SWS(SWEN|)E|NN(WW|EES(WSNE|)ENE(S|NNWSWNNWWNW(NEESEE(N(W|EE)|S)|S)))))))|SWSWWSSESWSSWW(NENSWS|)WWWNWSWSW(SWSWWWWNENNWSWSSSSWW(SSSENNEENEN(EESSSEENESENNWWW(S|NENEEENEN(WWSWENEE|)EESWSEEESWWWSEEESSSSSESWSWNNNNNWWWW(SSSESENE(SSSEEEEESEENWNNWNW(SS(E|W)|NNESEES(W|SSEESWSSWSSWWSSESSWNWWNENWNNNN(WWSSSSSE(NNNN|SWSEESE(ESWWSWNWN(E|WNNNWWWSWNNEENWNNWNNEEE(NWWWWWWSESE(SWSWNWN(E|WNNNNNN(NW(NENSWS|)SSWNNWSSWWSSSW(SEESSSWSWSESWSWSESSSWNWSSSSEEENEENENEEEESSENEENWNENN(WSWS(WNWWNWSS(WWSWNNENNW(NEENNNESEN(ESEESSE(NNNESNWSSS|)SWWW(SEEWWN|)NENWWSW(S(WSSNNE|)E|N)|NWNNWSW(NNWNEEN(ESSWENNW|)WW|S(SSWSEWNENN|)E))|SW(SSSS(WSWNSENE|)E|N))|EE)|S)|EEE(NWES|)SWSSW(SSEEENW(W|NE(NWES|)ESESENESESEESS(EENWNNNNNEESWSEENEENWWNWNWWW(S(EE|WSESWS(SEN|WNW))|NENWN(ENNEEEEEESWWWWWSESS(WNSE|)ESENESEENWNWWN(WSNE|)EEESEEESSWW(NEWS|)SWW(SESWSESEESSENNNEENENESSENNNNESSSESWSWWSWWSW(NNEENSWWSS|)S(WWWWWWWWWNNESENEN(W(NE|WWWS)|ESES(ENSW|)WW)|EENESEENEN(WWSNEE|)NENESENNWWNEEESSESSEEENWNNNNEEEENENWWWWNENEENNESESESW(SSENENENNESSSENENWNNWWN(NEN(EENESSSEEESEEESESSSSSENEESWSSSEESWWSWNWWWWWSEEEESES(ENENESS(EEENNWSWNNEEESSE(SWEN|)NNNWWNNWSSWNWN(WSNE|)ENENNWNWS(S(S|E)|WWNENWW(NENEENNNENEENWNNNNESESWSESSSSSSE(SWSSW(NW(S|WN(W(W|S)|NENE(SSWENN|)NW(NE|WS)))|SESE(NNN|SSSWNNWN(SESSENSWNNWN|)))|NNNNNNNNNWNENNWWWNENEE(SWEN|)NWNENNNWSWWWNWSWWSSESSSWWNENWWSWWWW(SESSESSSEENWNNNWNEESSEEN(W|ESSSSWNNW(W|SSSSEEEE(SWSWNWSSWSS(W(SEWN|)WNENNENWNNWWWNWSSSESWSEE(SSWNWWWNNNE(NWNENWWN(E|WSSESSWNW(NNNWESSS|)W)|SS)|ENWNN(ESNW|)W)|EEN(W|N))|NNNNN(ESENEWSWNW|)W(NNE(S|NWNNN(W|EEE(E|SSW(NWSNES|)S)))|SSSSWW))))|NNWSWNWNEEEEENWNNNWSWWNENENWNNWNN(ESENEESENESENNWWNENENWNWNN(WWWSWSSEESSE(NENWNNWSW(ENESSEWNNWSW|)|SWWNW(NE|SW))|ESENEESWS(W|SENESEESENNNNESE(NNNWWS(E|WWNENWWWNNWSW(NNWNENENESENNWWNEENWWWNEEENEEENESE(NNN(WSWWWNWWWWNWNEESENENN(ESSS(ESEWNW|)W|NWN(E|WW(NEEWWS|)SWSS(ENE(ESWENW|)N|WSW(NNENWESWSS|)SESWSWWN(E|WSSSSWNWWNNNWSSWNWSSEESSWWWS(EESWSSEEN(W|EESS(W(WWSW(NW(N|S)|SE(ENSW|)SWSWS(W|EE(S(EN|SWNWS)|N)))|N)|ENNNNWW(WSEEWWNE|)NE(NWES|)EEEESSENNESE(SWSWWSWW(NNE(NWES|)S|S(S|EEEE(SWEN|)N(ENENNSSWSW|)W))|NNNWN(WSWW(NE|SEEE)|EEEN(EES(WSWWEENE|)EE|WW(W|N))))))|WNWSW(WWSNEE|)NNNESENE(SEEWWN|)NWNENN(EE(SWEN|)EEEE(NWES|)(E|SWSSEN)|WWS(WSESWENWNE|)E))))))|N)|SWSESSWSSWWW(SEESEE(SWSESWWNWWNW(N(EESEWNWW|)WN(WSNE|)E|S)|N(W|NN))|NEENWNE(E|NNWWS(SS|E))))|SESES(WWWNEWSEEE|)E(SEESW(SEWN|)W|N)))|SWSSE(SSSSWNNWSWSESSWWSSSWNWSWSE(EEESENNWNEEE(SWSEWNEN|)NNNWSSWW(EENNESNWSSWW|)|SWWSWSS(ENSW|)W(SWNWSNESEN|)NNNWNNNEEE(SSW(WNEWSE|)S|NWNEEENE(SSWWSNEENN|)E(NNWNWW(N(NESENESSENEE(WWSWNNSSENEE|)|W)|SS(SWWWSSWW(S|NN(ES|WS|N))|E(N|E)))|E)))|N))))|WSWS(ESSS(ENNSSW|)SSWSWWWW(NW(S|N(WNSE|)E)|SSENEEE(ENEEESWW(EENWWWEEESWW|)|SWSES(SWNWSW(NN(ENSW|)WSW(SEWN|)(WWW|N)|SS)|E)))|WWW))))|SS))|W)|WWNWWWS(WNWWS(E|WWWWWWWNENWWSWWNENNEENWWWN(EENEES(SESS(W(N|WW)|SENNNNWNEEEN(EESWSSENENENWNW(W|NENWNWN(NNWSWENESS|)EESE(EESSEE(NWNSES|)SWWW(NNWSSNNESS|)SESEE(NWES|)SWWW(N|WSES(EEEN(WW|ESENNW)|WW(WWSWW(SS(WW|ENE(S|EEN(ESNW|)W))|NENWNE)|N)))|N))|WW(N|W)))|W)|WWSES(ESWSSS(WWWN(EE|WWS(WWW(W|NEEN(ENSW|)WW)|E))|EEE)|W)))|EE))|W)|WSS(WNNW(WWWSSWNWNENNESENNWWWSSWWWWWNNWNEESENEE(NNWSWNNWSWWNWSS(EEE|WNWNWWWWWWSSENESSSESENNEE(ESE(N|SESSWWWWSWSWWSSENEEEEESESWSW(NNWSWW(NEWS|)WSWW(N(NNNNEENWN(NWWSWNNN(ESENSWNW|)NWNENWNEEEENWNENEEEESEENWNWWWWWNEEENWNEESEES(WW|SESSENESSS(ENESEE(NWNN(ESNW|)WNENWNNWWSESS(SSEWNN|)WWN(E|NNW(SS|NWSWNNENWWSWS(WWWSESWWNNWNEEENNNWWNEENNEEEEN(EESWSESWWSWNN(E|WSSW(NN|SE(SWSNEN|)EEEEN(W|EN(NN|ESEEES(ENN(ESSNNW|)NNWSSW(W|NNNEEN)|WSWWW(NEEWWS|)WSESENESEE(SS|N(W|N)))))))|NWSWNWWNWSS(WNWSSWNNW(SSWSSW(NN|WWSWW(NNESNWSS|)SWWWNWWSW(SEE(N|EEESSSENESEENNNN(NEEEENN(WSNE|)E(ENESNWSW|)SSSWS(EENESNWSWW|)WWSEESSESWSEESSWSWNWWSWNNNWSSSWWSWNWNENNESE(SWEN|)NN(WWWSSWSWSSWNWSWW(NNNNN(WWSEWNEE|)ESEES(ENNWNW(S|WN(WSNE|)NESEEE(NWWEES|)S(SS|W))|SWW(NEWS|)S)|S(EEEES(W|EEEESSENNENN(EE(E(EE|N)|SWSESWWSSEE(NWES|)SSE(NN|SSW(NWNWN(E|WNWW(SESSS(WWNENSWSEE|)EN(ESEWNW|)N|WNW(NEESNWWS|)S))|SEEE(N(ENSW|)W|SWW(SEEWWN|)W))))|WSWWWWN(E|N)))|SS))|EENN(NNNEEWWSSS|)EESSSW(SEEEWWWN|)NN)|WSS(WWNENSWSEE|)S))|W))|NN)|EE))|E)))|S(E(SSSWNN|EE|N)|WW))|W(WWW(N(EEE|WWWW(SEEE|NEE))|S)|S)))|EE(S|ENNESES(E|W)))|E)|SWWSES(WW(SEWN|)N|ENENEEN(SWWSWSNENEEN|)))|S(EEEN(NNNNESSEEE(NN(ESNW|)NWSSWNNN(EE|WSW(WS(S|WWN(WSWENE|)E)|N))|SWWWSSENE(EEEE|SSWSESS(NNWNENSWSESS|)))|W)|S)))|NWNWSW(N|S)))|SSW(WW|N))|S)|S))|W(N|WW)))|WW)|W))|WWN(WSWWNEN(WW(SSWWWNN(EESWENWW|)WSSWWWWNN(WNWW(NEEWWS|)SSWN(N|WWSES(WWWWN(EE|WWWNENNWSWWNWNENNNN(WWWSSSSSSE(ESSS(WNWSWWWWW(NNNNESSEEE(SWWWEEEN|)(NWNNE(S|NNWN(ENSW|)WWW(NENWNW(S|W(NEEWWS|)W)|SEES(S(WWNEWSEE|)SS|E)))|EE)|WWWNNNN(SSSSEEWWNNNN|))|ENNESSEEE(WWWNNWESSEEE|))|NNNENWNE(WSESWSNENWNE|))|EEENWWNW(NN(ENNNEESSW(SEESE(NNWNNN(ESSES(ENSW|)S|WWN(E|WSW(S|NW(NNWN(WSNE|)ENE(SSSEWNNN|)E|S))))|SW(WWN(W|E)|S(E|SSS(E|WWW(NEEWWS|)SS(ENESNWSW|)S))))|N)|W(S|W))|S)))|EEEENWN(SESWWWEEENWN|)))|ESEENWNE(WSESWWEENWNE|))|N)|E)|E)))|NN))|NN)|EESSS(ENENWNEESSS(E|W)|W(SS|NN))))|N)|SSS(WNNWESSE|)SE(SWEN|)NNN))|N))|ESES(WS|EN))))|NWWNEE)|NNN(WW|E(SSEEEWWWNN|)N)))|W)|NNW(WNENW(NNEES(W|E(SS(WNSE|)SS|ENENNNESE(NN(ESNW|)W(NENWNSESWS|)WWSSWS(S|WWW|E)|SS(WNSE|)SSSENE)))|W)|S))|N))|NWW(SEWN|)N)|SSS))|SSSSSSENN(ESSNNW|)N))))|N)|S)))|N)|N))|NEN(ESNW|)WN(E|N))|NNNNNNNNNNNNNENNNW(SS|NENWNENWNENNESSSSSSSSESSW(N|SEESWSESWWNW(SSEEEENNNNNEEEEENNWWNWNEEENEEEE(NNNNWSWNNNWSSSSS(EENWESWW|)WNWSWWWNWSSE(EEE|SSSWW(S(S|EEE(EE|N))|NN(ESNW|)NNNW(SSSS|NNNESSEEEE(SWEN|)EENWNNNE(SS|NNESSENNEEESS(WSSWNNNE(WSSSENSWNNNE|)|ENNNWWNNNNE(SSS|NNWWWWNENEES(W|ENNWWWNWNNNWSWWSSWNWWNNNNENWWNEENNWNWWSES(E|WSWSWSSW(NNNNE(ENWNNW(SS|NENNW(NNEES(ENENESSWSWSW(SS(S|ENESEESENNESESWSWSSSSSWSE(SWEN|)EENNNW(NEN(W|ESSEEEESSSWW(NN(WSWN|ES)|SSESEEESSENESE(ENE(S|EEEEEEE(SWWWEEEN|)NEENWWWWNWWSWNWWNWSWNNWNWSWNNNW(NNWWSWNW(SSEEEN|W(W|NEEEEENENWWNNWSWNWWNENWWNWNNWWS(ESWSSENESESS(WNWWS(E|W(SEWN|)(N|W))|ES(W|SEN(ESE(E|N)|N)))|WWNNWNEEES(WSNE|)ENESEENESSWWSESENESEENNW(WNNEES(ENENWNEENWNNEES(ENEEESWSSENEEENEESSW(N|SEESESSSEENNNESENNEEEEESWSESWWSSSSWNWSWWNN(NNEESWS(EENNNWNEES(NWWSESNWNEES|)|S)|WSSWNWN(E|WWSSSWWSSWWWSSSWWWWSESWS(ESEENNW(NEESESWSS(ES(W|ENENW(W|NENNENNEENWNW(SWSSWNW(NE|SSES)|NEENE(NWNSES|)EESSSSESWWW(WWSSSW(SSEEEENNENEEN(EEEENESSSWNWSWS(WWN(ENEWSW|)WSWSS(EENWESWW|)S(WNWWW(SEEWWN|)WW|S)|ESE(SWEN|)NESENNNESSES(ESENENNNWSW(SEWN|)NNNESEEE(NWNENNNNWNWSSWSSS(WNNNWNWNEENNEEES(WWSSWENNEE|)ENNENESSWSEENNEEENWWWNNWWWS(EE|WNWNNWWNNEENEEEEENWNWSWNNWSWNNEENEESENENWWWWN(EEEEEEEEES(SWWWW(NEEEWWWS|)SESEEN(W|ESS(E|SSWSSSWWWWWWNN(EENNESSS(EENNNENWW(SSS|WNW(N|SWNWWN))|WW)|WSWNWS(SSENESEEESENESENEEENEN(WW(N|S)|ESSWSWSWNWSS(SSW(NNNWWW|WSWW(NEWS|)SWWSW(NWES|)S(EENEEN|S))|EE))|WW))))|ENEEES(SWNWESEN|)EEE(SSS|EN(ESESENN(W|ESSSE(NNN|SSEEEN(EEEESWS(WNWSWENESE|)SSEENN(WSNE|)NESESE(SSSWNNW(SSS(EESNWW|)WWNNES|N)|NEES(EE(NW|SEE)|W))|WW)))|WWW)))|WWWSWWSEE(ENESNWSW|)SSWSES(EE|SWWWWWWWWNWWWNNEENWWWNENN(EEEEEESEE(N(EE|W)|SSE(E|SWWSWS(EENESE|WWNW(NNEEN(NWSWWN(WSNE|)E|ES(ENSW|)SW(S|W))|WW))))|WWS(E|WWN(WWSWNWWWWWWSESESESSENESSS(W(SEWN|)NWWWWWWWWWNENENNESEE(NWNWN(WWS(E|WNWWWSWWWN(WWWSSSWSWSSSENNEEENNEN(WW(NE|SSW)|ESEEESWWSSESWSSSENNENE(NN(W(W|S)|NENWN(EESNWW|)W(NEWS|)WW)|EESWS(E|SWN(N|WSS(WWW(WWWWWNWWNEN(ESEEENNWN(WSSEWNNE|)EESE(NNWNEWSESS|)SWSS(ENSW|)WWW|WWSSW(NNNNNNENNNEN(WWSSSNNNEE|)ESS(ENNSSW|)SW(N|SSWSSEN(SWNNENSWSSEN|))|SSESWSSEEE(SWWWEEEN|)NW(W|NNN(W|E))))|S)|EE)))))|EE))|E)|ESWWS(EEENSWWW|)W(N|W))|ENESENNWWNENWWN(W(WN(EE|W)|S)|EEE(ESS(WNSE|)ESWSSSSES(W|SE(EENNESEEENEEN(ESS(ENE(NWES|)SSSSSWNNW(NEWS|)SSSESS(WNWSW(NNEWSS|)SSSEE(NWNEWSES|)ESESWSW(NNWSWS(WWNEN(NNWWSESWWW(NENWESWS|)SESSE(NN|EE)|E)|E)|SES(E(NN|SS)|W))|ENNEEEN(NWW(SE|NENW)|E(S|E)))|WW)|WWWW(SEWN|)NWWWNW(WSSE(N|E(SWSEWNEN|)EE)|NN(ES|NWNE)))|SSS))|N)))|E))))))|E(NEN(W|N)|S))|SSW(SSSWSSSSW(NNNWESSS|)WSSESESWW(SESWSSEEENNW(SWEN|)NENESSESE(NNNN(W(WNENNWNENWW(SSS(E|W(SESNWN|)W)|NEENENWN(WSSNNE|)NNEESWSEEEE(SS(WNWSS(SWN(WSNE|)NN|E)|E)|N(WWNSEE|)EENEENW(ESWWSWENEENW|)))|SS)|E)|ESSEEESSEE(EEESENE(S|N(WWWWWWN(EEEENSWWWW|)NN|EE))|S(WWWNWSSS(ENSW|)SSWNWSWNW(SSES(WSSSSSS(ENSW|)WWNNWNEN(E(NN|SSS)|W)|E)|NEENNE(SS|NN(EE|WSWWWNN(EE(SW|ENWWN)|WWWSESSWWSS(WWNNE(S|N(NNE(SSEWNN|)N(NNN|WW)|W))|ENESEE(SWEN|)NN(EESWENWW|)W(S|NN))))))|S)))|N)|N))|W))|WWWSWW(SESWW|NE))|N)|NENNW(NEWS|)(S|W)))))|WW)|S)|WNNNW(NENESENNNNESE(SSW(SEWN|)N|EENNE(SS|NNNEE(SSW(SEWN|)N|NWWWWNNWWSSWNWNN(E(NE(SEEENESSS(WNSE|)EEE(NWWNN|SSENN)|N(WWSNEE|)N)|S)|WSSWSWSEEE(NWES|)SWWWSS(WWN(WSNE|)E|SENNESSS(SENNNEN(ENEEN(W(WWSNEE|)NN|ESSWSSWN(W|N))|W)|WW))))))|S)))))|W)|W)|S))))|SSSSSS(WNWESE|)EESEE(EN(WWNNWSWN(SENESSNNWSWN|)|ESE(N|EEE(EE|N)))|S)))|SWSWW(SSEN|NE))))|SS))|N)|W)|S))|S)|SSSSESWSEEENNW(NEE(NWNNW(NE(ESSNNW|)N|SWS(E|S))|SSENESESWWSSESESWWNWNWSWNN(EENSWW|)WWSSE(N|SESESSWSSSSEENEESSSS(ENNNE(SSS|NENWNNWWWNW(N(NWES|)EEES(EENNW(NNN(W(S|W)|NEE(ENWNNWSSW(ENNESSNNWSSW|)|SWSSE(SESSSEE(NWNNN(E(SS|E)|W)|SWWWWNENN(SSWSEEWWNENN|))|N)))|S)|W)|SSWS(EEEN(ESSNNW|)W|S)))|WNN(N|WWWWW(SS|NENNW(S|NNE(S|N(E|NW(N|S)))))))))|S))))))))))|SWSWW(NEWS|)(SEEENENESE(N|S(SWNWSSWWSEESWSWS(WWWNEEN(E|WN(WWWWWSESESWS(W(SSSWWSWWW(NENWNEES(EENWESWW|)S|S(E|SS))|NN)|EE(NNN(W|E)|E))|NNE(SS|EE)))|EEEE(NW(NENNWS|W)|S)|S)|E))|WW))|N(E|N)))))))))|W)|NN)))|NEN(WNEWSE|)ESEE(ES(ENESNWSW|)WW|N(W|N)))|NEEESW)|WSWWSEESWS(E|WNWSWW(NENNNNENEE(S(SW(WSSNNE|)N|E)|NNNE(ES(ENSW|)W|NWWW(NEEEN(N|WW)|SWSW(NNEWSS|)SWWN(W(W|SSS(ENESE(NENEEN(W|N)|S)|W(SEWN|)WWWSWSSWWNWN(W(SSESWENWNN|)W|NESE(NN(ESNW|)W(W|N)|S))))|E))))|SS(WNSE|)E(SWEN|)N))))|WN(NEWS|)WSW(S|N))|S)|W))|E))|EES(ENNWESSW|)W)|S)))|E(S|NN(WSNE|)N)))|ENWNE(E|N))|N))|NNENNNW(NENWWWWW(SEWN|)NEN(ENENNNENENESSSSESWSS(EEN(W|ESSEEE(SSSS(EES(ENENSWSW|)(WW|SS)|WWNWWNWSW(S(E|S)|NNNEES(ESEE(NWES|)S|W)))|NN(ESENSWNW|)NNWNWSS(ESWSEWNENW|)WNW(NWNE(E(EEESNWWW|)S|NNNW(WWWSWNWNWSSES(E|SW(WN(NWNNNN(WSS(WN(WSNE|)N|S)|E(NWES|)S(SS|EEESENNENENWNNW(SSSWSNENNN|)NNWSWNWNEENWNENE(NWNEEN(E(N|S)|WWWSWNWSWSESSE(NENWESWS|)SWWWNENW(WSWSSS(EESEE(NNW(WWNSEE|)S|S(ENSW|)W)|WN(NNNEWSSS|)WWWSSS(WWWNENES(NWSWSEWNENES|)|E(S|EN(WNEWSE|)E)))|NN))|S(E|SS))))|E)|SS(ENSW|)S))|SS))|S)))|WNW(NENN(WSNE|)N|WS(E|W)))|W)|SS)))|SS)))|W)|NEEN(W|NESSS(WWSEESWS(WNSE|)E|EENNEE(SWSNEN|)EN(WWWNENWWSSSS(NNNNEEWWSSSS|)|E))))|SS)|S)|ESEES(ENSW|)WW)|E)|N))|E))|NNNE(S|EEENNEE(WWSSWWEENNEE|)))|N)|WW)))|NN)|NNENW(NENE(NWN(E|N)|ES(E(S|N)|W))|WWW(SEESNWWN|)W))|N)|N))|S))|NENE(NWW(NN(EE(SWEN|)EE|NNWWW(NEWS|)SSW(SEEENNWS(NESSWWEENNWS|)|NN))|S)|SEE(NWES|)SWSEENEES(EESSNNWW|)W))|S)|S)|W)|S)|E)))|NWNNW(SWWWEEEN|)NENENNE(NEE(SWEN|)N|SSSWSS)))|NENNW(NWWNEN(WW|NEESS(WNSE|)S)|S))|E))|S)|S)))|NN)|NNWSWW(SS|NENENE(S|N(N|WWSW(S|W))))))|S)|NWWSW(WNENWW(NWN(WSNE|)EEEES(SENE(NWES|)S|WW)|SS)|S))|WWWS(WNSE|)EE))|WWWWSEEEE(WWWWNEWSEEEE|))|W)|SSSS))))|NEENWNEE(S|NWWW(NEWS|)SWS(S|E)))|N)|W)|SSSWN(N|WWS(WNSE|)ESESWSESWW(EENWNEWSESWW|))))|SS)|W))$ diff --git a/src/advent20/advent20.hs b/src/advent20/advent20.hs new file mode 100644 index 0000000..96ff894 --- /dev/null +++ b/src/advent20/advent20.hs @@ -0,0 +1,127 @@ +{-# LANGUAGE NegativeLiterals #-} +{-# LANGUAGE OverloadedStrings #-} + + +-- import Debug.Trace + +-- import Prelude hiding ((++)) +import Data.Text (Text) +import qualified Data.Text as T +import qualified Data.Text.IO as TIO + +import Data.Void (Void) +import Text.Megaparsec hiding (State) +import Text.Megaparsec.Char +import qualified Text.Megaparsec.Char.Lexer as L +import qualified Control.Applicative as CA + +import qualified Data.Map.Strict as M +import Data.Map.Strict ((!)) +import qualified Data.Set as S + +import Linear (V2(..)) + +import Control.Monad.State.Lazy + +type Coord = V2 Integer -- x, y, with north and east incresing values (origin a bottom left) +data Door = Door Coord Coord deriving (Show, Eq, Ord) +type Doors = S.Set Door + +makeDoor :: Coord -> Coord -> Door +makeDoor a b + | a < b = Door a b + | otherwise = Door b a + + + + +main :: IO () +main = do + text <- TIO.readFile "data/advent20.txt" + print $ T.length text + -- let (ip, instrs) = successfulParse text + -- print (ip, instrs) + -- -- print $ part1 ip instrs + -- print $ sum [i | i <- [1..1032], 1032 `mod` i == 0] + -- -- print $ part2 ip instrs + -- print $ sum [i | i <- [1..10551432], 10551432 `mod` i == 0] + + + +-- type Parser = Parsec Void Text +type Parser = ParsecT Void Text (StateT [Coord] []) + + +sc :: Parser () +sc = L.space (skipSome spaceChar) CA.empty CA.empty + +lexeme = L.lexeme sc +-- integer = lexeme L.decimal +symb = L.symbol sc +branchSepP = symb "|" +openBranchP = symb "(" +closeBranchP = symb ")" +startP = symb "^" +endP = symb "$" + +doorP :: Parser Coord +doorP = nP <|> sP <|> eP <|> wP +nP = (symb "N" *> pure (V2 0 1)) +sP = (symb "S" *> pure (V2 0 -1)) +eP = (symb "E" *> pure (V2 1 0)) +wP = (symb "W" *> pure (V2 -1 0)) + +-- instructionFileP = (startP `between` endP) branchesP + +-- branchesP :: MyParser Doors +-- branchesP = fmap S.unions . many $ choiceP <|> pathP + +-- choiceP :: MyParser Doors +-- choiceP = (openBranchP `between` closeBranchP) $ do +-- here <- get +-- return fmap S.unions (`sepBy` branchSepP) $ do +-- put here +-- return branchesP + + + +-- pathP :: MyParser Doors +-- pathP = S.fromList <$> many stepP +pathP = many stepP + +-- stepP :: MyParser Door +stepP = do + heres <- get + delta <- doorP + let theres = map (+delta) heres + put theres + return (map (\h -> makeDoor h (h + delta)) heres) + +-- choiceP :: MyParser [Door] +-- choiceP = (openBranchP `between` closeBranchP) $ do +-- heres <- get +-- do +-- here <- heres +-- put [here] +-- branch <- (pathP `sepBy` branchSepP) +-- return branch + + -- fmap concat $ (`sepBy` branchSepP) $ do + -- here <- heres + -- pathP + + +{- heres <- get + choices <- (`sepBy` branchSepP) $ do + put heres + pathP + return $ concat choices -- (S.unions choices)-} + +-- choiceOrPathP = many (choiceP <|> pathP) + + +-- successfulParse :: Text -> (Integer, [Instruction]) +-- successfulParse input = +-- case parse instructionsP "input" input of +-- Left _error -> (0, []) -- TIO.putStr $ T.pack $ parseErrorPretty err +-- Right instructions -> instructions \ No newline at end of file -- 2.34.1