diff --git a/aoc2024.cabal b/aoc2024.cabal index 1dec92a..9396eb3 100644 --- a/aoc2024.cabal +++ b/aoc2024.cabal @@ -43,6 +43,7 @@ library , containers , regex-tdfa >=1.3.2 && <1.4 , text >=2.0.2 + , unordered-containers default-language: Haskell2010 test-suite aoc2024-test @@ -68,4 +69,5 @@ test-suite aoc2024-test , hspec >=2.0.0 , regex-tdfa >=1.3.2 && <1.4 , text >=2.0.2 + , unordered-containers default-language: Haskell2010 diff --git a/input/day4.txt b/input/day4.txt new file mode 100644 index 0000000..e04c96a --- /dev/null +++ b/input/day4.txt @@ -0,0 +1,140 @@ +SSSXMASAMSSSSSSXMASXMASXXMXMAXSSMSSXXSMMSXMMSMMMMMAXSSMMXMAMAMSMXXSMSSMXXMAMMXSMMSXMAMAMXSMMMSMSAMXXMSMXMXSAAXMSMMXSSMSASMXMSAMXXXMMASXXMSSM +AMMAMXXAXAXAAAXAMASXMAXMSMSSSMAXMASMMMAAMMSSMAAMASXXXAXXXMAXAXAMMXMXAAMSASXMSXMAASMMSSXMASAAXMAMXSAXMASAMMMASXMAAXMXAASAMXAMMMMSSSMSAMXAAAAS +MMSSMMSSMXSMSMSMMASAMXSXAAAAAMMMMAXXAXMMSASASMMSAXMASXMMSMMSMSAMSAMMMAMSAXMASAMMMSAAAMAMASMMXMAMAXAASXSMSXXSMASMSMASMMMMMSMSAAMAAAMMAMSSMSSM +XAAAAXAMXMAMAAXAMXSXMASMMSMSMMMAMSSSSSMAMXMAMXMMMSXAMAXAAXMAXXXXSASASAAMXMMAMASMXSMMSSXMASXAMMMMMSSMMXMASAXXMXMAXAMXASMSMAXSMSSMMMMMMMAXAMXM +MMSSMMMSMMMMMMSAMXMAXAMAMXXAMASXMAMMXAMASMMSMMSAMXMASXMSASMSSSMXSAMXSMMSAXMASMMMAMXMXMAMXMMMSAAAAMAAXXMAMMMSXMSSMXXSAMASMMMSXMAXSASASMAMXAAX +XAMAMSAAMAAXXAXAXAMSMXSSMMSXSASMMXSMSAMXSXXMASMXMAMXXXAXMXMMAAAXXSXXXAAXXSXAXMAXMAMMAMXMAAAASXSMSSXMMMASMXAXAAMASAXMSMAMAMASMSMMSASASMMSMSSS +SXMAMMMSXSSSMSSSMSSXAXAAAMMMMASMSXAASAXAMXSSMMSSSMSSMASMXAMMSMMMAMSMMMMSMSMXSMSMSMSMXSAXMSMMSAMAAAAXASAMMMSSMMSAMXXAXSXSXMMMAXSAMXMXMAXMAAAX +XAMSMMXMAXAAAXMXMXAASMSSMMAAMAMAXSMMMMMSSMMAMAMXAXAAMXXAXXSAAXXMAMAMAAAAAXAAXAAMAAXXMAXMAAXXMAMMMSMSAMXSAAAXAAMASMXMASMMMSMMSMMXXSMMXMMAMMSS +MSMMAXAMSMSMMMMASAMXXXXAASMMSAMXMMMAAAAMAMSAMASXXMMMMAMSSMMMMSMSASMSSMSMSMSMMXMSMMMXMASMSMSXSXMMXMXAXMMSMMSSMMSMMXAMAXAAASAAMAXSXXAAAXXAXAAA +AAAXAMMXMAXXMAMMSAMAMASXMMAAXASMMAAXSMMSAMMAMMSAXSMSMXSAAMASMAASASXMAAMXXXMXAAMAMASASAMXMASAAXXXAXAMSXMMMMXMAMXXAXXMSSXMSSMMMSAMAMSSMMAMMMSS +SSSMXAXMMAMAXSXMSAMAMXXSASMSSSMMSXSMXMASASXSMSMMMXAAASMMSMASMMMMMMMMMMMAXASMSMSASXSASAMXMAMXMASMMSMXAASASMMMSSSMSXMAXAXSAMXAXMAMXMAAMXSMMMAM +XAMAMSSXMSSSMXAAMASXSMMMXMAAMAAXSAXAMMASAMAAXMASASMMSMXMAMMMXAMMMSMSSMMXMSMAXASXMAMXMASXMMMAXMMAXAMMSMMASAAMAAAAAMSSMAMXAXMMSSSMSSMSMXMAXXAM +MAMAMAXMXMAMAMMMMAAXAAXMAMMMMMMMSAMXXMAMAMMMMSAMXASMXAXSASASXMMAXXAAMAMXXMASMMMAAXMASMMXXXSSMMAAXXSAXXSASXMMMSMMMXAAXMAXMMSAXAAAAASAMXMXMSXM +SSMXMXSXSMMMSMSSMXXSSMMXASASXXMAMAMSSMSSSMMXAAXXMAXXMXMXASASAASMSMMMSSMSMSMMMASMMXMXMMMMMMMAASMSSXMMSAMASXXXMXXAMMSSMMMMSAXMMSMMSSMMSASAMMMS +XMASXMMMMAMAXSMXMMMMAMXSASASMMMMSAMMAAAMAAXMASMXSASMMMSMMMAMMMMMAAAAAMAXAAAXSAMXXXMASAAAAAASMMAAMMSAMAMAMMMXMAXXSAXAXAAAMXMXMXAAXAAASAMAMAAA +XXMXMAMASAMMSMSAAASXMXMAAMASMXAAMAXSMMMSSMMSXMXXMXXAAAXMAMAMASASXMMSSMSMSMMMMAMMAXSXSSSSXSXMXMMMMAMASXMAMXMAMSSMMMSMSMMSSSSSSSMMXSMMMMMSMMSS +SSSMSSSMSAXMAASXSMSAMXMMXMAMAMMSXMMMASMAMAMAASMXMMSSMMSSMSAXXMAMXXMAXAAAASXSSXMASAMXMAMAXXMSAXAAMSSXMASXSXXXXXAMXAAXAAAAAASAAMAMAXAMMSAXAAMX +AAAAAXMXMASMMMMXMAMAMAMXSMMSMMAMAMAMXMMMSXMMXMAAAAXXAMMXASXSSMSMXMMMXSMSMSXXAMXXMASAMXMSSMASMSSSSMMMXMAMSAASMSMMSSMSSSMMSMMSMSXMASAMXMASMMMM +MSMMMXXXMMMMAMAXXMMSMMSAAAAMXMAMMMMMAXXMAXXXSMXMXSSSMMMMMMMAXAASXXASMMMXMXMSAMXSXSMMXXSXAMAMMAAMMAAXAXSAMXMMAAXMAMAAXAXMXXXAXMXMASMMMMAMXMAM +XAMSASMXMXAXSMMMXSAMAAMMMMMSSMSMSAASXMMMMSMAAXMSXMMMXAXXMASMMSMSXMASAAXMMMAXAXASMMAXSSMSMMSSMMSMSSMSXSMMAAXMSMMMSSMMXMMMMMSMSAXMAMAAAXMMMMMX +SASMASAASXMSXAAAAMASMMSSSXMXAAAAMSMXAXXAAAMMMMMSAAMSSSSXSAMXMMMMMSMMXAMXMASMMMXSAMAMXAAXXAMAXMMXMAXXMXAMXXXAXAMXAAXSXXSAAAAAMAMXMXSASASASASM +MMMMMMMMMAMAXMMSXMASXAAAMMXMMMMSMAMSMMSMSAXMXMASXMMAAAMAMMMMXMAAAAAAXXMASMXAXSMMMMXXSMMMSXSMMMMMSXMMASMMSMMSMMMMSSMSAASXSSMSMAMAXXMAXASASASA +SSXMMASMMSMAMXXMMSASAMMSMMSMMXAMXMMAAMAAXAXSAMXSSMMMSMMSXSASAMSMXSMMMMSASAMAMMAXASXAMXMXXAMAXSAAXMAAMAXAXAAAAAAMAAAMMMMAXMAAMASXSAMAMMMAMAMX +MAAAMASAAAMXSMSAAMASXMAXAAMAMMXSAXMMSMMSMXMSASMXMXMXAXAXASAMMXMMXXMAAMMMMAMMSXSMASMMMAMXMMMMAAMSSXSSMMMMMMSSSMSXSMMMXAMSMMSMSMAMXAMXSASXMXMX +SSMMMAMMMMMAAAMMMSMMAMXMMMMAMMMMMSXXAAMMXXAXAXAMMASXMSSMAMAMSAMXASMSMSAXMAMASAMMXMAASASAAAAXMMXAMAMAMXAAAAXAXAMAXXMASMMAMAAXAMAMSMMMMASAMXXX +MXMXMXSASAMSXSXSAXASMMSXSMSMSAAAAMXSSSMAXMMMXMMXSASAXAXMXMAXSASMXSAMASASXXMASAXXXSXMSAMMSMSMXXMMSASAMSSSSSMMMAMAMASAMASMMSSMXSAXAAAAMAMMXXMS +SAXXAAAAMAXXAXAMXSMMMAMAXAAMXMMMAXXAXAMXSAXSXMXAMASAMXSXXMAMMMMMAMAMAMAMMSMMSMMAMSAMMAMXAMMMMMMASXSAMMAMAMAMSXMXSAMASAMXAAMMMSMSSSSSMMSXSAAX +XSMMMMXXXXMMAMAMXSMAAXMAMMMSAMXSXMXSSSMMSAMSAMXMMAMASXSMSMMSASAXMMSMMMAMAAAASAMXASAMMMMMAXSAMAMXSASMMMAMAMMMMASAMASXMXSMMXMAMXXAAAXAAXAASMMM +XMXAAMSMSMSMAMMMAXAXSXMXMMAXASAMASMMAXMXMMMXAMAXMASXMAXAAAXMASXSXMXAAXAMSSSMXAMAXSAMAMSSMMSASMSMSMSMSSSMXMSASAMASXMXAMSXMASMSSMMSMSSMMMMMAMX +XMSSMSAAAAAXMMAMXSMSXAMAMSMSMMASMMAMAMMAAAAMXMMXSASXMXMSMSMMAMMXAXSSMXXAMXXAMSMMXSAMXSAAAASAMXAASAMAMAXMAXMAMMXAMAMMSAMAMMSAAAMAMXMAAAMXSXMS +XMAMXSMSMSMMMXXXXXMAMMMMMAAAXAAMXSSMAMSSMMXSAAMAMAMAAAMAAAMMASMSSMXAXAMSSMMSMMAXASAMMMXSMMMSMSMMMAMMMAMSSSMSSSMASAMAXXMAMMMMMAMAMAXMMMXASAMS +XMASXSMMAMXAMSMSSMMMSMAMSMSMSSMAMXMSSMMXAAASMSMXMASXMMSMSMXMASAAXMMSMMXAAAAXAXAMXSXMXAXXXMAXXMXXXSMMMAMXAXAAAXSXSAMXMMMMXMAAXAMXSASMSXMMSAMX +MMXSASXMXMMXXAAAXAAXAAAMXXMAMASXAAXAMAASMMMSAMMSSXMAMAMXAXMMAMMMSSMMASMMMSMSAMSMXSMMMSSXMASXAXXMAMAMSASMSMMMSMXMMMMSMSASASMSSSSMMASAASXXSAMX +ASMMXMASXXAXSMMMSMMSSSMSAMMMMMAXSSMMSMMSXMAMAMAAMMSAMASMMSSMXSAAAAXSAMAMAMMAMXAASXMAAXMMMMMSMMXMASAMSASAAXAAAAXMAAAAASASAXAAMMAMMMMMMMMAXAMS +SXAXASAMAMMMAXAXAMMAMAXMAMAAMXMMXMAXXXAXAMXSXMMMSXSASASAAAXAAXMMSSMMASAMSMSASXMSMASMSSXXAAXAXSAMMSAMMMMMMSMMSSMSSSXMMMXMAMSMMMSMSXMASXMMMXMX +XAXSAMXSXMXMMSMSMMMASMMMMSAMSAXSAXSMSMSSMMAXMXMAXMSXMXSXMMSMMSAXAMASAMMXMAMASAMAMXMAXXASMXSASXAXAMAMXSAAMAXMAAAAAAXSMMSMSMXAXAMMSAXMSMAAAXMX +MAXSAMMAMXXXXXMAMASMMMAXMAMMSMSSMMXAAMXAAMMSAMMMSAXMXXXXXAXXXAMMSSMMMMSAMAMAMASAXMMMMMMAAMXMAMMMSMSMMAAXXAXMSMMMSMMSAAXAMASAMMSASAMSMMSMSAMX +AMMMMMMAMMSASXMASMSAMSXMAMXXXSAMXAMXMXSXMMXXASAMXMXAMMMXMASXMASAAMAMXAXMXAMAMAMXMSAMASXMMMMXSAMAMXXASMSMMXMXXMXMAMASMMSSMAMAMXMXMXMAAAMMXMMX +SXAAAAXMMMSAMAMASXSAMAXMSXMASMMSMXSMSASAXMASAMXSAMMSAAAMMMMASAMXSXMMMXSXSMSAMSSMAMASMMAXXXAAXMMSSXSAMXAAXMASASASMSMXAMAAMSSMMXSXMASMSMXSSMSS +ASMSSSSSXAMAMAMASMSAMXXXMASMXAXMAXXXMASAMSAMXSASAXAXSSXSASMMMASAMXSAMMMXAMMAMAAMASXMMXSMSMMMMXXAXXMAMSXSMMMXASASXAXSXMMXMAAAMAXAMXAMXMASXAAX +MAMMAMAMMASXSASXSASXMSXSXXMXMAMXMXSSMAMXMMXXAMXSXMSMXMASMMAMXSAAMASASASAXMMAMSSMAMAAAAMSSMAMSMSMMSSSMMMMASXSMMMMXSMSXSSXMSSMMMSAMXMAAMXSMMMS +SASMSMAMAXXAXASAMAMMMAAAASMMMAXMAMXAMXSXMMMMAMAMMMXXAXMMXSXMXAMAMASAMASMMSXSAXAMMMSAMXSAXAASAAASAAMMAMXMAMAXMASXXMAXAAXMAXXAAAMAMXXSXSAMAMAM +SASAMXAMSMMSMXMASMSAXMXMMMAASMMMSXMXMSXMAAXSSMAXAMMMMMAAXSMMXMSAMXMXMXMXAXAXSAMXAAMMXMMMMSMSMSMMXSSSSMSMSMMMSASAAMAMXMSAMXSMMMSAMMXMXMASAMAS +MMMAMSSSXSAAAXSMMMAMAMXXXMMMMXAXAAASMMMSXSXMASMSXMAASXMMXMASXXXMMAXMXMSXSMMMAMXMMSSMAXAXXXAXMAXXSXXAAXMMMAMXMXSMXMXMAXAXMAMMAMSMMMAMASAMXSMS +SAXMMMXAAMSSSXAAASMMMMSXXSAXXSXMMMMMAAAMXMASAMXAAMSMMAASASXMXSSSSMMSAAMAXMASMSXSSMAMASAMXAMMSAMMAMMSMMSASAMSMAXXAMASXSMAMMSMMMXAASASASMMMSXS +SMXSAXXMMMMMMXSMMSXSAAMMXXASXMAXXXAMSMMSASXMAMMMSAXASXMMAMAMXMAXXAAMSSMAMSASXMMMASMMMAASMSAAMXSAMAXAMXMMXMMAMAXMAMAXMSXMMMAAMSMSMSAMASXSAMMX +MAASXSMSAXAAMXMAAXASMMMAMSMMASMMSSMXXSAMXSMSSMMAMMSAMMASXSAMMMSMMMMMAXXXMMASMMAMAMXAMMMMAAMSMSAMXXAASAXXSSMMMASXSMXSAMXMAXMSMAAAAMXMSMMMASXM +MMMSMXAAAMMXSAMMAMXMASXSMAXSAMXAAAXSAMMSASXAXAMAMXMAMSMMMSASXAAXXXXMMMMXXMXMMXAMSXSMSAMMAMSAXAMXSXMMSXMAMXAXMXSAMAAMAMMSSSMAXMSMSMMXXAXSAMAA +MAMXMMSMSMAMMAXAMXAMAMXASAXMMSMMMSMMAMXMAMMMMXMSSSSXMASAXSAMMSMMSMMXSAAMSMMMAMMXXASASMSSSXSMAMAAXXXMMMSXMAMMSMMMMMMSSMXMXAMXSXAAXXMAXMMMXSMS +SASAMMMAAMASMSAASMSSSMSAMXSXAAAAAXAXAMAMAXXSASXMAMXMSXMMXMSMMASXMASAMAXXXAAMASMAMAMAMXMXMAMXMMSSMMMMAAXMASXMXAAXMAMAXMAXSMMSXXMSMXMASMSMMSXX +SXSASASXMXXMAAMMSAMXAAAMSMMMSSSMSSSMASXMXXAAASXMAMMMMSSSMAXMSASXSXMMSSSMSSMSAXMAMSMXMXAMMASMXAAAAXAMMMMSAMXSXSMMSAMXSXSXSXMSMSMMXSXMAXAAAXMM +MASAMXSAMXSMMMXSMAMMMMMMAASAMAAAXAMSMMMMSSMMXMASASXSAAMAMXSAMASMSAMXSAAAAAAXXXXAXAXAXXAXMAMXMMMMMSMSMSXMASASMMAASXMASXMXMAAXAMSAASMXMSMMMSMA +MMMMMMSAMASAXAMXMAXSAMXMXSMXSXMMMXMAXAMXAAMXMXAMXXAMMMSXMAMAMAMASMMXMXMMMXXXMASXSMXMMSAMXSSMMSSMAAAAAAXSXMASAMMMSAMXSMSASAMMSMMMSSMAXAXAAAAS +XMAMSAMMMMXXMMMASAMXASAMSMMMSXXXXXXMSSSMSMMMAMSSSMAMXASAMXSAMXMXMASAMASXMMSSSMAAAAASAMAAAMAAAAAMSMSMSMMAXMMSAMXASAMXSASXAASAXAXXMXXXSMSMXSXM +ASAMMAXXASMMMMSAXMASAMASAAAAMMMMMSMMAXAMXSAMXMAAMXMXMAMAMXMASXMMMXMAMAMAXAAAAXMSMSMMAXAMXMXMMMMMMXAAMAMMXMXXXMMMSXMMMMMMMAMAXAMXSAMXMXAMXMAM +XSASXMMSMSASAAMMSSXAXSXMMSMMSAXAAAXMSSMMAAMXAMMSMMMMSMSMMAXMXXAAXSSSMMSXMMSSMMXXXAMSSMASXSSMMSAAAXMMSAMSAMASAMAMXMMAXMXAXSMSMSMAMAMMXAXMASAM +XSMMAMXAASXMXSSXAMMMMSAMXMMMSMSMSSSXAAAMMMMSSXXAMAAAAMAMSSSXAXMSMAAAAAAXXMAMMXMMSXMAMSMMMAAAAMXMMXMXSXMSASAMXSMSMAMSXAXSAMAXMASXSAMXSMSXXSMS +AMXSXXSMXMAMXMAMXXAXMXAMASAAMXMAAAAMSSMMSAASMXSASMMMXXAXAAMMMMXXXMAMSMSSSMAMXMAXAXMAXASAMSMMMSSMMXMAMSASXMASASXAXSMXMMMXAMAMMAMXSMSMSAAXXMMS +XMASAXAMXXAMXSXAMSSSSSXMAMMMMAMMMMMAXAMASMSMAASAMMSSMSSSMMXAAASMMXSAMXAAXMASAMMMMMMXXAXXMAAXXAAAAAXAMMXMASXSASXSMMSXXMASXMMSMMSXSXAAMMMMXAAX +SMASMMXMMSMSMMASAAAAAAXMXXSSSXSAMSSSSMMMMMXMMMMAAXAAXAMXMXSSSMSASAMXMMMSMXMAMSSMSASMMSMMMSMMMMSXMASMMSAMXMASAMXMASAMXSXMAAAAAMSASXMSMAXASMMS +MMAMMSXMAASAASAMSMMMXMXXMMAAAXSMMAAXXXAASMSMSMXSMMMSMXSAMXXAAASAMXMSAMXAMXSAMXAASXSAAAAAAAXMSAMMSXXMASMSAMMMAMAMXMMSAMXMSMMMXMXAMXXAMXXXMSAX +XXMAAMAMXMMSMMAXXXMXXMMAAXMMMMMSMMSMMMXMSMAAAXMXAXXMAAAAASMSMMMMMXSAMXSASXMXXMMMMASMMSSMSSSXMAXAXSAMXMASXSXSXMASMXXMASMXXAAXAMMXMXMSMMMSAMXS +XMSMMXSMMSMMMSSMMSMXSASMSMXXXAAAMXMASMSMMMMSMMASAMMMMMSSMMAXMAAAMMSXSXMXMAMXMMSSMMMAMXMMXXMAMAMMMSMMMMXMASAMXMMSAMSSMMXAXSAMXMASMMMMAAASAMSX +MAMAXAAXAAAXAAAAXAAXSASAAASMSMSMSAMMMAAAXAXXXXXAMXXAAXAXMMMMMSSXSAMMMMMASAMMXAAAAMSMMAXSXMXAMXSMASMAXSXSXMMMXMAMXMMASAMXMMXMSMXMXAASMMXXAXXS +ASXAMSSMSSXMMSSMSMSMMAMAMSAAMAXAMMSSMMMMXSSMAMSAMMSXSMASXSMMAXXAMXXAAAXAMASAMSSSMMXAMASXMASXMAXMXMMXSMAMXXMSMMAMMXSAMXASAMXSAMMSMMMSASAXMMAX +SXMAXXAXXAASAAMMAMAAXMAXMMMSMAMMSMAAASAXSAMMAMMASAMSXMAMAXAMSSMXMAMXSSSXMMMXAMXXXSMSMMMMAMXMSMSMMXMXAMXMAMMMAMSSMMMAMMSAAXSMASAAMSMSAMAASMSX +XMAXMSMMMSMMASXMAMMMMMMSAXAAMSMAAMSMMAAXMASMAXSAMAMMXMAXMMSMXAMAMMSAAAAXSMMMSMMMXMAMXXXMXMXMAMAAMAMSXMXMASAAMSAAAXSAMMAMXMAAAMMSMAAMAMSMXAMA +XSSSMAXXAAASAMXSSSSXSAAMAMSMSMMMMMXMXMSXAAAXMXMMMSMSMMSAMXXXSAMXAAXMMMMMAAXAXAMSAMSMMMAMASXSMSMSMXXAASMMASASMMASMMMXSAMXSSXXMXXXMMSMMXXXMXMA +MAAMXMMMXSXMASXMAAXAMMXSMMMMSAMXSMSAXXMXMMSSSMXSAMMAAAMMSMSMMMMSMMMXAAAXSMMXSASMMXAAASXXXXAMXMAAXMMSSMAMMSAMMXMXMXMAMAMAMAAXMXXXAXMAMAMAMMMS +SMMMAMASMXAMXXXMMMMSMMAMAXXAXAXXAAXMASXASAMAAAAMASXMMMXAAMAAAAAXSXAMMSAMXASAMXMAXSSSMAAXSMSMAMSMXAXMXMXMMMXAXMMMSAMAMAMASMSXMASXMMMAMASAMAXM +MAMSXSAMAMMMMSMMAXXAAMSSSMMSSSMSMMMXMAMAMAMSMMXSAMAXMAMSMSSSSMSSSMSXAXMAXXMASASXMAMXXMXMAAAMXMAASMXMAMSSXMXAMAAASXSSSMSASXXAMAXAAAMASXXMMSSM +XAMMAMMMSAAAAAMSMMMMMMXAXXXMAXXXXXMASXMASXMXSMAMAMXMMAXAAXMAAAXAXAXMMMSSMXSAMAXSMSSSXXXSMSMSMSMMMAASAMAMASXAAXMMXXXXAXSAMXSMMSMSMMXXSMSMAMAX +SMSSMSMAMSSMXSMSASXMXSMSMSMMAMXMXSMMMXSASXMXMMMSSMSMSMSASMMSMMMMMMMMXAAAAMMSMXMAXAXMASXAAMXMXXXAMMMAAMXSAXSAMXSAMXSSMMXAXAMSXMAXXSXMXAAMXSAM +ASAAAAMXXAMMMXAMXMAAASAXAAAMASXMASAAMXMASXSAXAAAAAAAAASAMXXMAXXMAXASMMSXXXAAMMMSMMSXAASMMMASXSMSSXXMXMAMXMMMMAMASAAAXMSXMMASMMSMAXAMMXMSMMMM +MMSSSMSXMAXSAMAMSSMMMMAMSMXMAMAMASMMAAMAMASXXMSXMXMSMMMAMXMSMMMSMSASAMXMSMSMXAAAXXMMMXAXAXSMAAXASAMXMSSXMXAAMXSAMMSMMMMSAMAMAAMXXSAMAASAMAXM +XXAXXMXMAMXMSXXXXXXXAMXMMMXMSMMMASASXMSAMXMSXXMASAMAXMMMMMXAAAMAAMASAMAASAMXSMMMXAXAXAMXSSXMSMMASMXMMAAASXSMSAMASXMXXAASXMMSMMSAXSXMSMSASMSM +MMMMAXAMXXXAXMMMSMMSXSAXMASMMASMMSMMAXXAMXAAMXAXMASASMAMAAMSSMSMXMAMXSSMMAMAAAXSSMSMSASAMMMAASMMMXAXMMSMMAAXMAMMMMMASMMMAMXMASMXXMXXAXSAMAAX +AAAASXSAMXMAMAAAAMAAASMXSMMAXAMAAXAMXMMSMSSMSMSMXMMXMMAXXXAAMMXMXMASXMAMMSMMMSMAAAAAXAMMSMMSAMXAAMMSSMXAMSMMSSMSAMXAXMASAMXSMMSXXMAXMXMAMSMS +SMSMMAXASXMAXSMSSSSSMMXXMASAMXSMMSMMSSMAAXAXSAMAASMMMSMSAASAMMAMXXMAMSAMXMAXAAMMMMMSMXMASXAMASMMXSAMAASMMAAAAXXAMXMSSSMSASXXMAXXMASMMAMAMMXX +MMMAMSMMXMMXXXAXXAAMAMXMXAMAMAAMAMAAAASMSMMMMAMSMXAAXAXMXMMAMMASAMXSMSMSASMMSXSASAAXMAXSMMXSAMMMMMAXMMMMSSMMSSSMMMAXAMXSAMAXMMSMSAXXMXSXXMSX +MAXMXXXMASMMAMMMMMMMMXASMAMAMSSMSSMMSXMXAAASMSMMMSSMMMSMMXXXMXXXAMAMXMASAXAAAAAMSMSASMMAXSMMMSSSSSSMSAXXAAAXAAXMAMXMAMXMAMXMASAAAAMSSXAXSSMM +MMSXAXAMMSXMAXAASAMXXSASXSMXMMAMXAXAXXMSSSMSAAXXMAXAAXXAASXSSMSSSMXMAMMMSMMMMMMXMAXMASXMXSAMXXAAAAAAXSSMSSMMMSMSXSMSMMSSSMMAMMMSMSAASMAMXAAX +AXAMSXSAMXXSXSSSSMMSAMXMAMMAXMASMMMAMXAAAAAMMMMSMSXSMSMMMSAAAAMAXAMSMSMAAXAAXASAMMMSAMXXAMAMSMMMMMMSMXMAMAAXMAMXMAASMMMAMMXSXAMXAMMMMMMSXSMM +SAMXMXAAXXMAMXXMXXXSXMSMMMXMXXXMAXMAAMMMSMMMAXXAAAAMSMASMMMMMMMAMXMAAAMSSSSSSMSAXSAMAXMMMSSMXAXXXXAXAAMAMXSMSASASMXMAAMAMAAMMSMMXMXXXSAMAMAM +MMXSMMSSMMMSAXMASMXMMXXAAASXMSASXMSMSASAXASMXSSMSMSMAMSASAMXMXMMMXMMSMXMXMXXMASAMMMMXXAAMAMAMSXMMMSSSMSASXMASASAMMMSSMSSSMXSAMMSAMXMXMASAMAM +XAAMAAXAMAAAMAASASAASXSSMMSAASAMXXXAMMXAMASXAXXAAXAMAMXAMXSMMMSAMXMXXMASASMMXXMXSMAAMXXMMAXMMMXXAAXAAAXASAMMMMMXMAAAAXAAAAAMASAXASAMXMMMMSMM +MMSSMSSSSSSSMXMMAMMSMAAMXXMMMMAMMMMMMMMMMAMMSSMSMSMSSMXXSAMAAXMASAXXAMAXASAMMXMASAMMSAMSSSXSAXMMXSMMMMMMMXMXAMAXSMMSMMMMMMMMMMXSAXMXSXMAXAMX +AAXAAMMAAAAAAASMAMXXMMMMSSMSSSXMXSAAAAAASAXAMAAAMXXAMXSXMASMSSSMMMMSAMSSMSAMASMASXMAMXSAAXAXASAMXMMXAMMAAXSSMXAMXMAMAXXSSSMSXAXMMMSXMASMMXSX +SXSAMXMMMMMMSMXMASXAXAAXMAAAXMAMXMASXXSAXMMSSMSMASMSSMMASAMAMAAAAAMMAMMAASASMXMXSXMXSSMMSMSMASMSAAMSMSMMASMXMASXMSASXMMXAAASMXMAMAXAXMMSAMAX +XMXMMMSMSAMXAXXXAXXXXSASMMMMMSAMAXAMMXMMXSAAAAXAAXMAAASXMXSMMXMSMSSSMMSMMMAXXXSAMXMAMAAAMAXMMMAXMMMXXAAMMMMASMXAAMMXMASMMMMMAMSSMMSSMMAXXMAM +SAMXXMAMSAMAAMXMSSMSMMASASXMXSMSSMASXXXMAMASMMMMXXMSSMMASAXXASXMAXAAXXAMXMMMASXMMAMASMMMSMSASMSMSASXSSSMMMSASXMMXMMXMASMMSSMXMAMAMXMAMMSAMXS +XMAMXMMXMAMMXMMMXAAXAXASAMXSAMXAAMSMXSAMXMMXXAAMXAMAXAXAMXMASAMMSMSMMSXSMXMAXMAMXASAMAAMXMSAMAAASASXMXXAAMMMSXMMSMMSMMSAXAAAXMASXMSSSMAMASAX +MSSXMAXSSMMAAMAMMMMMXMMMMMAMMSMSMMASASMMASMMSSSSSMMASMMSSSMXXMAXAAAMMSXAXAXXAXAMXXMMSSMMAMMSMMMMMMMAMMXMMMAMXXSAXAAAAAXMMSSMXSMMMXMAMMSSMMXS +AAAMXMXMAMMXMSASAXMMMXMASMASXSAXXSXMMSAMAAAAMXMAMXMMMAAMAAMAMXSSMSMSAMSAMMSMAMSSSMAXAXASMMSXSXSXMASAMAMSMSMMSXMASMMSXMSXAXAMAMAAXMMAMMXAAASX +SMMAMMMSAMMSMSASMSAXSMSAXSASMSAMAMXXASXMXSMMMAMAMMSAMXSMAMMXSAMXAMXSAASXAAXMAMMAMSSMSSXMAXXAAMMMSASASXSAAAXMSMMAMAMAMXAMXSAMXSSMSSSMSXSMMMSS +XXXMASXMASXAAMAMAMAMAAMMMMMXAMMMXMMMASXMMXXASMMMSXSAMAMAXMXXAASMXMAMMAMXSAAMXSMAMAXAMXAMAMMAMMAXMXMXSXMMSMSXMASMSXASXSXSASAMMAAXAXAMXAXXAXMA +SSXSSXXSAMMMMMAMXMAAMXMMSSSMSMSXSASMSXXSAMSMAAAASAMAMSSMMAXSSMMMXMXSSSXXMASAAMMXSAMXMSSMXXAAXMMSMMMMMMXAMAMXSXMMXMMMAXAMMXAMMSXMSMXMMAMSXMAM +XAXXMAMMXSXXXSASASMMSAAAAAAAXAMXSAXXXAMMSAAMSAMXSASXMMAMXMMMASAXMAXMAMXXMAMXXMAXMXMXXAMXMSSXXMMAXAAAAXMMSSSMMMASMXXMMMMSSSSMMAXAMXSSMXMXAXXX +XMMAMSMMASXMXXASASAASMXMMMMMMAMAMAMMMXMAMSXXXXXAMAMMXSMMMSMSAMXSAMXMAMMXMASMSMXXMAMXMSMMAAAMSSSSSMSSXSAAAXAAMSAMXSMSXMAAXAXAXMMMSAMXMAMSMMXX +XXAXMMAMAXMSSMXMMMMMMSXASAMXXXMMSSMSAMMAXMMSMMMSSMMSXMAAXAAMXSXXMAXMAMSAMMAAAMAMSASXMMAMXMSMAAAXAAMAMSMMMSSMMMXSMMAAAMMSSMXSMXAAMMSASMMAMMXX +SSSSMSSMSSMAXSAXMASAAXMAMXSMMSAAAAMXMXMSXSAAMXAAMAAXASMMSMSMXMAXASXSMMMAMMMMMMAMXASXASAMAXMMMMMMMMMAXMMSAMXMSMMXASASXMAMAMAAMMMMMXSASMSAAMMS +AAASXAAMMAMXSMXXSAMMXSXSMASAASMMSMMAMSMXAMSMSMSSSMXSMMAAAMAAMMSMAXMAXASMMSSXMSSMMAMMXMASMSXMSAMXMSSMMSAMMMMMAAXMXMAXAMXXAMSSMAMASXMXMASMMAAS +MMMMMMXMMMMMMXMXMAXSMSAASAMMMMAAAXMMSAAMMMXMAXXAMXXMASMSMSSSMAAMXMXMSMSXAAAXMAAXSXMXMMXAXAAAMSAMXAAAAMAXMAAMSSMXMMXMMSSMAXXAMXSASAMASXXXSMMS +SASAXSXSASXAAAMAMXMSAMMMMXMXMXMSSSMMSMSMAMMMMXMAMMSMAMXAAAAAMSXSAMXXAXSMMMMMMASAMASMSXAMXSAMSXSXMMSMMXSMSSSXXXAASMSASAMXXMXAMXMMSAMXSAXXMSXM +SASAXSASAMSMSSSSSMMMAMXSASXXXAXMAMAMMXXXASMSAAMXMXAAASXMMMSMMMMXAAMSSXSAMXXSXAMASXMAMXMSAXMXAAMXSAXAAXXAMAMXMMSMSAMXMASAXSMXMXAMSAMXMAMSASXM +SXMMMMAMXMXMXAXXAAXSXXXMAXAAMSSMXSSMMSMSMSAXSSMXXSXMMXMXSMXMASMSMMMXMASXMSMMMSSMMMMAMMMMMSMSMMMAMSSMMMMAMAXMAAAXMAMASAMXSXAXSSMMXSAXMSMMAMSA +SASXSMSMSMSAMMMSSMMMXMMMSMMSMMAXAAAMXMAAAMMMMMAMMMXMAXSASMXSAMXAAASAMXMAXXXMAAAAAXMMMAXAAMMXAAMXMASXAAXXMXSAMSASMMMASAMXSMMMAAASXMXMMMMMAMXS +SAMAXAAXAAAMAXAAMAAMAMAAXMAMASAMMSMMAMSMMMAAAAMAAAASXMMASAMXASXSSMSXSXSMMSMMMSMMMSAXXXSMSXMSSMSMMMXMMMSASXXXXXXAAAMXSAMAMAAXMAMXAMAXAAAXXMAM +MAMSMMMMMSMASMMMXMAMMSMSSMAMXMXXXMXSXXAMXSSSXSXSMSMSAMMMMAMSXMAXXXXAMXMXMAAMAMXSAXMSSMAAAXMAMXAAAMSMSAAAMSAMXXSSSMMASMMASMMXSAMSAMMSSSSSSMAS +SAMXAMXXAAAMMASXMMSAMXXMAXSSMMXSAXMAMXAMXMAXAMMXAMASMMAASAMXSMXMMMMAMAMAXSSMSSXMASXAAMMMMXMASXSSMXAMXAMMMXSXXXAXMAMAMXMAMMXASAXSXSMAXMAAASAM +SXSSSMSMMSSSMASMXAAMMSMSXMXAAAAMSMXMASXMAMAMSMSMAMAMASXXSAMAMXAAAASAMMSMXMXAMSAMASMSMMXMAMSAMXAAXMSMSAMXXAAMSMMXSAMXSSMXSAMASMMSASMXSMMMMMXS +SXMXMXMAMAAAMSMAMSMMAAXAXMSSMMXXAXAMXAASXMMSMASMAMXSXMMXXAMASMMMMMXAMAAMXSMSMSMMASAXAXAXXAMMSMXMXMAASAMXMXSAAAXXMAMSAMMXAMMASAAXMXMAMXXMSAMX +MASASMMSMMMMMAAAAAXMSSSMSMAXMASXSMMXMSXMXXMAMAMSXMMMMSXSSXSASAASMSMMMSMSAMXXAMXMMSASXMAXAAMXXMAMAMMMXMAXAMXXSXMXMAMMAMSSSXMAMMSSMAMMSAMXMXMS +SAMXSAAXAAXSXMSMSXSMAAAXMAXSMAMAMAMSXMAMASMMMAMSMXMAAMMMAAXAMMMAASMMXAAMASAMAMXXXMXMASASXMMXAMAMXSXMAXAMSMSAMASXMAMSAMAAMXMMXAXAMXXMXMXAXAXM +MASXSMMSMMXXAMXMXMAMMSMSMSMSMSXAMAMSASXMASAASMSMAASMMSMMMMMSXSMMSMAXMMMMMMMSAMMSMSAXMMMMAAXMMMXMAXMASMMXMAMAMAMASAMAAMMSMXMXMASMSSMMASMMSSMM +MASAMAAXMSMSMMAXAAAMXMXAAXAXAMSSXXMSAMXMASXMMXAMSMSAAMXSAXXMAXXXXXMMSXASXSXSAMXMASAXMAMMSMMSAASMXSAAXMSAMXMSMXSAMXSMXMXMMSMXSAXAAAASAMAMAMAA +MAMAXMMMMAMAASXSXSXSAXSMSMMMXMAMMMMSAMXSMSMMXSXMMMSMMSAMSSSMSMMMMAXAMSMXAMASXMAMMMSASXSAAAAXMASAAXMXMAMXSAAXAAMMSMXAAXXXAAXMXSMXMSMMASXMASMM +MSSSMSXXSASMMMMMMAXMAMXAXXMAXMAMXAAXXMMMAMMMAMMMAMXSMMXSMMXSAAASMMMXXASMXMAMMXAXAMXXXAMXXMMMSMMMMXMMMAMASASAMMSAMAMSMMSMMMXMAMMSXXAXXXASXSXS +MXAAAXAAMXXXXAAXMASXSAMXMXXAXSMMSMSSMXMMAMAMMXMMASAMXAMMAMXXMXMMAXAXSAMXSMSSSSMSSSMXMXMASXSAAAXSSMAASAMASAMXMAXMMSMAASMSMXAMXMASMSMMMSXMSMMM +XMAMMMMMXSSMSSMXMASXMAASMSMSMMAAXXMAXXASASXXSAXSAMMMMSMSAMSMSSMSMMSXMXMASXAAXXAAAAASMXMMAAMSSMMAAMSMSASMSMXXMMXMAMMSMSAAXMXSAMXMMAAMXSAMXMAX +MXXXAXMMAAAXMAMXMAXXMAXXAAXXASMMSXSAMMMSAMAAMAMMMMSAAAMXMMMAAAMSXMAAMXMASMMSMMMMSMMMAASXMXMXMASMMMAXSXMXMASMSXMSASAXAMMMSSMMXMSASXSSMSAMAXSS +MSMMMSAMMSSMXAXMSSMMSXXMSMXSMMAAAMMMMAXMXSMMMMSAMASMSMMXSAMMMSMMASXSMAMSXMMMXMAXMAAXXMXAXASXSAMXXSXXMAMXMMMAAAAMAMXMAMXXAAAMAXXXMAXAXSMMAMXA +MAXAAXXXAMAMMSMXAMAXSAXMASXMXSMMMSAAMSXAAXAXAAAAMAXXXXAAXXMXMAXSMMAXXXMAMXAXXMXSSSMSMSXSMMXAMXMMMXMSMMMAMAMMMSMMAMASXMMMSSMMMSSSSSSMMXAMMXSA +SMSXSSMMSSSMAMXMAMSMMXMMASXSAXMMXSMSAMMMASMMMSXXMASMSMMSSSXMSMXXMMMMMMSSXXMSSXAMAMASAAAXAXMMMSMAXMAAAASMSAXAMAMSMSASAMXMAMXAXAAXAXAXXXXMSASX +MXMXMAMMAAMMXMAMAMXASMSMAMAMMSAXAMXMAXXXMAMMAXMMMXMAAAXMAAXXAMSMSAAAXMAMXASAMMSMAMMMXMMXMMAAAASXMSSMSMSASASMMSMAAMMSAMXMASXSMMSMMSSMMSMAMASM +AAMAXAMMMMMAMXMMAXSAMAAMAMXMXMXMASAMAMXMMAAMASXSAMMSMMMMMXMMAXSASXSXSMASXMMASAXMXMAMMSSSXMXMMMSXAAMAAAMAMAAAAASXMMMSMMSMASAMAMXAXAMSAAMAMMMM +SMSMSSSSSSMMXASXMMSAMXMSMSMMSMSMMMXXAXASXSSMAMMMSMAAAXXSXMMSSMMXMAXAAMAXXXSAMXSMMSMXAAAMMSASXAMMMASMMMMAMXMMSMMMASXMMAAMXMXMMMSSMMMMMXSAXSAS +XXAXMAAAMMASMMSAAASAMXXAXAAMAMAAXASXMSXSAAXMXSMAAMMSMMMMMSAAMMMSMAMSMMMSSXMAXXXMAASMMMSMASASAMXMMMAMAXSXSAAXMASXMMAXMXSSXMMSAAXXAMASAMMMSMAS +MSMSMMMMMSAMAAMMMMSAMXMAXXMMASMSMMMAAAMMMMMSAAMSSMXAXAXAAMMMSAAMMXMAXMSAMXMMXSSXMASMAMAXXMAMMXAXXMASXMXASMSMSAMXASMMSAMXAXASMSMSMMAMASMMMMMM +XAXAMXSXMMXSMMXSXMSAMXSMMSSSMSAAMXMSMMMSAMXMASXXAXSAXSSMXXAMSMSSSMSMSXMASXMAAMAAXMMMAXMSSMAMASMSXSASAMMMMMXMMASMMMSAMXMSAMXSAXXXAMXMAMAMAAAS +SSSMSAMXMXAXAXMMAAMAMMAMXAAAMMAMMSAAAXAXAXASXMMSMXMSMMAXAMMXSXMAAASXSXMASAMMXSASMSXSSXSAMMAXMMMXMMASXSAMAMXAMSMXAAMSSXMMMMMMAMMMMMSMMSSSXSSS +XXAMMMXSMAXXAMXMAMXSMMMMMMSMMSXSAXSMMMMSSMMSASXAXXAAXXSMMXSAMXMMMMMASAMASAXMXMAXAXAAAXMASXMSXASAMMMMAXXSAMSSMMASMMMAMMAXAAAMMMMMAAMAXXXMAXAM +MSMMXSASXASAMXSAAXAMAXXSAAAXXAAMMXMSAMXAMAASAMMMMMSMSAAAAAMMMASAMXMXMAMAXXMSAMSMMMMMMMMXMASAXSSXXAAMAMAMMMMAAMAMXAMAMXMSXSMSAAASMMSSMMMMXMAS +XAASAMASMASMSAASMMSSXMASMSSXMMSMSSMASAMXSSMMAMMXSXAAMMXMMXMXSXSASASMSAMSMMMMASAAMMXAMXMXSSMSSXMASXSSMAXXMASMMMMMSMSXSAXMXXASMSMSAAAAMAASXMAM +SSSMSMAMXAMXXXMASAMMMMMXAXAMSAMXAAAAMSAMXAASXSAAAXMXMASXXAXAMMSXMXMAMXSXASAMSMMAMXSSMAMAXMAXMASASMAAMXMMSMSXMAAMXXSAMXXSAMXMXAMSMMMSMSXXAXAS +XXMAMMSSMMXMMSXMMMMAAAMMXMMMMASMMSMSSXMASMMMAXMXMMSXSXAMMSMASAMXSAMXMXMXXMASXAXMMMAASAMASMSMSXMASMMXSASAAXMASMSXSAMXSAMMMMASXMXXXSAXXXMSSMAA +SAMXMMAMASXSAAMXAAXMMMSSXXMXSSMAXXAXXXAXMAAMMMMAXAMAMXMAMAAAMASXSASXMMMSMSMMMSMMAAMASXSAXAMMXXMXMXAAMXSSSMSAMXAASASAMASXXMAMXSXMMXAXXXXAMMSM +MAMASMMSAMMMSSSSSSSSSMAMMMMAXASXMMMMMSMSMSSSMAMMMSMAMAMMSMSXSASMSMMAAAAAAXASAMASMSXMXMAMMSMMMMSXSMMXSAMAMXMASMMMMAMASAMASAMXAMAAXMXMSSMMSAMX +SAMASAXMXSMAAMMXAAAASMAMAAMXSAMXAAMAAAXMAAAAMXSAAXSASMSAAMAAMXMASASMXMASXSMMASMMXMAMSAMXXMAMSASAMXAAMMMSMMSXMASAMXMXMASAAAAMASXSXAAAAAAAMASA +SXSXSXMASMMMXSAMMMMMMSASXSXMAXMXSXSMSSSMMMSMMMSMXMAMXXMMSSMXMXMSMXAAXMAMAXXSMMMMXSSMMAXXSSXMASMXMASASXXMAXSAMXMASMXXSXMMSSMSXAMMASMSSMMMSSMA diff --git a/package.yaml b/package.yaml index c0883bd..5d10926 100644 --- a/package.yaml +++ b/package.yaml @@ -24,6 +24,7 @@ dependencies: - regex-tdfa ^>= 1.3.2 - text >= 2.0.2 - containers + - unordered-containers ghc-options: - -Wall diff --git a/src/Day4.hs b/src/Day4.hs index b9cf406..a9831ea 100644 --- a/src/Day4.hs +++ b/src/Day4.hs @@ -1,6 +1,6 @@ module Day4 (partOne, partTwo) where -import Data.List (transpose) +import Data.List (sort, transpose) import qualified Day4.Matrix as M partOne :: String -> Int @@ -20,8 +20,13 @@ partOne input = countXMAS [] = 0 partTwo :: String -> Int -partTwo input = - let matrix = M.buildMatrix (lines input) - in length $ filter (isXMAS . fst) $ filter ((== 'a') . snd) $ M.toList matrix +partTwo input = M.size (M.filterWithKey isXMAS matrix) where - isXMAS = undefined + matrix = M.buildMatrix (lines input) + + isXMAS (col, row) 'A' = + let firstDiagonal = M.lookupMultiple [(col - 1, row - 1), (col + 1, row + 1)] matrix + secondDiagonal = M.lookupMultiple [(col - 1, row + 1), (col + 1, row - 1)] matrix + in sort firstDiagonal == "MS" + && sort secondDiagonal == "MS" + isXMAS _ _ = False diff --git a/src/Day4/Matrix.hs b/src/Day4/Matrix.hs index 7ab0dd7..628f59a 100644 --- a/src/Day4/Matrix.hs +++ b/src/Day4/Matrix.hs @@ -5,23 +5,24 @@ module Day4.Matrix ( Matrix, buildMatrix, groupWith, - getValue, - getValues, - toList, + lookup, + lookupMultiple, + filterWithKey, + size, ) where -import Data.Foldable (find) +import Data.HashMap.Lazy (HashMap) +import qualified Data.HashMap.Lazy as HashMap import Data.IntMap.Lazy (IntMap) import qualified Data.IntMap.Lazy as IntMap import Data.Maybe +import Prelude hiding (lookup) -type AssocList k v = [(k, v)] - -newtype Matrix v = Matrix (AssocList (Int, Int) v) +newtype Matrix v = Matrix (HashMap (Int, Int) v) buildMatrix :: [[a]] -> Matrix a -buildMatrix xs = Matrix (go xs 0 []) +buildMatrix xs = Matrix (go xs 0 HashMap.empty) where go [] _ acc = acc go (x : xs') row acc = @@ -30,26 +31,29 @@ buildMatrix xs = Matrix (go xs 0 []) parseRow [] _ acc = acc parseRow (x : xs') (row, column) acc = - let acc' = ((row, column), x) : acc + let acc' = HashMap.insert (row, column) x acc in parseRow xs' (row, column + 1) acc' -toList :: Matrix v -> [((Int, Int), v)] -toList (Matrix assoc) = assoc +size :: Matrix v -> Int +size (Matrix hmap) = HashMap.size hmap -getValue :: (Int, Int) -> Matrix v -> Maybe v -getValue position (Matrix assoc) = snd <$> find ((== position) . fst) assoc +filterWithKey :: ((Int, Int) -> v -> Bool) -> Matrix v -> Matrix v +filterWithKey f (Matrix hmap) = Matrix (HashMap.filterWithKey f hmap) -getValues :: [(Int, Int)] -> Matrix v -> [v] -getValues positions matrix = mapMaybe (`getValue` matrix) positions +lookup :: (Int, Int) -> Matrix v -> Maybe v +lookup position (Matrix hmap) = HashMap.lookup position hmap + +lookupMultiple :: [(Int, Int)] -> Matrix v -> [v] +lookupMultiple positions matrix = mapMaybe (`lookup` matrix) positions {-- Given a matrix of elements and a function mapping a position into an aggregation of its values, group the elements by the aggregation result --} groupWith :: forall v. ((Int, Int) -> Int) -> Matrix v -> [[v]] -groupWith f (Matrix matrix) = +groupWith f (Matrix hmap) = let intMap :: IntMap [v] - intMap = foldr (\(position, value) -> insertValue (f position) value) IntMap.empty matrix + intMap = HashMap.foldrWithKey (insertValue . f) IntMap.empty hmap in IntMap.elems intMap where insertValue key value =