Partial progress on day 20
authorNeil Smith <neil.git@njae.me.uk>
Thu, 24 Jan 2019 10:33:45 +0000 (10:33 +0000)
committerNeil Smith <neil.git@njae.me.uk>
Thu, 24 Jan 2019 10:33:45 +0000 (10:33 +0000)
advent-of-code.cabal
data/advent20.txt [new file with mode: 0644]
src/advent20/advent20.hs [new file with mode: 0644]

index 3e787cfedd7ad617791eeabb90b11215f37d6978..7a9d811a6619a6fbfd2dc7f6e9f02c079689c0c6 100644 (file)
@@ -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 (file)
index 0000000..2945cf8
--- /dev/null
@@ -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 (file)
index 0000000..96ff894
--- /dev/null
@@ -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