diff --git a/.hspec b/.hspec new file mode 100644 index 0000000..b43ecad --- /dev/null +++ b/.hspec @@ -0,0 +1,2 @@ +--rerun +--rerun-all-on-success diff --git a/README.org b/README.org new file mode 100644 index 0000000..e69de29 diff --git a/aoc.cabal b/aoc.cabal index ed8bad2..f58726a 100644 --- a/aoc.cabal +++ b/aoc.cabal @@ -14,11 +14,41 @@ license: MIT build-type: Simple extra-source-files: README.org +data-dir: data library exposed-modules: AoC - AoC.Internal + AoC.Day + AoC.Riddle + AoC.Util + AoC.Y2023 + AoC.Y2023.D01 + AoC.Y2023.D02 + AoC.Y2023.D03 + AoC.Y2023.D04 + AoC.Y2023.D05 + AoC.Y2023.D06 + AoC.Y2023.D07 + AoC.Y2023.D08 + AoC.Y2023.D09 + AoC.Y2023.D10 + AoC.Y2023.D11 + AoC.Y2023.D12 + AoC.Y2023.D13 + AoC.Y2023.D14 + AoC.Y2023.D15 + AoC.Y2023.D16 + AoC.Y2023.D17 + AoC.Y2023.D18 + AoC.Y2023.D19 + AoC.Y2023.D20 + AoC.Y2023.D21 + AoC.Y2023.D22 + AoC.Y2023.D23 + AoC.Y2023.D24 + AoC.Y2023.D25 + AoC.Year other-modules: Paths_aoc autogen-modules: @@ -29,7 +59,8 @@ library BlockArguments OverloadedStrings ImportQualifiedPost - ghc-options: -Weverything -Wno-implicit-prelude -Wno-missing-import-lists -Wno-missed-specialisations -Wno-all-missed-specialisations -Wno-unsafe -Wno-safe -Wno-missing-safe-haskell-mode -Wno-missing-local-signatures -Wno-monomorphism-restriction -Wno-prepositive-qualified-module -fdefer-typed-holes -Wno-unused-packages + DerivingStrategies + ghc-options: -Weverything -Wno-implicit-prelude -Wno-missing-import-lists -Wno-missing-kind-signatures -Wno-missed-specialisations -Wno-all-missed-specialisations -Wno-unsafe -Wno-safe -Wno-missing-safe-haskell-mode -Wno-missing-local-signatures -Wno-monomorphism-restriction -Wno-prepositive-qualified-module -fdefer-typed-holes -Wno-unused-packages build-depends: base , containers @@ -38,7 +69,7 @@ library , text mixins: base hiding (Prelude) - , relude (Relude as Prelude) + , relude (Relude as Prelude, Relude, Relude.Unsafe, Relude.Extra.Enum) default-language: GHC2021 executable aoc @@ -53,7 +84,8 @@ executable aoc BlockArguments OverloadedStrings ImportQualifiedPost - ghc-options: -Weverything -Wno-implicit-prelude -Wno-missing-import-lists -Wno-missed-specialisations -Wno-all-missed-specialisations -Wno-unsafe -Wno-safe -Wno-missing-safe-haskell-mode -Wno-missing-local-signatures -Wno-monomorphism-restriction -Wno-prepositive-qualified-module -fdefer-typed-holes -Wno-unused-packages + DerivingStrategies + ghc-options: -Weverything -Wno-implicit-prelude -Wno-missing-import-lists -Wno-missing-kind-signatures -Wno-missed-specialisations -Wno-all-missed-specialisations -Wno-unsafe -Wno-safe -Wno-missing-safe-haskell-mode -Wno-missing-local-signatures -Wno-monomorphism-restriction -Wno-prepositive-qualified-module -fdefer-typed-holes -Wno-unused-packages build-depends: aoc , base @@ -63,7 +95,7 @@ executable aoc , text mixins: base hiding (Prelude) - , relude (Relude as Prelude) + , relude (Relude as Prelude, Relude, Relude.Unsafe, Relude.Extra.Enum) default-language: GHC2021 test-suite doctest @@ -79,7 +111,8 @@ test-suite doctest BlockArguments OverloadedStrings ImportQualifiedPost - ghc-options: -Weverything -Wno-implicit-prelude -Wno-missing-import-lists -Wno-missed-specialisations -Wno-all-missed-specialisations -Wno-unsafe -Wno-safe -Wno-missing-safe-haskell-mode -Wno-missing-local-signatures -Wno-monomorphism-restriction -Wno-prepositive-qualified-module -fdefer-typed-holes -Wno-unused-packages + DerivingStrategies + ghc-options: -Weverything -Wno-implicit-prelude -Wno-missing-import-lists -Wno-missing-kind-signatures -Wno-missed-specialisations -Wno-all-missed-specialisations -Wno-unsafe -Wno-safe -Wno-missing-safe-haskell-mode -Wno-missing-local-signatures -Wno-monomorphism-restriction -Wno-prepositive-qualified-module -fdefer-typed-holes -Wno-unused-packages build-tool-depends: doctest:doctest build-depends: @@ -91,14 +124,16 @@ test-suite doctest , text mixins: base hiding (Prelude) - , relude (Relude as Prelude) + , relude (Relude as Prelude, Relude, Relude.Unsafe, Relude.Extra.Enum) default-language: Haskell2010 test-suite spec type: exitcode-stdio-1.0 main-is: Spec.hs other-modules: - AoCSpec.InternalSpec + AoCSpec.UtilSpec + AoCSpec.Y2023Spec + SpecHook Paths_aoc autogen-modules: Paths_aoc @@ -108,7 +143,8 @@ test-suite spec BlockArguments OverloadedStrings ImportQualifiedPost - ghc-options: -Weverything -Wno-implicit-prelude -Wno-missing-import-lists -Wno-missed-specialisations -Wno-all-missed-specialisations -Wno-unsafe -Wno-safe -Wno-missing-safe-haskell-mode -Wno-missing-local-signatures -Wno-monomorphism-restriction -Wno-prepositive-qualified-module -fdefer-typed-holes -Wno-unused-packages + DerivingStrategies + ghc-options: -Weverything -Wno-implicit-prelude -Wno-missing-import-lists -Wno-missing-kind-signatures -Wno-missed-specialisations -Wno-all-missed-specialisations -Wno-unsafe -Wno-safe -Wno-missing-safe-haskell-mode -Wno-missing-local-signatures -Wno-monomorphism-restriction -Wno-prepositive-qualified-module -fdefer-typed-holes -Wno-unused-packages cpp-options: -DTEST build-tool-depends: hspec-discover:hspec-discover @@ -124,5 +160,5 @@ test-suite spec , text mixins: base hiding (Prelude) - , relude (Relude as Prelude) + , relude (Relude as Prelude, Relude, Relude.Unsafe, Relude.Extra.Enum) default-language: GHC2021 diff --git a/data/Y2023/D01/riddle b/data/Y2023/D01/riddle new file mode 100644 index 0000000..979a9c6 --- /dev/null +++ b/data/Y2023/D01/riddle @@ -0,0 +1,1000 @@ +sq5fivetwothree1 +six5gc +txb3qfzsbzbxlzslfourone1vqxgfive +3onethreebrth +cseven7nqqxnkzngndtddfiverkxkxqjjsr +2lvpmzh4 +threeqxqndvjrz15 +threetwo1drtzsixtwofourppvg +zxhsndseven2vbnhdtfpr3bt86 +onethreelqqqqvj7eightnine5 +7sevenfour5gnine +1seven5 +vgxhqfrvr7vfsxqms3 +twokdkcbhtqxfc87rkgctwo +twosix9threernltgbffour +npvzzqfb5tbbn4cnt +jjxlckssjmdkm5szklnq1two +lblcscglvseven53251zzcj +threesevenzplpzlqb1 +threeeightxhrkflkbzp2 +honemkmbfbnlhtbq19twonekbp +vdttwoeight7eightoneone6vq +eightvszlvntpfourjqcgmjr3 +dslqnmd7k1twogbvhhnfmtsix +twocsnn7jslpsppxmjr36eightss +7eightrdcz74twolvd2cctg +4threerrqxpmmzhrqht4two2 +2seven9two +479 +threefour86 +5klxgb1 +dchrpzkfpgqzgjmpdcthreeeightsix82five +seven5tcls +six5three2six888zd +75nine274sbzd +seven7691dzflbg7seven +bjtrrvpx954lxr1qlqdvbldpt +zthree4 +sixfourfour68 +fourrjgvksixtwongbvkpff9 +3seventwo +bzqqjtqvfssevenonenqzctcgbch9three5 +4fourseventhreeck +mx5njh2 +1onebqkdcbmvrknghnn5frdjtrq +one1nineflfp957vkdgfrjtfive +7eight7fiveeight +zzxrsrp313 +1sixcksrxn4 +ggqvtwofrrfdhbsdfdpzpbjjckbrg5ninebqszf +pxjcgc2ggqscglhjpbpr6seven +sixsix7twofivexgdm +four4eightseventjsqlbhrzvsevenfivesix3 +twotwo8chjmb +dknnleightmmmmrmcrnr8 +twogzdgdqhrs3836 +ninebsztzhbqjvlbvhdktqjc6hpqcksfive6 +twofive1nqdxdvvtvf4oneone2two +1eight8nkmhcfvzn +dzmkzzx4lfljtzp95seven4qqnpjdtr +one7sevenninepsdgrjkxgdchjtxrx +fnltdcxqln314nine7n +three7sjgtnxgtllnpndfourfiveseven4 +64snine7 +ppjlpsnsbmthfivelffive59hsnmn2 +sevenqftktpnj6 +ninethreetbgprvchxlnmfs3fourhmcz +xhl1 +4qgf +1qbhrmfcffivedgtfour +eight86bcqskslkvlgone7gg +6pccldrtmsdbbrcbcq86 +ppzrxtsix94jplxff11 +786seventwoonezvnqrsix +7threeseventsjcdr +fivebfive3nineffcbzprh +4glxskdkjn +n8 +kzcvdtbq49 +7xvqxmhcfkkffnine93 +hhzmdnzktbtwojvlckvjsixeightone9rxqb +one3sqckgps8 +lscdfp8eightcgdvgssveightdldsreight +jhjsltwoeight1one +6trxnfcqdmlrmf3three +one1kdclsglmsjmczsksdfour +sevensevenshlhsvtl8three +four522sevenfourcrthhhvkj +197stxphm8 +8sixtwoseven6five +zjdhldjcqctkltggninesl6stplglmkn +6onesixrhmjvtcmbh +fivehnj8dninefourfive3 +4fourfncsrhf73 +nbcjqhlckonemdbcsvfsixvm3one +7seven6seven +fournfive6four9 +6brzhdxzmtxfoureightxg6onetwo +5sixmmddqgpdnq4 +6ndzzhlrdjxjqfxvss +gkvoneight29two +4threethree +eightsznbxf8fiveninetwo9vgfbv +8kzkmqncfhssjblmfd7hdmpkghsz9mmbsbjdxdlfmnxfour +four2threeeight19bx +1oneseven +fh5 +615zkzg +25six2mrtjthree +jvvmbfzr3seven7xjbhvvvhlz38ninejk +vzjthjkrcc5six3rrnrseven +rjthree3szfourbnvnbh7hgjzcrhfptmlghkk +tgjtdsnqrq39seven3hgqc9 +1vttzfour9 +6vbtcqmpk213sixzmjcnxn9qhdgr +3sffvspzmxjjfourjxjbbdfj5 +bdhj9lz1np7tvmfvptffhfdtbxld +kbkxldln99onetwoseven3 +rvsthree9seven4seventwo +32zbjmhr +eightfffkdgjqspgzmkvzxpls4one +three1kxqr21ninemhrmheightwoc +fqjvtsph8zpghgdbxrg4 +398seven +bnine1two5756 +7xkqkxjjvmd2n77 +9seven79foursxdqcvttwo +6d6zfxcmrzsixgmlqnfdn +kfhreightfnhcxpcrz9hqrqtmknpjxrt4hrk +seventhreeoneone4nngnlz37 +fphhxfs8jzkchp8twotjznmlxhht +474 +58eightnzxfgndgdvbvphzsqxqcffdqsvxtwo +3two5xvjjthreetmszrldjlknq +1nine7 +29kfrrdxvrmgjvfpqjcqlplfhrxpklzcrvndmdhjhninejhmph4 +fzbq39bs +85eight29fiveccsrvsixfive +sggksrnseven28ninesixnine +bggkmnrbjknxqfgttxsixnine4 +73nfive +fivefourgscsevencntfpzzrnineprdjqdbmq5 +6four2oneeightljstfshztx9 +sevenzkdqst6jncvcblb +dxrnzlsix5 +two1tmhmg4four +2mzfnc5threefourthreesixfivezq +jeightwo3jfzqdtjzschpzrj2 +5ccchkjzvqh7 +jdpnjqg3five48xmmptkzmvg +rgn146nineseven4six +eightonetwohsxms8six94 +eight4znfqgsftghtrhfkvj +btmk5834eight8mlcccnrzrb +15ninemhmhmqlb +85skmrvhl74 +dbvhkthj4 +one6keight +sixfourtwosevennine7tfrqgk8five +seven1kxcqbm1 +tmpl56rz27qfdfour +3eightggcjbnktmbqfivefdmczl +b2threethreemnxdhrzsxqhchzbnvhppdcqcffour +htpgc4blggnnzts3four7 +8sixbdntsg33njhtnsnsix +fourfour5seven3threesevensix +78eightsevenone +four5threefive +cjqbcfjnbf2six +five9ninesixonejdnsvcfive +rvrf9cjl3eightfvrzpjnxr +threeseven5 +vxvmpkffrtwo9twofivesix +67xnrcxsp9rk +mvzdgqgrv77 +one42qkfp +1vtq +225eightworbm +three9onefive +qxoneighteightzxlfksc3oneeight2 +mnqjhg6ffbhzcsixtrbfr744zlg +8nine7 +fivergqn2seven +44gpslt6nine6 +1six98fsgthctwoseven +ldrqsbjrtnlj6lqgptgplbsnhrhpsixzqgpzkxone +7knxhcfjvshqsxsqrponeightld +zsixsjbltfournzndqbqd2rone +qpnvkqmdthree3234ninefour4 +cdnhqqxxp2two6six +five9354xnbjjx +9eightsix4jjjeighttprrhqvqlt5 +lkcfmvtonexklgknxxsglcd5znseventwo +four31nine56pmh +eight96tb5t2nineoneightrlb +fourncvgmslx695twobdklqzfour +8fiveq75four +5six9fourfour59seven1 +eight2bqtqdjsvkkjfive81vpkvmbpxcp +nvxvgqhfouronefive4sixpqckgf +25onetwotwo +seventhreezkntcmjqeight493three9 +ptd58qrtfqj +2985lvlvlrfzrjmfqbrmgtonejxtgpspjnx2 +6qbzxqvx +three81btcngfkjj28seven +36six8 +5gzthcpffr2 +6kqtntqrzxsgksevengnzthree33 +87fmnvqpczzhone5seven +nine2cxpmrhp +vt46xflbjdkkb7seven +eightrgthreethree98fourhgcqjgzclc +5nfsbcvmfv484fxjtwothreefive +nhvcn4glfxtkfttthree +6five9qznggpkflhzht7zhjjone +ddzghtvmp78five4gzfnnkc +sflvnzkrjtonenplrbkzxmt9fhfdzxrfjrtwomctkrlkhghfpcmkn7 +sjxspdjhg96three112jz +xdbgzlfour2twosevenzfdtvxq6 +gdtnt2fivelscmsix +9threefkjkrskxrcjsbthree +ninepmqbdmlkrmfhpgsz3twothree +onebgtdg5mqrfxvnfkseven +6m949fivezthrbbkqfd +2five94threeone +eight8four42vb +2ninetwo +17two9nine +3pdmsixfouronethreesixfiveb +five1two5 +nine4four +three5lktjmlnbph +eight6onelrdlsevenj1zmmbtjrd +tkjhgvnpkvgsqzjrnine2hltwotwo +89xfpxgdlcpznxxfnpbzbzseven +293threej7four94 +v63 +pxccbml6sixhqnhmrfive +kddsix4fouronevtrgbvtxxxsix3one +5bxqjkdhthree +six4threezgg2 +fourtwoeightmftwo99 +t7ninenineeighteight8 +5xvvlnqkjs4 +seven7one +vqfhpk7hnthreeseven42 +7threef2two92 +2onefourckbrvqzq9 +tvvdxrvthree2 +seven1fourbvmfzftwortnjd16 +pmttpsggb134mlffcsnbftwox1 +2dzpvqtcxjfour5pgppvbk +9jfscbjzq +fiveninefivethreexdtgnbdfp5onefive +six1927 +one1xjjkvkkfk1zxxrjhkg3sixmhcgc +7fivetnncl5 +zbqzdkkthreekzdcbhpveightfourfivemrmpzv3 +twothree51three2phhmrnnhntnine +bfzzqmthtgthree4sjzkmtrnplbxeight2eighthj +nqsflrlmlthreemdzztlghgj5xcj +fdtflsqrxltwohcvsnrndmsixeight7 +fourbmlftwo2mzz8 +pjjqzmsx4ksix +six1219one6seven1 +gthznkpp31 +nine4four32 +xktzkqmmxct6fkhpkg +one5688sevenvjjthreefsvxt +36twonine +3fpdqtzrd3tslzgkjzxd5 +bsevendpvtmnzl9cqgjfjbzfv222 +lxbhkf2nseven79 +gqckmfeightnknineeightsix45four +n78 +42nggdthree4threefsxgjsixjdnqzkxdb +gbfbpjcjnzjrrqmm17473 +1eightzqxxnq +25twovmnltzx +seveneight9qtcvzvmone138v +msixjrqprlnqhdfourjdmsddzseven85 +eightninevvcp2 +mtvvjsck6hgkjml +121fthreethree +jncgfj3eightr6 +468four6xdlrgngbhcxbtf +3nqqgfone +1zmzjqscfournzbssixeighthmspdbhlpc4 +twoonejmkb8sevenfourseveneightsix +qxrznqone8z8sevenninesixsc +jrklnh6threeone +2xfnbrk6frzsvjhb5sixeight +ninethree8lbpmqhsppd9fht2ninefql +7bzcnthreejdh7oneightj +155twofourthreemfive +5ninerm +9lxrfoursixm +glvxvsbsg7 +jbrbhzrsftwofour1 +two4hkxztgbbgf4ptckpggkbvvj7 +vhqhqghjscvc3rcgttfv +ninetwo9threemhtsn +cnxzthgqz6pxfbsmkmm +45jgrr4ninetwo88 +dkhgscrthreeeightsevenhsxjhr6five +6nine7vpfbvlvdvzvj +goneg4threeeightslhlzkpqv2 +sjqgqz8oneglvzn +crj32neighttvv5 +blqptxbggl6three1two46cbdzt +vpxnvxkgdmggpnine61 +22kxn +5zvsmtzqjhhmfsvv4 +dkfknfnjxtzjrbfk1 +67sixzns61sdrpsmjsrftkdgjlb +6lnffcgtxfivesevenseven8 +px1one96slxflxdfxhninehkcszmdxzbbjmlq +3sixsevenseven7vlvdlcjhccvmlzcn +5frrqhseventftbln6 +three23seven7sixv +ninehscrb9 +fivepvsxqmnbmvgphsevencgkhsnqkz1rxvg8 +pbhsqvdxhf694six66 +four2nineczdtwobjxkfnkbg +nineml1jbnm6vhpsgmdq2 +three63vgbm +665 +htd7pvmrpptvtneightnzmngone7 +rfeightgrfffksdfmgclspbp7489 +4fdxcnbfjtbfg63ninefivegkmhgz +21eight7one39 +foursix8vrzhm +two8sevendneight +tncdggvfivekmbljttwo94fivetpstp7 +68seven +onenxh9eightone +twothree3threenine4oneightzkr +onetwosixeightkfxnfnssd5 +eightthree63five8 +6seven7one +mqkkhbrjjm8v4 +8six2 +threetvbonethreeqmpkxjqlqgghqrlh5sbf3 +blrnd9dkqgjf +41onervcmkgnpcbx52 +frmdcps8sixtwo4ninefbdjfour2 +8nineninenine +pkrln2dfrkkntwoonefjsfgx6 +xvrkcmfxpfourfourrxcxqmhfour29ftsfd +crkmrlrb4fourthreeeightcgk +7threemrss4eightsevenskjh +eightsixqppfhv3ztn +3threeeightseven5 +gkrfhthr12threeeightthree +8vthczh1 +seven6hfcfmrlkmqxpjq9eightlvlgqmf +fivednzg85eightseveneightfive +dz8ssixkbbtgv +rdmjrcgeight6r +five6nineonesixrlnhj +zh127four7two +six1sevenvmlnvkgcldsrrblfbrphrfsx +m584sixkgng7bzzpzjzbfzqpgdcn +2twozmvzzjbpdftm186eight +twoninekvspfvkbxtkc3 +fourrchgqkxfdzfccppqtpffhrtfive7seven7 +four483eight +threelqlc7 +xkgntdjninenine8brkjfsrttnineseven +9zkds +twostmdvsbflvqbdgfs55 +twobnzn1czdfpns +5onetwo5 +txsflrhgklnctfzrlgmplr8pdxl +93four882mgqmqnsnx +sevenfxschslsncjgqsctnineonenine1 +brb9 +7five9 +three425 +mkfone4ninefour +bkpdhbvq7 +dhrlbjvcgqdtqjlk4zxzjpvdfm +67threefive +nineninegvmlfthreevtndnb9 +ttmznl3fjdcbch +fqsxkm9nineoneh761 +sixfivesixnjrtqdkqpc2xdhlrrmp +eightsix793nvdvbtxxksix +5veighteightgscktfbtd513 +vfvrcknfls5q +7seven24rfpzpftrkgthree43 +qplqnt4threezldtjfdzv +three1ghfglcthreecnzjjphgrlmone +eightthree84 +xxtpxgonethree5 +3onengztdjljx +cjrtxxlcpfcqjmgqknineseven2 +sfxhqftcdht4eightthree +2plnnlkqjnfxv +ninenineeightone4brmgnngchf +fivexbtndsonesixlvtjvxhl4sixstn +dqcztwo8fourninexm +5532threeqmctrbnnhk +two4pqsjlcfone8jpt +onefour42jqs2 +4eightone3gvqfhmmrnprc +6sjlcfbs8fourfourfiveseven +nfdeightwo31threeoneeighthjnvcddclm +149two +8ckgmfsp32zsnzznine1 +sevenfourlfzztcbplszbninesix1 +htdtwoqxmhnbfxr23fiveone +qvvqnineqf1five +rchcjhvqxthv89pkqrffrvdthreesevennine +kzhtxmrzz3 +sevengnmtfxfthreeqd3fzkbvpgghpkvcgzhthreeeight +fsmnfc3one3five9mkqgnkkbpt +js9hbszkvngrnine9trbdkr +grdflnvhrnjcxgtshh95f35seven +xb9fxdbcbdninefive +9sevenmfvdbljjnkkh6shmnhzhvhczhtqhnztltc +tgkxpgkhdrhnpltgptdfj8 +4onesixfive +seven1rzpxlkmsbhfivexngj +plmhsjrgm414 +8twobllkqgllczsix6onexsrvq +4nine6 +vgfjtxhmqjtwopfrgbmr3 +jhoneight9tsgeight8fivejccrsblkfsndpcmbjm +dcdkbmkttwothree3six5six8seven +seven9fivepxlhhhxpmmmtrvvxgrzsxx62 +three59cksmfknhhdthreevpntxrnm3oneightpg +ninevcctklkbfdtlqv3five384 +f4999tcvvgpdn +78three23sixonecqbrrkthree +lcsrnr5rbbmone9 +eighthjjsxhvf7qdxnqsjpdlmzkv +86four +1four7one23threejvxh4 +seventwoone9two +ninejjdhg3fzkqp9 +nine14qjctcs1424vkc +two45 +gpzgdzcqone55nine +766fourrvhfrdcqvqn1 +cqfjjgbzhljcnjfnd1vhndrczpnhthreeeight +eightbzkgpvss7vpz16 +oneqcxqckg2dgnxtwo7lqjslxmeightwovs +tzvmvcjxk5nineltsb4three9nine +mkeightwooneseven2 +nrtkxhsevenzdfive3 +6kxrt +9gp838 +3sgtlcgvsix +dsqtwone42 +9sixonekjtpvfoursevenrhfqgvc +3gh +eightzdzhmjj9onermrzjdlq3sbgtqmkcchx +22fourthree7 +fxpeightccgmznphxghv2 +five8eight +seven7ftgqfour +7fvjtfxkmskseven3xdhrmdmjntsneight +vgqspdltzsevenbknftljmsk71fivechpjzsvlnm5three +2fournine6 +fchqnvjk51eightlfpmqtjtkv4bfpfour2 +1sixltcvfh7nngbcfbtvsftwonlncst4 +sevencp3sevenseven +lsqbbjsrthree5 +tfbbmtvmcnjbdm1dtwo2ghgthc +9lmdspfheightxrgnsffcdkztbvfsvfxkqtnddp +2gllnfivexgnsst +sixm4 +fourthree7twobcm5vxdtlcmcg +onenine873gszpxcsonep +2threenvxrbsxnjkonernsqrnqhzmsix5p2 +sllbrnpsjztwo779 +6dfive4zqmhpzcdqj8eight +5nineqdmbg +hbrffrnkvthreekjstcv7hvmngdfcn +21249 +ninekdgfqppzt972five +7ljrvzfrklgmtqrstxkrkbjbpzeightxfnvr9 +sevenfour9onesevensixlczmmlg +kcteightwo6752 +fivethree9eight +zzgmn5nnfndqeightbzbcsxqpzj5one +6fourvqfhs +fivexfqvmrpgpgxz3 +txqbhgcxjfive1seven44 +82jonehgntqmxjbs5two2 +4eightxmz53 +lnzvmqrsgsfiveeight9 +threefour7 +seven4ljsevenfive +1jfcvdvgmb7scmcfsbbnine3 +kpxpxsvvg4fcjxjcmltnineone4eightsix +zjdcddgtwogfbbmdvcczbcfjpcdtslckbtzqfive6nine +4tqghjdjnfour7six3 +lgdtjjktwothree89scfivethree +3xvvmzshronefour6sevenktdjmrmfqtnvhvl +9fivexcpvthree8njncvnnz4 +gcgx5sixdgqznrrstwo +1fivereightonefour +tfclzvrhb1five +xcq5 +five9four8fourtrdbmcjjjvnine +63rlxseven7bltsm +1bnzzkgm7seven5onezqjvzrnbnxkgffvt +sixone9 +7jzmnhjvzxfive8 +16mbrtmstrhhsevenxkhgkmhreight +ninetwosevenp2ndddnhlczfnzx5pt +bv83blnnpfrbsone2ninethreethree +zjjvslrqpvrhxsix5z1nine8six +cqqfxzzxrnmvdvssevenrdm1dckrhjbdxpgqshlnxvj +78sevenkrsvceight2eight +twogrflcthree5gvmqfkpjfjcnqdhfourfour +dcttz7sevengtgstlznlgcmbzs +four64fournpxmfkdmqn1 +gmgndczvqeight6sixhhfgdrzbl1three99 +twoseventhreefivecfsdlmnzvlqbrszjdz2 +onebh2 +5tcrkzggfdfzq77 +gjhfrt871hmgsix +qn589stxkhnlnhvzptzs6qlfvhz +qhtnjvdmtflxffour6sevenktgtr8 +7sevenhjjdvmsixpqzxkkzcqzd +849six1kt +trhhcsndhtwoeightfournineszdrmrqhsq4 +dfzrnine9 +roneightgqnxnd18frkjgvhpngpcs9 +3nine8lvkpzzqjkhxjjthree +2cmdmvnzb +dkxscqdrctgxzlflrlvtnkqlmrlgsrqseven8qlqrdz +4fivethree +2qtbhgfjcpchsjslm +gtvvdchll61gczsrlxhgf356 +6onegckf4seven4sbntwotwo +ccstwone1872hdv2 +515mhxpngvzqt +fourjhhfsbonexdzhgrseven3 +twoxklx6seven4ninethreertczhbsfour +rhtl4pg1four +6dlprbkclc4nxvfqkpt +5onelkmrhczkm +zqhxmhgkone5xpkvsntwo3 +2two461 +twolr6two4bzssevenfive +2oneone7ninetsgxlx332 +eight3hvlzpxtcs +25eight3tbpccjbx3sdcmt +krdzhfh2sixeightgrszdxt +tjxlhrgmqcdspzdb6ssgqnxcxlvbfivetwo +snninedqlbnhqzjthreebhfnfrf3pfcqzfnffhsix8 +8nine3 +9five1xlbvsix5sdcrlhgtffxb +seventrldtzv5ninetwofive7four7 +blbvthree1grdhltsevenfive +fkrhh4gd1 +1jncdsphsnjzkxphbdftksc5dtgsixone +fglnthreehgkx31 +threexnfour8threefive +zzjnmhvbltp1 +6vcjxszkfmkprpl32cfjsrhzmdfourjdflnfql +49tlsqspjjcmtjvpd4 +7sevenjfqpktqpdhonethreefpjqhbjcpfourdzzcbxp +xn7sixeight9dphpvscjlxdtwovjbnx +tzgrvrkgbs7cfzf2eight76eight +4xlnzqrxqk8two97vxjninelmhzhv +ninedqlbgpbmf7dhmshsbq2eighteightpgzq +fourthree825 +jcqftlf2threecbnine24lds +fourtxnine8zhlzcqjmvk +5two3 +zfkdgfourtwoc4 +7fivefch +fourqrvjmbninelcvjlgqxmvhf2hldvjzhl7seven +vkfeightwo8four5seven +79fxdpd +tdjspcsixdqrgkxvk1vjmggfpbrvfour +43tnmdpslnxfourtwovnzdzhvteightseven +threenine1zklgrlllhonekn6 +one2zhnthreez +bone11npzv +five44614jnzxvdjhm +277seven1 +6djmb65nglbkzrlpfgsqchbp18 +ninesix2four +four8nshkzhzvxlxxnngxvfive +2threejrxhhqkctsthreemdqzpxxrrglnine8nine +1xdm +kgnprzeight7nine +mssbnjdcjvvtpnsrnslmeightbzl3nr +9dppkrcf6oneoneeighteightklmtfvl +8ninebrzqx4kbhkcp6 +seven1hklsjbdqzp1zc +twofcbxntcskg1onezzqfrff +94xssjlkccfbljz +spfive47ssjssevenrz2two +98threelc676 +mxrgthreezzkhcmoneseven7three +crdvdtq5sixone97 +8eightbvbg +gvjscdfkdmseventhree2nbvbzmdmmtrfive +1threesevenhcxggpds4two12six +5onekxzkfour8 +2ddeight4 +645 +ninejjrlhdhjtzmrlvljfr98 +seven11ninebvbtnbzdmblbjvzsh +9nine59xmdktjsnseventhree +qdxgtk6126vxcgtxkkbqjrpfntvsprq +75cqkfddg5ninejkbvpsbcltssh1 +3onerfpqbsvone39one3nrxmbk +1612three1 +8hqrsksevenldcqrcfxhr +ninerfkxndfhhkfivefjntjzxhgpbbffvfour2sg1 +seven37kbxszsgpt +89435jpgsfiverhsztt +threeseven1sixsix21five6 +pzht15gxvjlvsfour6eight8two +lkvcseven771gcvrsvsshtppdgxnvclqhnjlvvthree +sevenmpghzvvrd6 +8vprrlcq9xzhmhnj4 +dxhsxknone1two4 +eight64d +8jqdlcsixzzhvnnfiveqbtlhrr +9eight5nine5fiverk +xhhxgf5bfsbthreesthreeltlvhvrjnslxhsrp +twoqccssix55twofour3vtsjxk +goneightpqgblvhpmp4sevenonethree9sixsixfour +onethree536xhznine7df +998 +hsix23three +chgtqonenvxtlrhxvxmbbl5 +2zkzg +1hgrpzshm5onebcgpfv9onecgtr +3sixonevldsdlxqtjsnlt5onehxdpfive +eighteight59phbd9ldnvdlsxninenine +zseven9 +xptwonekdrnv2 +5tsmnbhxhzrtfbknbqsevensnxbqrhs5 +694onebvmscclkbsfour1kxgfxdbfour +g2ninetwoned +gmlsjjttcngblmjhtgkz3fourdrzrrmsszfivefive +gtmzmkrktmrkfive8tq5 +eight1four +8eightthreevqgtlfxrm4three6mnrfzvpkbl +szrbvtwo3lqbxthreefivemshzfgjzlllrmr6 +kzczdbjcbnine8nnineninevfbt3vsvcplsnj +ninesevensmgfsix5fivedfpxvmtmcsgzpbppfjt +sevenctdzznone7three5kngbthreenine +44sixoneonesix +nine9fiverrbbrqtfive53 +onesix2oneseventhree3rmpjl +23htxtgxqkseven +fourlkbsix3twonndccsseightbs +eight8two5four3 +five8dvxpqfsixghrkg3fourninetfsdbxzp +bhtqtclbsix6jlvxtgmq +498three1 +2t +7five3bcjxsglnxqjxjqfb +6seveneightxvmqgbklgnbfgzlncvg +89nine74gbgbcone +8dtln6 +svtl5eight8 +jsxzlsix8bzrmcl659lrmgtnpv +64rklskvlndm6ninextbrs4 +voneight79two +sbzdmjbtwo7dnglczphb77fvhtwo +two3eightwoj +rtoneighttsgeight89nine4 +3six8vbdbthxxffgm +rxgoneight4mtqdpzbfndtsvsrzt +7one4lbqcfnffive8 +fivecd8two2eight +twofivefive6twotwoklvbdstxfcvsm9 +threemdrdnhl7sixseven46mctldxnn +5njljbxdrcbrrm3ninec +5jg6eight4 +ninethreetwo6dnldknsnn +xrpczvvfnpjfbpvxzjzpmrkpb8fivesixtwonetj +4five4vmone3td6 +77jbgjkgkfd1691lfp +fhxvlvct6 +scjeightwo6onedjz71jslzdfxp +7eightpblnnbvqtvtwoseven +btdgplkdvl5rlzjkthree2threefive +298 +7hhfxtfcvsqjvsxpbdjqzxngg832tdznpfhz8 +drhfzlnlcrsix2dbjqhrxzqrsixsevengrnine +sixninesixoneeighttwo96 +onekqzjft4zdspcvmbjtzbsixv +sixgkx74 +75eightqvblvm2gtjmcljphjvtwonesq +bcmqtltwoxsbkvhdv96df81 +eight3bk45sixninezdnntshfv +9threetwosix +2vrfzsvcprnjzngl2nine +fivekdhcgrpznvsix2nmhthl27 +195 +four8tspldsixzzqxrqqmsr +8bnvksmmlhnfive372jmxhj +nineseven6threeeightnine7vtzmpf +2twofivehbponevptflmzgxljzfour +85eight81two +2ctnhxfivethree148vjtzfdfkkfvvtgb +62sixpsfjzcxzlzsjbtxnjpbctgcjm9 +gmclvqfq1 +32csv9dgfxsjm +4fjcdrzmznhfive33345 +62eightrdplbxdhfq1eight +4four97skpvpphtbqmmsckxpdqnfour +913sevennmmbbnntrs +862twonec +three2four7foureighttwo6 +ninejnt721nine8 +eight1gpnrlklmxt +nine2mrzvhlzxgninesixkp +cklsqdf9nine3 +seventhreefivehdnkjqtd4tcjxpbcvpjsvbhdvx3frkc +one85sbrtsftwo6 +sixnine8nineone46six +dmtlrzkfdsdklbvzckjmnthkkmqh9 +ninetwojone8 +bfneighttwo5 +slqmsbnl4mmeight7 +55dnsb2485 +fivesixmzvmsmkkhd86twotwofour +gppnzsevenninemzbzzqqhzvgclndss16 +8two7r +8xsevenbfvhdqxtwoeight86 +fnnineeight1eightninenine8twonejgf +five7three51 +eightthreevsnn4seven +nhhjkxhtxp4csfeight +2nine9sixfour9 +fveighttvjxbhzfour7ninetwo +5eight6 +txnxcrx3 +chbmjvmlfqfgsg2hdg +56five29hrrjgxnrbnzjjktdfqssjqksxn +eighttwohszdlc7veight +5ltglgmlfkkbzkvh +eight336gbxmzjsbpgztprdv2eighttwo +five44 +kdfbgxpcqtdlksc4threefournineeightnshlmfvs +1c5six +nss7bccb +34eight9six92 +onetwofivedblgtrxzpvmrhhsj2jhrcbbsseven3 +vxkczjfhnine5drz +bfourqkmt1 +two2onedgxgmffcg1 +3threenine6vlstktnqdzfive +three8gsqdqpv +7ndgkns +4onerglbzsjrkqskljcgthree +zxkgzkvn7fssgdsblvksixn +788sjxcxmtxfivezzpgsbzbtl8fourtwo +9mhrlcsqqgzjrfnd +7kbmhmlghssix231 +7tcfv6jpkxnzmrtx2 +bcxvhcjbhsxbgbrj28fivenhk +jrm3447 +ljsix29mhrmrjpcfqone +xqdxkzls46 +bmhnfnd9qmbndfhqnv9bhdpqxthreefbptttwosix +six9three5blqp37seven +44ffvsnxttwo8seven +cmjccpp34threesix6jhthree +eight86 +3vqqjlgdj9zncvjhbpr2d +26sfzqpfgfivetwo56 +xljmtkjkzthree8 +ninesevenfourtsctjhvfive4dt +jzsxmmxmpllqpmszczxzghpxp4 +hcrtjnvghvnthree5one +5twoeightsktxhmkpcts +ltrkvbzlnccrmrsfmjrbfjrh75 +cbxfpfsix8lkbqh +9mseven7fivefivexdjxct5 +9sevenklrvhclkrfourtwo96four +2pkbthree +kqpbhjxzfn147 +nineqnjxrmq2gnineh +5sixcrtgqqlqflm +9fourzjzmhmnksxc +four86rdndxscqnjcxghnvgmzp3 +mqmfive98eightmbxrgddqbbqone +gtb66rbclkxdl4spzpgqmkdh3 +965two +96pskqjvckxffkone8four4 +three9xlf1 +spczeight9dvg +v6two +pgksdtnkbbninef5zttwo2seven +4gnvxkc +9four43sixtwofzf +3xsbfcsixsix4eighteight2one +3oneeighttwo +ptwonetwoskjsspjhmxrmvlzcqz572fourmpxx +threeonetwotwo2 +slcseven1xtxbpfb +peightwothree7pdmktbcfouroneninekrf6two +668 +lxshscpkv8fmhcpslhpp +tzrdone7onethreectwo +8pkkpdmzhfourcmjljfour73hhqqmfc +one71ninesix8oneighthlx +72pjpmfcgjhvsixksgrjthreegcspcdxchxkxflmh +4bzr98threeksb +9one6xdfcsvbbqfour +hr5eight33 +zgsvc9 +71hfourtch395pvnzsmhdf +zsvppvgzllgf22 +threebkkrcqzvnt4rjblsnsixninetrjgjjvlv2 +289 +krqdkcfbpp48fivefour +five7tgpt5flkone +eightfive31twoghnqffp6 +eightseven6oneckpsixtwo1 +4l4 +4sevenxzdnprlcjrfive +68vntztlbjqtqkstsp7lkhcgpbtdmzrndsix +onesix2 +sixhc4hhglhp7281h +3zvhhv +lmfsqtnzfk52qrdh +fourbvnsjfjfive87seven1 +twoonesixsix1twodxjdkdeight +nnine3 +ccclkfdb2lftfhnjcqd +1q +gtcdzjhfv8p9 +fivefqxrfourtwo62eighthdcsqrmxjv +one556mgtsdvkqfiveseventwo3 +mvkrxnj34psqtwojhrdjgthree5 +sevencndnndjfzp2eightqcbhvb +eighttbvvck2fiveone6vkljmslcrsghk +tqdhnzfrr6fourzf +ninecqxgkbsv7 +8nsl4sixnxrcdhtkeight3 +sevenxsczhz6dv4sc9brxnsms +5glknvqzlqvmzvnzrb1 +5oneqcshgqbfp1 +5two1sixsevenjpgnbvjpcgd1eightwoh +2qglrzsxz +fpdthreek2 +gplr51sevenfg34jhhp +six78tbzz +hntwonethreergcp7 +59fivefive5 +threezfjxxtqrvhjcdkjsevenhgp44fivetphhfbdtxs +njkd2dcddfzpvpfqp +3sixgnnl +6ninefdqzfpxspsnzs13gz4 +3four66one +fivesevenczmt22nfvnxhbvgjtvjmdzhfqhxtthree +sttx4gktnine5vlqjzddkr +4fivejpsscfqdtgjmtvrljdseveneight +xtfqvnpsfnfppx12rvcldvkhbb +62hj4oneqlp4seven +6hdnlgrfdccsqsxjqrv +331 +nine6eight +two6mbfdmgpfourng +fmnv3three3 +nine5hvzkrjtwo +6eight73 +fourfive79six7two1 +thzhjrfsfoureight53 +1lzfxgvtxgdxtsixffptldz1srgsnvtpnsevensix +seven8onertbqhthreefourctdbsrcvcsjlvcxneight +5eightfive3 +6phjbkvrjd +gssfoursevengvtfznklj97 +fivemgrddqslp3 +ninetwo6sixpv +lhdjm82tlnqrxqtvd +six7hpcjqnrszkfiveftvjnhjsevendqmmr +m2cjfjcb +thfive27fjnshtwo +vmzxlq7 +xlg3nine +schnfive33sevenninedhpjfrsixeightwoxr +bmnine3mgrttsevennvhtdszmtxoneone +zgkqdrvfjtg1sixbsqgdjfivelnrmpqqstv6seven +ljln11fourgjgvfmhmninekdlpjmrn +jffhrkpm22sbnsrpxg9three +fourtwo1sixjvv55ttflnvshb +xgndhkmdnxgrhqh4lm +87five6nineddnrzd +9pmmddvffivesix3one37 +2flddmzcjbfrbdxzhvhsrx16twonej +knzfrseven71fjzhmdznfthree +9five84dfj +sevenc1qhxqhgl +flkdskjjzmqtcmljkone49ljffjtxhs9eightwopq +qhhktqkdfjzth5eight6 +sevensixmvvrzhsixsixsix9 +2241 +1xzjfpjkkcltvznzzfrh +jrvcznlvfgntthree5fivejqrheightwoxkh +lqxtk1oneone3rkfive +hqjbpqjeight3588 +one96sixkbgcx6zhmnine +eight77six +four46nine31five3five +lhd8two7dhthqhbzvlknvtrlfthreeninethreetwonez +5cdgllrdsspnninerxdphcsstt +s9twosixonezcrfmcd +dtqfrnrtdn2threespcfh +113six +onefkznlfjpkfivethree47three +f4hlxdlndqp4blmbzxfvone +czsdseven22ht9threepmfhdpq +7mdvchlcpn +5ssxkrgvhthmleight +seven13four7fiveq +threetcstlhfcqdfhjgccckcvk1hjlpmmkjmr8six +sljoneightg8fourfrsfbgfktr +jfeightwolzcmztqeighttftr3oneonefour +four7tdkq8threeeightfcgpddp +drj3vlj5tcjsfbzffcmmqmgtt5 +82 +jsvzmkqrlkkvfmdxjrshhnsixseven53three +seven1twoninebdpb4 +bjhtgqbfnccspgzbhlqgdzfznxhsixgdfkg91two +fqzrrbchbmhrneightclvd1 +sixeightseven1rlnlqlm +pxxtd793frjfckbhstcdhsrx58mksktwoneqx +zccxxqcfglnnrxdonefivevxtxgzgkh51 +fivenzrmrjfpjhxhkxthtkdrqfthree2twoeight +kzjn9fourqmglnxmqfivenfg51 +cxeightwo8lzqcdlmbgt5 +fivekmfkjnqseven9jlts4 +724dtlznnqtthreeeight54one +7ninesevennine +dj5zhmxtgsdpzlkzcbvnldeight3kk5mmvs +19hczk +3sevenhlkttqsqllsbplone +fourtzlbxhvt7ht54dvtkdprljj9 +fourmvpzqjnb2hmhc3zjvlgrxsm +onekqjtd8five +82rbnsg48twoseven +four352 +2rlxcfoursixczbvb9 +5fourjxggrtg9bmrlnmmhsgtwo96 +8nd2foureight7qg5nine +8twozx +rpfmg3twoeight87 +13five5 +one39six55ninenhhdd +9eightnineone +321fivefour +531sevenhxznfmdxnxfptkbcfpn84xtjrbrmbxk +5tqkzdf6 +sevenlnmnzh35fivetwotrbnknfive +qjqbcbhlqfive8mfmxdssvtdhq +threesixlxmhgzxxjxrgmxzqprl7 +24nnjmxxkbxjmmdssdpb8twotwoone +9four7 +9sixtgj29eight8 +fivebvzrbftvvdzd5nctrmjmbx5eight3 +4threedfzlzxfprzqpkzmlnsix9four +qbqjfbqthxvhnine99five7kgqm +pdvcpcdvjninethreethreeseven5 +ninelrsshpxvb32trfrhnnbkseven5 +1zktcvtrknt +tbxt59dfqzxcdj +zclzlgcmkneightzskgbg62five +vlhtm4gsjtcvkkprsix1sixmdkxlgp76 +vxgmnjsixfivesix69threejlrrcc +onefive5sevenfhvsbfpcxbqn1one1 +rlxrbhtwobmhfcgnmtg6zlgz95sncg +6tgsl +mjsjpone9 +rsqfmseven5qqhrxhfxf6twohnxjgh66 +xbfqgxkxmninegmhcrcmxgllktllbqpsvrfthree9 +2one7kthlnfive3kq +sixfour8lztglpvfv5 +bjcrvvglvjn1 +3mlfdone42 +4one5twoxqfcflcbjqsixeightdlknnzdbzlrqfkhvm +cfpnhsgs956 +xsdm7lhcjzk3hstcf +9fourcsjph86shfqjrxlfourninev +bgcxqff8 +4eightv51 +six6two4lvtjt61 +44kmn +rbgfivefive3eightthree +three4nhvblteightfour +2six64rjmcvvxshxjlndj +3nine4fourjclspd152rpv diff --git a/data/Y2023/D02/riddle b/data/Y2023/D02/riddle new file mode 100644 index 0000000..e69de29 diff --git a/data/Y2023/D03/riddle b/data/Y2023/D03/riddle new file mode 100644 index 0000000..e69de29 diff --git a/data/Y2023/D04/riddle b/data/Y2023/D04/riddle new file mode 100644 index 0000000..e69de29 diff --git a/data/Y2023/D05/riddle b/data/Y2023/D05/riddle new file mode 100644 index 0000000..e69de29 diff --git a/data/Y2023/D06/riddle b/data/Y2023/D06/riddle new file mode 100644 index 0000000..e69de29 diff --git a/data/Y2023/D07/riddle b/data/Y2023/D07/riddle new file mode 100644 index 0000000..e69de29 diff --git a/data/Y2023/D08/riddle b/data/Y2023/D08/riddle new file mode 100644 index 0000000..e69de29 diff --git a/data/Y2023/D09/riddle b/data/Y2023/D09/riddle new file mode 100644 index 0000000..e69de29 diff --git a/data/Y2023/D10/riddle b/data/Y2023/D10/riddle new file mode 100644 index 0000000..e69de29 diff --git a/data/Y2023/D11/riddle b/data/Y2023/D11/riddle new file mode 100644 index 0000000..e69de29 diff --git a/data/Y2023/D12/riddle b/data/Y2023/D12/riddle new file mode 100644 index 0000000..e69de29 diff --git a/data/Y2023/D13/riddle b/data/Y2023/D13/riddle new file mode 100644 index 0000000..e69de29 diff --git a/data/Y2023/D14/riddle b/data/Y2023/D14/riddle new file mode 100644 index 0000000..e69de29 diff --git a/data/Y2023/D15/riddle b/data/Y2023/D15/riddle new file mode 100644 index 0000000..e69de29 diff --git a/data/Y2023/D16/riddle b/data/Y2023/D16/riddle new file mode 100644 index 0000000..e69de29 diff --git a/data/Y2023/D17/riddle b/data/Y2023/D17/riddle new file mode 100644 index 0000000..e69de29 diff --git a/data/Y2023/D18/riddle b/data/Y2023/D18/riddle new file mode 100644 index 0000000..e69de29 diff --git a/data/Y2023/D19/riddle b/data/Y2023/D19/riddle new file mode 100644 index 0000000..e69de29 diff --git a/data/Y2023/D20/riddle b/data/Y2023/D20/riddle new file mode 100644 index 0000000..e69de29 diff --git a/data/Y2023/D21/riddle b/data/Y2023/D21/riddle new file mode 100644 index 0000000..e69de29 diff --git a/data/Y2023/D22/riddle b/data/Y2023/D22/riddle new file mode 100644 index 0000000..e69de29 diff --git a/data/Y2023/D23/riddle b/data/Y2023/D23/riddle new file mode 100644 index 0000000..e69de29 diff --git a/data/Y2023/D24/riddle b/data/Y2023/D24/riddle new file mode 100644 index 0000000..e69de29 diff --git a/data/Y2023/D25/riddle b/data/Y2023/D25/riddle new file mode 100644 index 0000000..e69de29 diff --git a/gen.sh b/gen.sh new file mode 100755 index 0000000..a065029 --- /dev/null +++ b/gen.sh @@ -0,0 +1,39 @@ +#!/usr/bin/env bash + +Y="$1"; shift +if [ -z "$Y" ]; then + Y="$(date +%Y)" +fi + +fday="$1"; shift +tday="$1"; shift + +if [ -z "$fday" ]; then + fday=1 + tday=25 +fi +if [ -z "$tday" ]; then + tday="${fday}" +fi + +days=($(seq $fday $tday)) + +if ! grep -q "Y${Y}" src/AoC/Year.hs; then + sed -i -e "s/\(\(\s\+\)= Y0000\)/\1\n\2| Y${Y}/" src/AoC/Year.hs +fi + +mkdir -p "src/AoC/Y${Y}" +if ! test -f "src/AoC/Y${Y}.hs"; then + sed -e "s/Y0000/Y${Y}/g" template/Y0000.hs > "src/AoC/Y${Y}.hs" +fi + +for d in "${days[@]}"; do + d=$(printf "%02d" "$d") + mkdir -p "data/Y${Y}/D${d}" + touch "data/Y${Y}/D${d}/riddle" + touch "data/Y${Y}/D${d}/result" + + if ! test -f "src/AoC/Y${Y}/D${d}.hs"; then + sed -e "s/Y0000/Y${Y}/g" -e "s/D00/D${d}/g" template/D00.hs > "src/AoC/Y${Y}/D${d}.hs" + fi +done diff --git a/package.yaml b/package.yaml index 6b63cc4..7d8239b 100644 --- a/package.yaml +++ b/package.yaml @@ -9,13 +9,15 @@ description: "Advent-Of-Code" extra-source-files: - README.org +data-dir: data + dependencies: - name: base mixin: - hiding (Prelude) - name: relude mixin: - - (Relude as Prelude) + - (Relude as Prelude, Relude, Relude.Unsafe, Relude.Extra.Enum) - containers - text - megaparsec @@ -24,6 +26,7 @@ ghc-options: - -Weverything - -Wno-implicit-prelude - -Wno-missing-import-lists # Requires explicit imports of _every_ function (e.g. ‘$’); too strict + - -Wno-missing-kind-signatures - -Wno-missed-specialisations # When GHC can’t specialize a polymorphic function. No big deal and requires fixing underlying libraries to solve. - -Wno-all-missed-specialisations # See missed-specialisations - -Wno-unsafe # Don’t use Safe Haskell warnings @@ -40,9 +43,11 @@ default-extensions: - BlockArguments - OverloadedStrings - ImportQualifiedPost + - DerivingStrategies library: source-dirs: src + generated-other-modules: Paths_aoc verbatim: default-language: GHC2021 diff --git a/src/AoC.hs b/src/AoC.hs index 7a3c6dc..3431b23 100644 --- a/src/AoC.hs +++ b/src/AoC.hs @@ -1,21 +1,32 @@ -{-# LANGUAGE OverloadedStrings #-} - module AoC ( defaultMain, + runAoC, + module AoC.Day, + module AoC.Year, ) where +import AoC.Day +import AoC.Riddle +import AoC.Year + import Control.Exception qualified as Exception import System.IO (hPutStrLn) import System.IO.Error qualified as IOError -runAoC :: [String] -> IO () -runAoC _args = putStrLn "Hello" +import AoC.Y2023 qualified as Y2023 + +runAoC :: (MonadIO m) => Year -> Day -> m (Either Text Solution) +runAoC y d = do + riddle <- loadRiddle y d + solve y d riddle + +solve :: (MonadIO m) => Year -> Day -> Riddle -> m (Either Text Solution) +solve Y2023 = Y2023.solve +solve y = \_ _ -> pure $ Left $ show y <> ": not implementedi" handleError :: IOError.IOError -> IO () handleError e = do hPutStrLn stderr $ "I ran into an issue: " <> show e defaultMain :: IO () -defaultMain = do - args <- getArgs - Exception.catch (runAoC args) handleError +defaultMain = Exception.catch (runAoC Y2023 D01 >>= print) handleError diff --git a/src/AoC/Day.hs b/src/AoC/Day.hs new file mode 100644 index 0000000..76232c6 --- /dev/null +++ b/src/AoC/Day.hs @@ -0,0 +1,29 @@ +module AoC.Day (Day (..)) where + +data Day + = D01 + | D02 + | D03 + | D04 + | D05 + | D06 + | D07 + | D08 + | D09 + | D10 + | D11 + | D12 + | D13 + | D14 + | D15 + | D16 + | D17 + | D18 + | D19 + | D20 + | D21 + | D22 + | D23 + | D24 + | D25 + deriving stock (Read, Show, Eq, Ord, Enum) diff --git a/src/AoC/Riddle.hs b/src/AoC/Riddle.hs new file mode 100644 index 0000000..f9ad279 --- /dev/null +++ b/src/AoC/Riddle.hs @@ -0,0 +1,20 @@ +module AoC.Riddle ( + Riddle (..), + Error (..), + Solution (..), + loadRiddle, +) where + +import AoC.Util (readFileUtf8) + +import AoC.Day +import AoC.Year + +type Riddle = Text +type Error = Text +type Solution = [Integer] + +loadRiddle :: (MonadIO m) => Year -> Day -> m Riddle +loadRiddle y d = readFileUtf8 inputFile + where + inputFile = intercalate "/" ["data", show y, show d, "riddle"] diff --git a/src/AoC/Internal.hs b/src/AoC/Util.hs similarity index 89% rename from src/AoC/Internal.hs rename to src/AoC/Util.hs index d3d22c9..aa91a52 100644 --- a/src/AoC/Internal.hs +++ b/src/AoC/Util.hs @@ -1,5 +1,5 @@ -- | Internal module in order to facilitate testability. -module AoC.Internal (solveRiddle, readFileUtf8) where +module AoC.Util (solveRiddle, readFileUtf8) where readFileUtf8 :: (MonadIO m) => FilePath -> m Text readFileUtf8 = fmap (decodeUtf8With lenientDecode) . readFileBS diff --git a/src/AoC/Y2023.hs b/src/AoC/Y2023.hs new file mode 100644 index 0000000..389adc6 --- /dev/null +++ b/src/AoC/Y2023.hs @@ -0,0 +1,57 @@ +module AoC.Y2023 (solve) where + +import AoC.Day +import AoC.Riddle + +import AoC.Y2023.D01 qualified as D01 +import AoC.Y2023.D02 qualified as D02 +import AoC.Y2023.D03 qualified as D03 +import AoC.Y2023.D04 qualified as D04 +import AoC.Y2023.D05 qualified as D05 +import AoC.Y2023.D06 qualified as D06 +import AoC.Y2023.D07 qualified as D07 +import AoC.Y2023.D08 qualified as D08 +import AoC.Y2023.D09 qualified as D09 +import AoC.Y2023.D10 qualified as D10 +import AoC.Y2023.D11 qualified as D11 +import AoC.Y2023.D12 qualified as D12 +import AoC.Y2023.D13 qualified as D13 +import AoC.Y2023.D14 qualified as D14 +import AoC.Y2023.D15 qualified as D15 +import AoC.Y2023.D16 qualified as D16 +import AoC.Y2023.D17 qualified as D17 +import AoC.Y2023.D18 qualified as D18 +import AoC.Y2023.D19 qualified as D19 +import AoC.Y2023.D20 qualified as D20 +import AoC.Y2023.D21 qualified as D21 +import AoC.Y2023.D22 qualified as D22 +import AoC.Y2023.D23 qualified as D23 +import AoC.Y2023.D24 qualified as D24 +import AoC.Y2023.D25 qualified as D25 + +solve :: (MonadIO m) => Day -> Text -> m (Either Error Solution) +solve D01 = D01.solve +solve D02 = D02.solve +solve D03 = D03.solve +solve D04 = D04.solve +solve D05 = D05.solve +solve D06 = D06.solve +solve D07 = D07.solve +solve D08 = D08.solve +solve D09 = D09.solve +solve D10 = D10.solve +solve D11 = D11.solve +solve D12 = D12.solve +solve D13 = D13.solve +solve D14 = D14.solve +solve D15 = D15.solve +solve D16 = D16.solve +solve D17 = D17.solve +solve D18 = D18.solve +solve D19 = D19.solve +solve D20 = D20.solve +solve D21 = D21.solve +solve D22 = D22.solve +solve D23 = D23.solve +solve D24 = D24.solve +solve D25 = D25.solve diff --git a/src/AoC/Y2023/D01.hs b/src/AoC/Y2023/D01.hs new file mode 100644 index 0000000..d7a0c8a --- /dev/null +++ b/src/AoC/Y2023/D01.hs @@ -0,0 +1,24 @@ +module AoC.Y2023.D01 (solve) where + +import AoC.Riddle +import Data.Char (digitToInt, isDigit) +import Relude.Unsafe (fromJust) + +digits :: String -> [Int] +digits = fmap digitToInt . filter isDigit + +digits' :: String -> NonEmpty Int +digits' = fromJust . nonEmpty . digits + +calibrationValue :: String -> Int +calibrationValue s = firstDigit * 10 + lastDigit + where + ds = digits' s + firstDigit = head ds + lastDigit = last ds + +solvePart1 :: Text -> Integer +solvePart1 = fromIntegral . sum . fmap (calibrationValue . toString) . lines + +solve :: (MonadIO m) => Text -> m (Either Text Solution) +solve input = pure $ Right [solvePart1 input] diff --git a/src/AoC/Y2023/D02.hs b/src/AoC/Y2023/D02.hs new file mode 100644 index 0000000..ee63e88 --- /dev/null +++ b/src/AoC/Y2023/D02.hs @@ -0,0 +1,6 @@ +module AoC.Y2023.D02 (solve) where + +import AoC.Riddle + +solve :: (MonadIO m) => Text -> m (Either Text Solution) +solve _ = pure $ Left "not yet implemented" diff --git a/src/AoC/Y2023/D03.hs b/src/AoC/Y2023/D03.hs new file mode 100644 index 0000000..c509d93 --- /dev/null +++ b/src/AoC/Y2023/D03.hs @@ -0,0 +1,6 @@ +module AoC.Y2023.D03 (solve) where + +import AoC.Riddle + +solve :: (MonadIO m) => Text -> m (Either Text Solution) +solve _ = pure $ Left "not yet implemented" diff --git a/src/AoC/Y2023/D04.hs b/src/AoC/Y2023/D04.hs new file mode 100644 index 0000000..d433091 --- /dev/null +++ b/src/AoC/Y2023/D04.hs @@ -0,0 +1,6 @@ +module AoC.Y2023.D04 (solve) where + +import AoC.Riddle + +solve :: (MonadIO m) => Text -> m (Either Text Solution) +solve _ = pure $ Left "not yet implemented" diff --git a/src/AoC/Y2023/D05.hs b/src/AoC/Y2023/D05.hs new file mode 100644 index 0000000..2abeb79 --- /dev/null +++ b/src/AoC/Y2023/D05.hs @@ -0,0 +1,6 @@ +module AoC.Y2023.D05 (solve) where + +import AoC.Riddle + +solve :: (MonadIO m) => Text -> m (Either Text Solution) +solve _ = pure $ Left "not yet implemented" diff --git a/src/AoC/Y2023/D06.hs b/src/AoC/Y2023/D06.hs new file mode 100644 index 0000000..4b9fd40 --- /dev/null +++ b/src/AoC/Y2023/D06.hs @@ -0,0 +1,6 @@ +module AoC.Y2023.D06 (solve) where + +import AoC.Riddle + +solve :: (MonadIO m) => Text -> m (Either Text Solution) +solve _ = pure $ Left "not yet implemented" diff --git a/src/AoC/Y2023/D07.hs b/src/AoC/Y2023/D07.hs new file mode 100644 index 0000000..68a369e --- /dev/null +++ b/src/AoC/Y2023/D07.hs @@ -0,0 +1,6 @@ +module AoC.Y2023.D07 (solve) where + +import AoC.Riddle + +solve :: (MonadIO m) => Text -> m (Either Text Solution) +solve _ = pure $ Left "not yet implemented" diff --git a/src/AoC/Y2023/D08.hs b/src/AoC/Y2023/D08.hs new file mode 100644 index 0000000..024d550 --- /dev/null +++ b/src/AoC/Y2023/D08.hs @@ -0,0 +1,6 @@ +module AoC.Y2023.D08 (solve) where + +import AoC.Riddle + +solve :: (MonadIO m) => Text -> m (Either Text Solution) +solve _ = pure $ Left "not yet implemented" diff --git a/src/AoC/Y2023/D09.hs b/src/AoC/Y2023/D09.hs new file mode 100644 index 0000000..c0111cf --- /dev/null +++ b/src/AoC/Y2023/D09.hs @@ -0,0 +1,6 @@ +module AoC.Y2023.D09 (solve) where + +import AoC.Riddle + +solve :: (MonadIO m) => Text -> m (Either Text Solution) +solve _ = pure $ Left "not yet implemented" diff --git a/src/AoC/Y2023/D10.hs b/src/AoC/Y2023/D10.hs new file mode 100644 index 0000000..dedcb34 --- /dev/null +++ b/src/AoC/Y2023/D10.hs @@ -0,0 +1,6 @@ +module AoC.Y2023.D10 (solve) where + +import AoC.Riddle + +solve :: (MonadIO m) => Text -> m (Either Text Solution) +solve _ = pure $ Left "not yet implemented" diff --git a/src/AoC/Y2023/D11.hs b/src/AoC/Y2023/D11.hs new file mode 100644 index 0000000..979fee6 --- /dev/null +++ b/src/AoC/Y2023/D11.hs @@ -0,0 +1,6 @@ +module AoC.Y2023.D11 (solve) where + +import AoC.Riddle + +solve :: (MonadIO m) => Text -> m (Either Text Solution) +solve _ = pure $ Left "not yet implemented" diff --git a/src/AoC/Y2023/D12.hs b/src/AoC/Y2023/D12.hs new file mode 100644 index 0000000..035fca3 --- /dev/null +++ b/src/AoC/Y2023/D12.hs @@ -0,0 +1,6 @@ +module AoC.Y2023.D12 (solve) where + +import AoC.Riddle + +solve :: (MonadIO m) => Text -> m (Either Text Solution) +solve _ = pure $ Left "not yet implemented" diff --git a/src/AoC/Y2023/D13.hs b/src/AoC/Y2023/D13.hs new file mode 100644 index 0000000..a8678c6 --- /dev/null +++ b/src/AoC/Y2023/D13.hs @@ -0,0 +1,6 @@ +module AoC.Y2023.D13 (solve) where + +import AoC.Riddle + +solve :: (MonadIO m) => Text -> m (Either Text Solution) +solve _ = pure $ Left "not yet implemented" diff --git a/src/AoC/Y2023/D14.hs b/src/AoC/Y2023/D14.hs new file mode 100644 index 0000000..7c591d3 --- /dev/null +++ b/src/AoC/Y2023/D14.hs @@ -0,0 +1,6 @@ +module AoC.Y2023.D14 (solve) where + +import AoC.Riddle + +solve :: (MonadIO m) => Text -> m (Either Text Solution) +solve _ = pure $ Left "not yet implemented" diff --git a/src/AoC/Y2023/D15.hs b/src/AoC/Y2023/D15.hs new file mode 100644 index 0000000..43b5888 --- /dev/null +++ b/src/AoC/Y2023/D15.hs @@ -0,0 +1,6 @@ +module AoC.Y2023.D15 (solve) where + +import AoC.Riddle + +solve :: (MonadIO m) => Text -> m (Either Text Solution) +solve _ = pure $ Left "not yet implemented" diff --git a/src/AoC/Y2023/D16.hs b/src/AoC/Y2023/D16.hs new file mode 100644 index 0000000..edcb507 --- /dev/null +++ b/src/AoC/Y2023/D16.hs @@ -0,0 +1,6 @@ +module AoC.Y2023.D16 (solve) where + +import AoC.Riddle + +solve :: (MonadIO m) => Text -> m (Either Text Solution) +solve _ = pure $ Left "not yet implemented" diff --git a/src/AoC/Y2023/D17.hs b/src/AoC/Y2023/D17.hs new file mode 100644 index 0000000..ae873c6 --- /dev/null +++ b/src/AoC/Y2023/D17.hs @@ -0,0 +1,6 @@ +module AoC.Y2023.D17 (solve) where + +import AoC.Riddle + +solve :: (MonadIO m) => Text -> m (Either Text Solution) +solve _ = pure $ Left "not yet implemented" diff --git a/src/AoC/Y2023/D18.hs b/src/AoC/Y2023/D18.hs new file mode 100644 index 0000000..f8d5908 --- /dev/null +++ b/src/AoC/Y2023/D18.hs @@ -0,0 +1,6 @@ +module AoC.Y2023.D18 (solve) where + +import AoC.Riddle + +solve :: (MonadIO m) => Text -> m (Either Text Solution) +solve _ = pure $ Left "not yet implemented" diff --git a/src/AoC/Y2023/D19.hs b/src/AoC/Y2023/D19.hs new file mode 100644 index 0000000..54e3187 --- /dev/null +++ b/src/AoC/Y2023/D19.hs @@ -0,0 +1,6 @@ +module AoC.Y2023.D19 (solve) where + +import AoC.Riddle + +solve :: (MonadIO m) => Text -> m (Either Text Solution) +solve _ = pure $ Left "not yet implemented" diff --git a/src/AoC/Y2023/D20.hs b/src/AoC/Y2023/D20.hs new file mode 100644 index 0000000..7fee6f1 --- /dev/null +++ b/src/AoC/Y2023/D20.hs @@ -0,0 +1,6 @@ +module AoC.Y2023.D20 (solve) where + +import AoC.Riddle + +solve :: (MonadIO m) => Text -> m (Either Text Solution) +solve _ = pure $ Left "not yet implemented" diff --git a/src/AoC/Y2023/D21.hs b/src/AoC/Y2023/D21.hs new file mode 100644 index 0000000..cc073fb --- /dev/null +++ b/src/AoC/Y2023/D21.hs @@ -0,0 +1,6 @@ +module AoC.Y2023.D21 (solve) where + +import AoC.Riddle + +solve :: (MonadIO m) => Text -> m (Either Text Solution) +solve _ = pure $ Left "not yet implemented" diff --git a/src/AoC/Y2023/D22.hs b/src/AoC/Y2023/D22.hs new file mode 100644 index 0000000..2d59dae --- /dev/null +++ b/src/AoC/Y2023/D22.hs @@ -0,0 +1,6 @@ +module AoC.Y2023.D22 (solve) where + +import AoC.Riddle + +solve :: (MonadIO m) => Text -> m (Either Text Solution) +solve _ = pure $ Left "not yet implemented" diff --git a/src/AoC/Y2023/D23.hs b/src/AoC/Y2023/D23.hs new file mode 100644 index 0000000..953685b --- /dev/null +++ b/src/AoC/Y2023/D23.hs @@ -0,0 +1,6 @@ +module AoC.Y2023.D23 (solve) where + +import AoC.Riddle + +solve :: (MonadIO m) => Text -> m (Either Text Solution) +solve _ = pure $ Left "not yet implemented" diff --git a/src/AoC/Y2023/D24.hs b/src/AoC/Y2023/D24.hs new file mode 100644 index 0000000..27cab03 --- /dev/null +++ b/src/AoC/Y2023/D24.hs @@ -0,0 +1,6 @@ +module AoC.Y2023.D24 (solve) where + +import AoC.Riddle + +solve :: (MonadIO m) => Text -> m (Either Text Solution) +solve _ = pure $ Left "not yet implemented" diff --git a/src/AoC/Y2023/D25.hs b/src/AoC/Y2023/D25.hs new file mode 100644 index 0000000..cb0b109 --- /dev/null +++ b/src/AoC/Y2023/D25.hs @@ -0,0 +1,6 @@ +module AoC.Y2023.D25 (solve) where + +import AoC.Riddle + +solve :: (MonadIO m) => Text -> m (Either Text Solution) +solve _ = pure $ Left "not yet implemented" diff --git a/src/AoC/Year.hs b/src/AoC/Year.hs new file mode 100644 index 0000000..0576478 --- /dev/null +++ b/src/AoC/Year.hs @@ -0,0 +1,6 @@ +module AoC.Year (Year (..)) where + +data Year + = Y0000 + | Y2023 + deriving stock (Read, Show, Eq, Ord, Enum) diff --git a/template/D00.hs b/template/D00.hs new file mode 100644 index 0000000..be4d8fd --- /dev/null +++ b/template/D00.hs @@ -0,0 +1,6 @@ +module AoC.Y0000.D00 (solve) where + +import AoC.Riddle + +solve :: (MonadIO m) => Text -> m (Either Text Solution) +solve _ = pure $ Left "not yet implemented" diff --git a/template/Y0000.hs b/template/Y0000.hs new file mode 100644 index 0000000..60cfbff --- /dev/null +++ b/template/Y0000.hs @@ -0,0 +1,57 @@ +module AoC.Y0000 (solve) where + +import AoC.Day +import AoC.Riddle + +import AoC.Y0000.D01 qualified as D01 +import AoC.Y0000.D02 qualified as D02 +import AoC.Y0000.D03 qualified as D03 +import AoC.Y0000.D04 qualified as D04 +import AoC.Y0000.D05 qualified as D05 +import AoC.Y0000.D06 qualified as D06 +import AoC.Y0000.D07 qualified as D07 +import AoC.Y0000.D08 qualified as D08 +import AoC.Y0000.D09 qualified as D09 +import AoC.Y0000.D10 qualified as D10 +import AoC.Y0000.D11 qualified as D11 +import AoC.Y0000.D12 qualified as D12 +import AoC.Y0000.D13 qualified as D13 +import AoC.Y0000.D14 qualified as D14 +import AoC.Y0000.D15 qualified as D15 +import AoC.Y0000.D16 qualified as D16 +import AoC.Y0000.D17 qualified as D17 +import AoC.Y0000.D18 qualified as D18 +import AoC.Y0000.D19 qualified as D19 +import AoC.Y0000.D20 qualified as D20 +import AoC.Y0000.D21 qualified as D21 +import AoC.Y0000.D22 qualified as D22 +import AoC.Y0000.D23 qualified as D23 +import AoC.Y0000.D24 qualified as D24 +import AoC.Y0000.D25 qualified as D25 + +solve :: (MonadIO m) => Day -> Text -> m (Either Error Solution) +solve D01 = D01.solve +solve D02 = D02.solve +solve D03 = D03.solve +solve D04 = D04.solve +solve D05 = D05.solve +solve D06 = D06.solve +solve D07 = D07.solve +solve D08 = D08.solve +solve D09 = D09.solve +solve D10 = D10.solve +solve D11 = D11.solve +solve D12 = D12.solve +solve D13 = D13.solve +solve D14 = D14.solve +solve D15 = D15.solve +solve D16 = D16.solve +solve D17 = D17.solve +solve D18 = D18.solve +solve D19 = D19.solve +solve D20 = D20.solve +solve D21 = D21.solve +solve D22 = D22.solve +solve D23 = D23.solve +solve D24 = D24.solve +solve D25 = D25.solve diff --git a/test/spec/AoCSpec/InternalSpec.hs b/test/spec/AoCSpec/UtilSpec.hs similarity index 73% rename from test/spec/AoCSpec/InternalSpec.hs rename to test/spec/AoCSpec/UtilSpec.hs index 345cfcb..a6d8739 100644 --- a/test/spec/AoCSpec/InternalSpec.hs +++ b/test/spec/AoCSpec/UtilSpec.hs @@ -1,6 +1,6 @@ -module AoCSpec.InternalSpec (spec) where +module AoCSpec.UtilSpec (spec) where -import AoC.Internal +import AoC.Util import Test.Hspec diff --git a/test/spec/AoCSpec/Y2023Spec.hs b/test/spec/AoCSpec/Y2023Spec.hs new file mode 100644 index 0000000..f09e7a3 --- /dev/null +++ b/test/spec/AoCSpec/Y2023Spec.hs @@ -0,0 +1,10 @@ +module AoCSpec.Y2023Spec (spec) where + +import AoC +import Test.Hspec + +spec :: Spec +spec = do + describe "Day 1" do + it "calculates correctly" do + runAoC Y2023 D01 `shouldReturn` Right [54331] diff --git a/test/spec/SpecHook.hs b/test/spec/SpecHook.hs new file mode 100644 index 0000000..7335e6a --- /dev/null +++ b/test/spec/SpecHook.hs @@ -0,0 +1,6 @@ +module SpecHook (hook) where + +import Test.Hspec + +hook :: Spec -> Spec +hook = parallel