diff --git a/Cargo.lock b/Cargo.lock index 4a3ae72..fe67315 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -21,6 +21,10 @@ dependencies = [ "nom", ] +[[package]] +name = "day4" +version = "0.1.0" + [[package]] name = "memchr" version = "2.7.4" diff --git a/day4/Cargo.toml b/day4/Cargo.toml new file mode 100644 index 0000000..0ebbbc8 --- /dev/null +++ b/day4/Cargo.toml @@ -0,0 +1,6 @@ +[package] +name = "day4" +version = "0.1.0" +edition = "2021" + +[dependencies] diff --git a/day4/src/common.rs b/day4/src/common.rs new file mode 100644 index 0000000..1f239fd --- /dev/null +++ b/day4/src/common.rs @@ -0,0 +1,18 @@ +pub(crate) type Matrix = Vec>; + +pub(crate) fn parse_input(input: &str) -> Matrix { + parse_lines(input) + .into_iter() + .map(ToString::to_string) + .map(parse_line) + .filter(|array| !array.is_empty()) + .collect() +} + +pub(crate) fn parse_lines(input: &str) -> Vec<&str> { + input.split("\n").collect() +} + +pub(crate) fn parse_line(line: String) -> Vec { + line.trim().chars().collect() +} diff --git a/day4/src/input.txt b/day4/src/input.txt new file mode 100644 index 0000000..1b4dc00 --- /dev/null +++ b/day4/src/input.txt @@ -0,0 +1,140 @@ +XMMMSMMXMSXMXMAXSMMAXXXXSXXASXSASAMSXMAXAAMSMMMSXSAMXMMXMASMMMSXMXSAMXSASAMXXXXMMMMMMXMXSMXSMSMSMSXSSXSMSSMSAMMXXSAMXMXMXSMSMMASMXMAASMSMMMM +MSMXAASXMSASAAAXSASMSAMXMMMXAAMMMASMMXSXMXSAMAAMXSMMASXSSXMAAAAAMAMAXASAXMMSMMMXSAAASMMAMSAMASAAASXMAMAAAAXMAMAASAMSAMXMAAMAMAASMMMSXMAAMAAM +AAMMXXMXASAMXSSMSAMAXAMMSAXMMSMSSXMXSAXASXSASMXMAXASMMSAAASXMSSMMASMMMMMMAAAAXXAXMXMXAMAXMMSAMSMXMAXMXMMMSMSAMMXSAASASMMAXSASMMXAAAMMMSMSMXX +SSSSXASMMMSMAXXAMXMXMXMASXSAAAAXMXXXMASAMMSAMASMMSAMAXXMSMMMMAMASAXAAXASAMXSSMMMSMSSSMMSSMXMAXMMSSMMXMMAMAASXSXMSMMSAMXSAXAMMASXMMMSAXAAAASX +XAAMAMXAAAAMXMMMAAMAAAMMSXXMSSSMMSMAMAMAMAMXMAMAMAMMXMSXXMASMAXAMXSXMXMXXSAMAMAAAAAAXXAAAXXMMMMAAAAMMXSASMXMXMMMXMAMMMAMXSMAXAMAAMASXSMSXMAA +MMMMAXSMMSSMSXAASXSASXSMMASAAAAMAAAMMMSXMXMAMXSAMSASAMXAXSMMSSMMXMAXMSMMAMXMAASXMSMMMMXSAMSMSMMMSXXMAASXXXAXAAAMAMSSMMXSASXSMAXMMMAXAXAMMSMA +MXSSMMMSMMMAAMMMXAMXMXAAXAMMMSMMSMSXAXMAMAMASASASAASMAMSMSMAAMAXXMAXMAMMSSMSSXMMAXXXAAAXAASASMAAXASMMMSXMXMSMSMMASMXMAAMMSAXSAMSMMXSSMXMASXX +MAMAMMAAXSMSMSASXSAMMSSMMXSXAAXMAXAMXXSMMSSMMXMXMMMMMAXMAXMMSSMASMMXMASXAAAAMAMMSAMSMSMMMMMXMMMMMXMASAMXAMXMAAXSMXMASMMSAMAMMXXXASMAXMASXSSM +MXSSMMSMXSAAASASMMAMAAAAXXXAMMMMSASXMXAMAXAXXSMSXSMASMSMAMXMAAXAMASASAMMSMMMMXMAXAMXXXXAXMXMSXSXSXSXMASAMSSSXMXAAXAMXAXMXMMMSSMSAMMMMMMMAMAM +SMMMXMAMXXMMXMAMMSAMMSXMSMSMMXAAAMXAXSAMMMSMMMAAAXMAXAAMAMAMMSMXSAMMMASAXAXXXAMAMAMMMSSSMSAMSSMASAASMXMXMXMASXSMMSMMMSMAAXMAXAAMAXASAXXMASAM +AAAAXMMSASMXXMXMXSXSMXMASASAASMSSXMAMSXMAAAAAMMMMMMXSSMSASMSAMXXMXMXMAAMXSMSXSMMSXMAAXAAAXAMXAMAMAMMMAXAXXMMMXAXAAMAAAMSMMMMSMXMXSASAXMSASAS +SSMSXSAMXAAAXSSMAMXXAXMAMXMXXMAXXMMXMMSSMSSSSSXSMXSAAXAMMSAMXSAXAAMAMMSAMMASAMXMAXSASMMMMSSMSAMSSXMAXMSMSXXXXMSMSSSMSSXXASXXAMMMAMXMMMAMASMM +XMAXAMMMMMMMAXSMASXMMMMASXMXSMSMMMXAXSAXMAAXXAAXXAMMSMSMMMAMSSMSXMSSSMAXAMAMAMAMSXSAMXMAMAAXMAMMAASMMMAAMMMAXAAAXMXXXMASAMMSXSAASMSAAMXMAMXM +SMSMSMAASXMMXMMSMMAAAAMXMXMAMAAXAXSXMMAXMSSSSMSMMMSMMAMAASAMAMXSAXXAAXAMSMASXSXSXMMAMMMMMSSSSMSMMMMMASMSMSMASMMSMSMMSMXMXMAXXMASMAMXMXAMAXAX +AAXSXMSMXAXXAXXAMMSSMMSASAMASMMSXXAMXSMSAMAAXAAMAXAAXAMSMSASMMASXMMSSMXSXSXXAAXMASMMMXAAMAMXAAAAXAASXMXMASAASMAMMXMAXXXXSXMMAMSAMXMASXSSMMSS +MAMSXMAXSMMSXMSASAXAMASXSASASAXAMXXAMAAMXMMMMSMSSSSSMSAAMSAMXMASAMXAXMXMXMSMMMAXAMASASXMMAXSMMMSSSMSAMSMAXMASMAMXXMMMSAAXAAMSMAAXMMXSAMAXAAA +SMAMASAXAAAXMASAMMSAMXSASXMASMMSSMSSSMMMSXAAAMXXAAXAAXMSMMXSAMXXAXMSMMXMXMMMSAMMSSMMASAASXMMXMAAAMASAMXMXSMMXMAMSASAASMSMXMAMASMMASAMAMAMMXM +MXSXMMMXMMMSAMMXMXMMMAXXXMMMMAAXAASAXAXSXMSMSSSMMMMASXAAAXSXMMAXMMMAASMMAMAXASMAAAMMXMXMXAMXAMMSSMXSSMXSXMAAXXAMSAMMXMXXMMSAMAMSAMMASMMSSMSS +AAAXSASMXSXMMMMSMXMAMSMXMMAMMMMSMMMMSAMXAMXMAAAAAXAMXMSSSMMASMSSMAMSSMASASASMMMSSMMSMSSXSMMSMSAMXXXMAMXXASAMSMMXMXMXAXMAMXMASXXMSXSXMMAMAMAS +MXXMSAMAASXSAXAAMASMSAAAMSASXMAMMAMXSMSSXMAMXSSMMMSXXAAAAAMXMAAXMMMXMAXSMSXMXMAAAAMXMASXXAXAAMASMSSSMSMSAMXMMASXMMMSMSXAAAMXMMAMMMMXXMAAAMMS +MMSMMSMMMSASMMSXSAMXSMSMXAASXMAMSMSMXMAAASXSAXMAAAXAXSAMSSMSMXMXAMSAXMMSXXMSAMXXSMMAMMSMXAMXXSAMXAAAAAAMAMMMSAMAAMASXXXMXXMAXXSMAAMSSSSSSSXS +XAAMAMXASMAMXAAAMXSAMXMXMMXMMMSMXAAXAMSSMMASASXSSSMXMMAMXAAAMSMXXXMAXSAMXMASMMSMMASASXMASXXSAMAMMMSMMMMSAMSAMXMSMMMMMMAXASXXSAAXXXMAAXAXAAAX +MMXMAMAMXMAMXMAMXXAMXASMXXMAXAMXMSMSXMMAXMAMMMXXAAAASMMSSMMMMAMASMMMMMASXXAXMAMAMAMASAMXMXASXSAMMXAMAMMSASMXXSAXAMXAAXMAXSAASXMASXMMSMMMSMMM +MSSSXSAMXAMMAMSMSMMXMMSAASXSMMSAAAXMMMSMMMMSAAXSMSMMMAXAAAMSSMSAAMAAXSAMMMMMMMSAMAMXMMMSMMAMAXAXSXMSASAXMMASAMMSMMSSXSXSXMMMMAXAAAAAMAXXMAMX +AAAAMSMMSMMMSSMAMXMSASMMMSAMAXSXSMXMXAAAAXAMXSMSXMMXXSMSMMMAAXMMSSSSMMASXMSAXMAXSMSXMAXAASXMSMSXSAASMMMSAXASXMXAMMAMMSAXASXXMAMXSXMMSMMMSSMA +AMMMMXXAXXMAXAMXMSAMXXSAMXMSAMXAXXXXMMSSMSSMMXASAMXSXXAMASMSSMSAMXAXXSXMAAXMXMSXSXXAMSXSMMSAAAMASMMMMAASXMAMAXSXSMAMXMAXAMAMSXMAMMSAMAXAAAXM +SMMSXXMASXMSSMMAMAMMMASMXAXXMXMSMSMXSAAAMAXAXMXMMSAMXMMMASAMXXMAXSAMXMSMMMMSMAAASMSSMXXXAAMSMMMMMMSSMMMSAXXXMMXMMMSSXSMMMMMXAAMAMXMAXXMMSSMM +AMAMXXAMXAMXAXSXSAMAMXMASMMMMSMMXMAXMASMMSSMMMXSAMXSMSAMXSAMXXMAMXASMAAXAMAAMXMMMAXAAXAXMMMAXAAMXAAAXSXMXMMMSAXAAAAAASXSXAXSMXXASMXSMXAMAMXX +MMAXSASMSSMMMMAXMASXMSAAAAAAAAXMASXMMXMAAMXMAMAMASASASMSASAMXMSMSSMMMSMMMSSXSSXSMSMMSMSMSAMMSSSSSMSSMAAMXAXAAAXSMSMMMMAMMSMAAASMMMSXMMAAMMMM +XSASXAAAMMSAMXMMSMMMSSMMSSMMSXSSMSASXSMMMMMXMMAXAMXMAMAMXSAMXAAAXASAMXASMAMMMXAXAAXXAAXASMMXMAAAMAAMXXAMAMMASAMXAMASXMAMAMSMMMSXAXMAMMMMXAAA +MMSSMMMXMASMSASAAXAXXXXMAXMXMAMXASAMAMSMAAMXSMMSXSMMSMMMMMXMXSMMMAMXSSXAMXXMMAMMSMSMMSMMMMSMMMMSMMMMSXSASXXAXMXMXMASXMAMAMSXSXSMSMMAMASMSSSS +AXAMXSXSMAXXSAMSMMMSMSXSAMXAMAMAAMMMXMAXMXSASAAAAMAMAMXAASAMXXXSMSXXMASMAASXMMXAXAXXMXMSXMAMAMXMAMAXSAXAXSMSMMAMAMASASXSSSMAMAXAXSSMMMSAXAMX +SMXXMSASAMXAMAMMXMMAMXAAXAMXSAMXSXXAMSSSXAMASMMMSMASASXSXSASAXAXAMMSMXMXMSMMASMMSAMSMAMXASMSMSAMXMXSMAMAMMXMASASAMASAMAAXSMAMSMSMAXAASMXMAMA +AAMXMMMMAMSAMSMSAMSSMMMMMSAMXMSXXMMMXAAXMAMXMMMAMXAMMSAXAXAMAMSAAMASMXMXMXASAMXAMAAAMXMXMMXAAAMAMMSMMXMXMSASXMAMASMSAMMMMMSXSAMXMMMMMMAXSXMM +MXAAXAMXSXSAMMASMMAXXSXSAAXAASAMAMASMMSMAAXAAXMASMSSMMAMXMMXSSXMMMXMASXMMSXMASMSSXSMXSMSMAMMSMMAAXMXSXMASXASAMSMMAMSMMAXMAMXSAXXAXSMSMSMMMMM +XSSMMASXMASAMMAMAMMXXXASXMASXSASXSASAAAAMSSMSMSMSXXAMMMMXASAMMMSMMMMXMAAASASASMAMAMXAXAAAXMXAXMSSXSAMAMXSMMMMAXASMMSXSXSMXXASAMSAMXXAAAAMAAX +XAAASXMASASAMMSSSMXXMMXMAXAMXSAMXXASAMXSAMAMAAAMSMMXMAMXMAMXSAAAAAMAMSMMMSXMAXMASAMMSSSMSMMSMSMAXAMMSXSAMXXASAMAMXXSAMAMMMSMMMMASMSSMSMSSSSS +XMXMAMSAMAMXMAAMAAXSXSAXMMMMXMMSSMXMASAMMSAMMSMSXAXSSMSSMXMASMXSSXSAXXMSXMXMXMMMSXXAXMAXXAXAAXMAMMMXAXXMSSSXSAMSXSSMAMAMAAAMASMAMXMAMXAMXXAX +ASASMMMSMMMSMSMXMMMAASXSSXSXXXAAAMAMXMMSMMAXXMXSMMMAAMAMAAAXMSXMAMSMMAMMAMXMMMSAMXMSSSMMSMSSMMMSSXSMMMSAAAXMMXMMAMXMXMASMSSSSSMASASMMSSMSMSM +AXAMSASASASXAAXSXSMMASAMXAMXMMMSXSAMSAMXMSSMASAMAAAXMMXSSSSMAMSMAMSMSSMSAMXSAAMMMMAAAAXMAMXMAASXMASMAAAMMXMMMXMMMMAMASXXAXXXAXMASMMMAXXAXAXX +SMSMSMSASXMMMMMXASXXMXXAMAMMSXMXAAAXMAXXAAASAMMSSMMSXMAMAMXMAAAXAXMXAAXSXSAMMSSXSXMMMASMXMAXMMMAMSMMMSSMSMXSMAAAAXASAMMMSMMMMMMMMAAMSSSMMSMM +XAAASMMXMAMMMMAMSMAXMAXMSXMASXAXMASMMXSAMSXMSSXAXAAAAMMMSMXXMSSSSSMMMSMMSMMSAAMXMASXSMMAMSSSMSSXMAMMMAAAXXAASXMSSXAMAXSAMAAAAMASXMXSAAAASXMS +MMMMMAMXSMMSAMXMXAMXMASMXAMSMMMXSMXAXASMXXAAAMMASMMSXMMAMMMXAMAMXAMAXAASAMXMMXXAMAMXAAMSMAMMMAASXMSMASMMMMMXAXAAXMAMSMMASXSSXSMXAXMMMSMMMAMS +SASMSXMAMAASXSMSMXMAMXXXASMMXAXMMSSXMASAASXMMAAMXMMMMMMAXASXMMSMSSMSASMSAMMSMSSSSMMSAMMAMAXAMXSMSMAXMMAMMSXMMSAMSSSXXASXMAAXMMMSMMAXMAMASMMS +SASAMXMASMMXMMAAAMSMMSXXXMAXSXMXAAMAAASMMSXXXXMMAMAAAAMSMMMAMAXMAXAXMMMXAMAAAAXAAAAMASMXMSSMSXMAXSAXXXXMASXAMMAXXAXXXXMSMMMMXAAXXXXMSSSXMMAS +MAMAXASXSXSMSMSMSMAAAXMSAMXMSXMMMSSSMXMAXXXMMSXSASXSMXSAAXSSMXSAMMSMXAMSMMSMSMAMMMMMASAAAMAMSAMAMMMSSMAMAMSMMSSMMXMMMSAXMSMMMSXSMMSAAMXAXMAS +MASXMMAXMASAMAMAMXMMMMAAAMAMMASAMXAXXMSSMMSXAAXSASAMASMMSMAAAXMMXMAXMAMAAAXAAMSXXSSMAXMMMSAMSAMXSAMAAMAMMMXSAAAAMASAAMSMSASXAXAXAAAMMSSSMMXS +MASXMAAMMAMXMXMAMAXAAAMMXXSXSASAMMSMXXAAAAMMMMXMMMMMMMAAXMMMMMSXMXSSSSSSSMXSASXXMAXMMMXMASMMMAXXXAXMMSXMSASMMSSMSAMXMXXXSASMMSASMMSSXMAMXMAM +MAMAXAMXMXMXMXMAMAXSSSMXMXXASASXMAXMSMSSMASMXSXXMAMASMMMXMSMSAMASAXAAAXAAAXXXXMMSXXAMXMXMXMASMMMSXMSMSMASMMAAAMMMXSSMMMMMXMAXMAMAMXMAMMMAXAX +MSSMXASMXMSMAMSMSAXAMXAAAMMAMAMXMXXAAMXAXXMXAMXASMSXMAMSSMAAMXSAMMMMMMMSMMSXMAMXASMMSMSAMXSASMAMAXAAAMMAMXSSMSMAMXSXSAAXMASXMSMSASASAMASMSSS +MAAXSSMXAAAMAAAXXMAMMMSMSMMAMAMXXAMMMSSMMMAMXMAXAMXAMMMMASMXMMMASMXMAXXXXAXAXAMMASXAAMXAXAMMXXMAXXMMSMMMSAMXAAXAXXMAMSSMSASAMAMAAAXXASMSAAAX +MMSMMAASMSSSSSSSMSMSMAXXXXMAMAXMMMXSAAAAASXSASXSXXSAXSASMMSAMAMXMAAASMMMMSSMMMMMXMMMSSXSMMMXMSSMSMXMAXMAMAXMSMSSSMMSMAXXMASAMASMSMASMMXMMMSM +XXAAXMXMXMXAXAAXAAMAMMSMXSMSSXMAAASMMMSSMSASXXAMXMAAXSAMSAMXSSMMSMMMAAAAAAAASXMXAAAXAMAMASAASASAAAASMSAMXMAXMMXMAMAMMAMMAMXXSXMXAAAXAAXXAAXX +SSMSXXAXAAMMMMMMSMSXSASXAAAAAAXMMMSXAMMMMMMMXMAMSXMXMMAMMMSAMAAAXAXXMSMMSMSMMAASMMSMMSMSAMXMMAMSMSMSAMXXAAMSAMXSMMAMMAXXMXSAMXMSXMMSMSSXMSSX +AMXMXSSSSSSXAAMXMXMASASMSMMMSMXSAMXMAXAMXXAAXSAMXAXAMXAMAAMXSMMMMMSSXMXAAMAXMMMMMAAXMAMMXMXXMSMMXMAMAMMSSSMMMMMXXSSSSXSAAAMSAMXXSXAXAAAMSAMX +MSXMAAXAXAMXSMXAMASXMAMXXXMXMAASAMAMSSSSSSMSMMASMXMMXMAXMSMASXASMAAMASMSSXMMMAAMXSMSSMSMMMSAAMAMSMASAMMMAMXAAAAAAXMAMAAXMMXAMMMMSMAMXSMSMAMM +XMAMXMMMSMMMMSMXSXMAMMMMXMSMMAMSAMXSAXXAXMAXXSSMASMAMSAMSXMASXMMMMXXXMAMAASXSSMSAMXXAXXAAASMMMAMSXMSMSXSASMSSSSMSSXAMXMAMXXAXAAAXMXMAAXSMSXS +SSSMSXAXAAXXAMXMAMSAMXASAMMASXXXMASAMSMXMSAMMMAMAMMAXAMXAAMXXASXMSSSMMMMMMMAAAAXMAMSAMXMMXSXMMXMXAXXMAAMASAAMAXAAXMMXAXSSSMSSXSXMMAMASMMAXAA +XAMAMMSMMSMMSMMMSXMAMSAAMASAMMXMAMAMMAMAMMAAAMAMAXMXMAXXMSMXSSMMXAAAXXAAAXMMMMMMXAXMXMMSMXXMXASMSSMAMSSMSMMMMSMMMSASXMSMAAAAAXXAMMXSAMAMAMSM +MMMAMMAMXAMAAAAAMMMSAMMMXAMSSXXXMASXMASAMXASMSXXXSMMSSMSMAAMSXMXMSMMMSMSMSAAXMAAMSSSMSMAMMXSMMSXAAXXMAAMXMXAAMAMAMXMAMXMSMMMXASASAMMASMMMMAA +XSSMSMAXSAMXSSMXSAAAXXAXAAXAMMMSXMMASMSASMAMMMMMSAAMAMAAXMXMXAMMMXAAAXXAAMMMSMMMSAAMAAMMMMASAMMMSMMSXMASAMXMXXAMMXSSMMSMMXXXMMSAMXXSAMXMXAMS +MMAAXMAXMAMMXMASMMMSASMSXMMAXAAXMASAMAMAMMMMMAAXASMMAMSMXSAMSAMAAMSMMSXMSMSASAMSMMSMSMMSAMAXMMAAAAMXAXASXMAXSSMMMAXAXAAMMSSMAXMXSAXMXSASASXA +AMMXMASXSAMSAMXMAMAXXAXXASXSSMSSMAMSMXMMMMASMSSSMXSSSXXAAMAXAASMSMMAMXAAXMMASAMAAXMMXAAXSMSMMSXSMSSSSMXSASMXMASXSMMAMSMSAAAXSXAAMASMXSASMAMM +SASXMAMXMAASASXSMMAMSXSMXMAMMXMAMSAXMAXMASMSAAAXAXXXMAMMMSSMSMMAMMMMXSXMXSMAMASMSAMXXMXXMMXAAMAMAMAAMMMMAAXASAMXSAMXMXAMMSSMMMMMSMXMAXXXXMAX +AAXSMXMAMSMMXMXAAMMMMMMXAMXMMAMXMMAMSSMSXSMMMMSMMMMAMXMMXXAAXAMXMAASMMXMAMMXXXMMXXAXXXSASAXMMMAMAMMMMMSMSMXMMASXSAMSMMXMAMMXAAAXXMAXMMXSAXAM +MMMMSSMSMAAXMSXMSMMAMAXASMSSSMSAXMAMXXASAMXMAXAMSAMAMASXMSMMMXMASMMSAAAMMXSAXSAMXMMSMMXAMAXSXMASAMXMAAMAXXSSSMMASXMAMAXSXSASMXSXSSSXSAASAMSS +MSAMXMAXSMMMAXAXAAMXSMSMMAAMAMSXXXASAMXMAMAMMMXMMAXXSASAMXAAMXSXMMXSMMXSAAMAXSAMSAAMAAMXMAMMASMSAMMSMSMXMXAASXMAMMSXSMASAMMMMMMAMAMAMXMSAMAM +XSMSAMSMSMSSSSMSSSMAMAMXMMMXXMMMMSAMAXMXAMXMSAMXSMMXMMSXMMMMSASMSMXMMMAMMSMMMSAAMMMSSMSMMXXSAMMXAMAXMMMSXMSAMXAMMMMAAMAMXMMXSAMAMAMXMSMMAMMS +MXAMXMAAXAXAAXXMAMAASMMXMAMSMSXAAMAMMMXSASAAXMXMAXSAMASASXSMMAMMAMAAAMXSAMAMASMMSXMAMXXAAAMMMMSSMMSMXMASXAXASXMAMAMSMMMSMXSAMMSMMXMXAAXSXMXX +AMSMSSMSMSMMMMMMAMSAMAMMXAMAAMMMMSAMAAMSAMMSMMMMMASASMSAMAAXMSMSMXSSMSAMMSAMXSXAAMMASXXMMMSAMMXAAXAAXMAMMMSAMXMASMXXAMXMAAMASAAXSSMMSMXASMXM +SAAAAAAMAMXAAAXSAMMXSMMASXSMSMAXXSXSMSXMSSMMMMXAXMSAMXMXMSXMAMXAAAXMMMASXXAMXSMXSAMASMSMSMSAMAXAXSXSSMSSMAMXMAMMSMAMSMSXMASAMXXSAAXAAXAMMMAM +XSMXMMXMAMSMMSAAMSMAAMMMXAAAMXXXAMXMXXAMAXMAXMSMSXMASXAXXMASASMMMXSAMXAMMMSMAXAMXXMXMAAAAXSAMASMMSXAAXXAMSSSSXSMXMAMAXMASAMAMXXXMSMXSSMAAXAS +MXSXXMMSAMMASXMXMAMXSMSXSSMMMASMAMXXAMAMMSSMSXMAMMMSAMXXMSAMXSAAXAMXMMSXSAXMMMSMAMSSMSMSMMSAMAAAAXMSMMSSMXMASAAASXSSXSSXMXSAMSAMXXXAMAXSSSMS +SASMAMASMSXXMAXXSXSMAASAMXAXMASMAMMMMXAMXMAAXMMXMAXMASXMMMASASXMMXSMXMAAMAXAAAAMXMAAAAMAMAMMMMXMMMXAMXMMMAMMMSMSMAAMAXXASAMAXXAMMSMXMAMXAAAS +MAMMAMMMXAASXSMAMASMMMMMMSMMAAXMAXXAXXXXASMSMXSSSMMAXXMMASAMXXAXXMAXAMMSMMSXMSMXMSSMMMMAMXXSASXMAXXAXXMAMAMXAMXMMMMMXMXXMXSXMSAMAXMMMSMXSMMM +MAMSMSXSMSXSAAMXMAMAMSSMMAMXMSXMSMSASXXSXSMMMAXXAASMSMMSASAMSSMMXAMSMXAAAAAXXAMAAAXXMAMMSMMSASXMSSMMMXXAXAXMASAXAMXSAAXMSMXAXSXMMMAAAAAAXASM +MAMAASASAMAMXMASMSSSMAAXXXMSXMAAAAMAMAASAMXAMMMMSMMAAAMAASMMAAAXMSXMAMSSSMMSAASMMMMMMSXSAXAMXMASASAMXAXSSXMSAMASXMASMSAXAAMSMMASAMSMSSMXSAMX +SMSMSMAMXMAMXXXXAXMAMMMMMSMMASXMMSMMMMXMAMMSXSAXXXMXMXMMMMMMSSMMSAMASAXXAMXXMMMMSAAXAAXSAMSSMSMMASXMMXSAAXXMASXSAMASAMXXMSMAAAXMAMXAAMXXAMXM +SMMMAMXMAMXMXMXMMMMASMMSXSAMAMMAAXAXSSSMMSMMASXSMMSMSMSAXXXAXAMXXAMAMXMSMMMXXXAASMMXMXMMAMAMXAXAMMXSAXXMXMMXMAXXAMASASXSMAXXSMXSXMMMMSXMMSAS +MAXSASXMXMAMXAXAAXAAXMASASXMXXAMXSAMAAAMXSAMAMAMAAXAXASMSAMXSAMMSMMSMMXAMAMXMMMMMASASAMMAMAXMMSSSSXMMSMXMMXXMXMSMMMSXMAASXSXMMMMAMAAAXAMXSAS +SAMXMXMMASASXXSAMMMMMMMMAMXSMMSMXMXMMSMMAMAMSMMSMMSXMMMMSAXAMAMMAMMAASMSSXSAMXAXMXMAXASMSSMSAAAAMXMAAAMMMXAXMAMAASAMXMSMMMAXMAMSAAMSMSMMAMXM +MMSMMAMXAMAXAASASXXMXSXMXMAXAMXXAMAMAMAMASAMXSXAAXAMXMAMSAMSXSMSASMMXMAXXMMASMMSAMMSMXMAXAAMMMMMMAXSXMSAMAXXMXXAMXMASXMASMMAXAMXMSMAMMAMMSAM +XAAAMASMMSXMMMMAMMMSAMASXMSSSMSAMXASAXMXMSMSMASXSMAMMSAXMAMAAXASXSASMMSMAMSMMXAMXXAXMXSXMMMSSSSSSSXXAAXASMMSASMSXMSAXAMASMSASMSMAAMAXSASXSAS +MSSSMASXXAAMXSMAMAAMASAMAXMAXXMASMMMMSXMXMMAMMAMXMSMASMMSAMMSMAMMMAMMAMXXMAXXXMSSMMSMAMAMMXMAASXAXAMMMSMAAAMAMAXMAMMSSMAMXXAAMAASXMSXSASAMSM +MAAXMXMMMMMSAMMSXMMSXMASMMSAXMMXMMAAXMASAAXASXAXAMXMXSAMSXSAMXXXSMAMMXMASMSSSMAAAAAAMAXAMMMMMMMMAMXMXMAMMMMMXMAMMSMXAMMAXMMMMSSMXSAXAMAMMMAS +MMSMSAMXAAAMXMAXSMMMMXMMXAMXSMSMMSMMMMMSSSMMSMMXAMAMAXAMXAMASMMMASMSMXMAMAAAMAMMXMMXSSSMMXAAAAXMXMAMXXXSXMXAAMXMMMMMMMMSAAXXMAMXAAMMMMMMMSAS +AXMMXXSSMXSAAMXMAXSASAASMXSASAAAASXMXXAMAMAASAMXSSMSSSSMMXMXMAAAMMMAMMMAMSMSMSMSSSXMAXAXSSSSMXSXAMSXSXAMAMXSXXAASAMASAAXSSMSMSSMSXSASAXAXXAM +SAMXSMMASAXMASAMMMSASXSMMASAMXXSMMMMXSXSXSMMMAMAMAXAAXAASXMMMSSSXASASXSAXMAXXXAAAAMMMMMMMAMXAXXMXSAASMMMSSMXMMSXSASASMSMMXAMXAAXXMSASASMSMAM +XMAXAASAMMXAMXMMXMMAMXMAMAMAMAXMAMASXSAXAXMAXAMSMSMMSSSMMMAAAAMXMASMMASXSMAMSMMMSMAAXSMMMAMASMAXXMMMMAAAXAMXMMXASAMASXAMMMSMMSMMMMMXMXMAMXAM +MMMMMXMMSXXASAXXMAMAMXXAMXSAMXMXAMXSAMXMXMXMMXMXAXXXAAXXSSSMSMSAMXSXMAMMXMMSMSAMXXMXSAAASASAASXMASMSMXMSMXMSMAMMMXMAMXXXSAMMAXAXXMSSMSMSMMMS +AAAXXAAMXAASMMSXMASXSASMMMMXSAMSSMXMXMAXXMSMXSAMMMMMMSMXXAXAMXMXSASXMASXMASAMMSMAMASXXSMSMMAXMXAXXAAAASMXMAAMASXMASXMMXAMASMSSSMAXAAMAAXSXAX +XXMXSMSMMMMMAMXMSMSAMASXAMAAXXMAAXXSXMSMSAXAAXMXMAAAMXASMMMSMAMAMASMSAMMSMMMSAAXAMXXAXMXXAXMASMMMMMMSMSAAMSMSAMXSMSAMAXASAMAXAASAMSMMMMMMMMS +ASMMSXXASMMXAMAMAMMAMXMXSMMMSSMXXMMSAMMASXMMMSXSXMMSMXSXSAAAXXMASMXAXMAXAAAAMMMSMSSMMMMMSMMXASASXSMAMAMXMMMAMMMXSASAMMSXMASMMSMMXMAAAXAAMAMM +XXAAXAXXMAXSASXSASXSMXSAMXMSAMSAASAMAMMXMAMXMAAXXSAXMXMASMSSSSSMSASMSMSSSSMSSMXAMAAAMMAAAAXMMMMXAAMAMAMXSASMMXSAMXMMMAAXMAMXAXMSSMSMMSSSSMSS +SSMMMSMMSAMSASAXXXXAMAMAMXMMAAXSSMASXMMMXSMSMMSMAMMXAAMAMAMAMXAAXXMXAAAAXAXAAXAAMSSMAMSSSSSMASXMXMMMSMSAMXSAMMXMMXMAMMXMXAMXMMXAAMAXXAXMAXAM +XAAXAMAMAMAMAMMSSXSMMAMMMSXSXMAMXMMMMAMSAXASXAXMXMAMXXSAMXMAMSMMXXMXMMMSMMMSSMMSMXXXXXAAXAAMAMAXSXMXAMMASASMMSASAXMAMXASXSMSMSMSSMSMMMMSAMSS +SSMMMSSMMXSMSMSAAMSXSMSMAMASMSXMXXAAMAMSAMAMMXSAAMASMASMSMSSXXAMMXSAMXXAAAAMAAXAMXMMMMMMMSMMSSSMAASMMMSMMMSAXSASMXSASMAMAMAXAAAXAAAAAAXMAXAM +AAAXXAAAXMXAAXMMSMMAXAAMAMMMMMAMSSSMMAMMXMAMAMMXMSASMAMAAAXMAMAMMAMASMSASMMSSMMMMASAMAXAMXAAAAAMSMMAMXSAXXSXMMAMXMMASMXMAMMMMMSMMMMSMSSMSMMX +XSMSMSSMMSMSMSXSAAMXMSSMSASXXSAMMAAASXMMXMXXAAMAXMASMAMSMSXMXSXMMAMMMAMMMAAAAXMXSASMSAXSSSXMMMMMAAAMMAXMAMMSMMMMAXMMMMMMXSAMXAMXSMXXMXMXAAXA +MXASAMMAXXXMXMMMSSMXAXAAAMAAASXSSSMXMAASASXSXSXSXMAMXAXMXMASAAASXSSXMMSAMMMMSMAMMXSAMXXXAMXMAAXXMAMXMXSMMSAAXASXMSAMAMSMMSMSMMSAMXSXMASMSSMX +SMAMSMXAMSMSASAMAMXXXMMSMXMMMMAAAAXXMSMMAMXAXMAXSXXXMMXSASAMMSMMAAAXMMSASXXXXAMMSAMXMMXMAXSXMSSSMASMXXMASMXMMMMAXMMSAAAXXXMAXAMAMASAMAMAAAXX +XMSMXMMXMXAXAMSAMMMSXAXMASXXMMXMXMMSXMXMAMMXMMMMASXAMAASAMXSMXAMAMXMSASXMMXMMXSAMMSAMXASMXSAAAAMSAMXMAMXMAASMSSSMXMSMSMXAAMMSMXMMXSXMMSMSSMM +ASXAAXAASMSMSMXMAAAMSSMSSSXSXAXXXSASMXAXASMSMXXMAAMMMMMSAMXXMASMMSAMXXXMAMXAAMMMSASMSMASMASMMMSMMMMSXSAAMSMXXMAMXAAXAAXSSMMXAMAAXAMXAXAMAXAA +MMAXMSSMAAMAXAXXXMXMXMASAXAMXSAXSMASMSSSMSAAXMAMMSMXXMAMAMSMXAMXXMXMMXSMXMAXXXAXMASMAAAXMAMSMMAMAMSMAAMXMAMAXMMMSSSMSMXXAAXXAMSSMASXMMXMMSSX +MSAMXXMXMAMAMMMXSAMSMMSMXMMMAMMMMMMMAAXXMMXMMAAMAXMAMXMXAXSAMSSMSXAXSASMASMSSSXXMAMXXSMXMXXXMSAXAXAMXMMXSXSMXMAAXMAMXMXSXMMMSMAMMMAMXMAXXAMM +MMASXAXXXAMSSMAXMAMXASAMXMASMSAAXAXMMMSSMAXXAMXSAMXASAMMMMMAMAAAAMXMMAXSMMAMXAMMMMSMMAMXMSMAMSMSMSMMSXXMAAAMSSMXSSSMXMAMSMAAXAMXSSSSSSSSMXSA +XMSMMMMASAMXAMSXSAMSMMASXSASMMXMSXMASAAAMASMSMMMXSXMSASASMSSMSMMMAAMMSMAMMSMSAMSAXAAXAXAAXXMMMXAAAAXAAXSMSMAAAXAXAXAAMAXAXMASAXAASAAAAAXAASM +SMMAXXMXSASMMMMASMXMASMMAMASMSXXXAXAMMMSMASAAASXAMXAMXSASAAXMAAAMMXSAAXXMMMASAAXMSSSSMSMSMASXSSSSSSMMMMXXAXMSSMSMSASMSSSXSSXSXMXSMMMMMSMMASX +MASAMXMASAMXXAMXMXASMMASAMXMMXMASMMMSMSMMASMSAMMMSAMSMSMMMMMMSSMSSMMXSMMMSMMMMXAMXMXAAXMAMMAAAXAMXAXXAMAAMXMAMAAXMAXXAASXXMASASXMAMXXAXMAXSA +SAMASAMXSAMXSMMMXXMSASAMAMMMSXSAXAAAAMAAXXMXMAMAAMMXAAXAXASMMAXAAXXXAXMAMAMSASMXMASXMMMXAXXMMMMMAMSASASXMXMXAMMMXMXMMMMMSMMMMAMASAMSMMMMSMMM +MMSASASMSMSMXMSMMXXSAMMSSMAMSXMASMMSSSSSMSXXMAXMXSXSMSMXMMAMXAMMMSXMAXAASAMSASXASASXASASMSSXXMXXSAAASAXMMASMMSMAXXMSAAAAAMAAMMMXXXSXAAXAXAAX +SXMMSMMMSASMAMAAMAMMXMAAMXMXMXMAMXAXMAXAAXXAXMSSMSAMXXMASMSMSMMMXXAAMSSMSMXMMMMMMASXMMAXXAMSMMMMMMSAXMMAXAMXMAMMSXAAXSMSSSMSSSMMMMMMXMMXSMMS +AAXAXAASMAMSASXXMAAMMMMMMAMMMXSASMSMMSSMMMXMASAMXXASASMAMMAXAAAXMMASXAMMXXMASXAXMAMXMMSMMXMAXAAXMAMXASMXMSSMSASASMSMXMAMAXAXAXAASASXSMMMMXAA +SMMMMMMXMXMMMMXXSXXSAMXASXMSAAXXSAMXAMSAAXAMSMASXMMMASMSSSMSMMMSXMAXMXSAMXSAMSSXSMMASAAXSASXMSSSMXSXMMMXXMAMXXMAMXXXXSAMAMSMSMSMMAMAAMXAMMSS +MXMXXAAASASMSXSASAMXXXMAMMAMMSMMMMMMAXXXMSMSASXMMAXMSMAAXAMMMSMXAMAXASXXAXMAXAMMSAAAMXSASASAAMAXXXSXMAMMXMMSXMMAMMSAXMAMMXXAAAASMAMSMMMXSAAM +SAMXSMMSAMXSAAMMMMMXXMASXMMMAXXAAAAXMXSMMAMSASXASMMMMMMMXSAMSASXXMAXSXMASXXMMMXAMAMXSAMXMAMXMMAMXXMASXMMASASMXSASAXMASXMMAMXMMASMMXMASXAMMSS +SAMXSMMMXXXMMMMMAAMMXMAMSSXMXSMSSSMMSAAMSAXMAMMMMAMSASAAAAAMSASMXMSMMASAMASMSSMSSXSAMXSSMXMASMMMSMSAMAASASXSAMXAMMSMMAXXMASXMMMXAMAXAMMXSAAX +MXMAMAXAMXXSAMASXSSMAMXMASXSXSAMMXAAMMMMSXSMAMAMSAMSAXMMXXMMMAMAXMMAMAMAMXMAAXAAXMMXSASMMSSMAAAAXXAMAXXMAXAMXXXAXMAMXMAMXASAXXMSAMSMASAMXMAS +MAMSXMMSSMXXASASAAAXSMSMMMMSAMXMAMMMMMSXMMMMXXSMXXXMSMSSXSAMAMMMSASAMAXXAMXMMMMMSMXAMXMAAXAMSSMMSSSSSMXMXMSMAMXMMSXSAMMSMMSMSAASAAAXMAMXXMAM +SASMASAMAXASAMXSMSMAMASMMAAMXMXMAMAXAAXAXXMASXMMSMSAXXAAASMMASAXMASMMSXMAMMXXXAAAMMMSXSMMMXMXXXXAAMAXXAXXAAMXSAAXAAXXSASAXXAMMMMMMMXSAMXMMAM +MSXXXMAXSMMAMXXSMMXMMAMASMMSASAMXMSSMSSSMAMAMAAAAAMMMMMSMMASASXMSXSAAAXSAMXMMSMMSSMSAAAMAXSSSMSMMSMMMMMMMSXMASMSMMSMMXASMMMMSMSXSAAXSSMAXSAS +SXXAXSSMMXSXSXXMASMXMASAMAXSXMAMXXAAMAAAXXMMSSMMXSAMSAMAMXXMAMAMXASMMSMXAMXXAAAXXAMXMMMMAXXAAAXMXXAXAXXAXMMSMSXMMAMXXMXMAXXXAXMASXMMMXXAMXXX +AMXMMAMXMXMASMXMAMAMMAMMSMMMMXAMXMSSMMSMSMMMAXAXMMAMMAMASXMXMSAMMMMXXAAMSMSMSSSMMMMMMXXXMSMAMSMSAMXSMSSXSAASMMAMMAMAXAMSMMMXMXMXMMSSXMXSXMSM +MXAMMXMASXMAMAXMXXSXSAMMAXAXASMSSMMAAXMASXAMAMXMXSAMSSMASAXAXSMMSXMMSMSMXASAMAMAASAMXMMAXAAAXXAMASAAAAAASMMMASXMSSXMXMAAMASAMXSAMXXMASMXAMXA +XMSMMASAMAMXXSASMMMAMASXMSAAXAAAMXXMMMMAMMXMAXMAMXXXAAMAMMMMMXMAMASAMXAAMAMSMAMSMSAMSAMAXMSAMMASAMMSMXSMMSXSXMAMMXAXASMXSASXMASASMXSAMXSAMMS +MXAXSAMXSAMXXAMAAXSAMSMXASASXMMMMMMAAAAXMASMMSAAAAXMSSMMMXAXXAMMSMMASXMXMAMMMXMAASAMMAXXMXAMXSXMASAXXMMXMAXSMMXSASXMMSAAMXMAMASMMXAMAMAXAMAM +SMMMMASXSASMMSXSMMMAMXASMMAMXXMSASMSMSXAMXMAAXMXSXSAMXXMSSXSSMMAAASXMAASMXSAASMSMXXXSSMMMAASXSASMMMMSAMXMSMSAAAMXMAMXMMMMMSMXAXMSSSMXMSSSMSS +AAXAMXMASAMMAMAAAASMMMAMASXMXMMMASAMAMXXMAMMMSMMMASASASAAMXAMXAMXMMSAMSMSAMMXSAXAXSMMAAASMAMAMAMXAXAXSXMXXASXMXSASAMAMAAAXAMMMSMAMAAXSAAMXMS +SXMMSMMXMAMSSMSMSXXMASMSXMAMMAXMAMAMMMMMXAXAXXMASASXMAMMAMSSMMSMMAASXXAAMMMSXMMMMXXASXSMSXAMXMXSSSMMMXSMXMMMMMXSASAXXXXSSSSXSAAMASXMMMMSMAMM +MASXAXMAMAMXMAAMXMMSAMAMASXMAXMMSXMMSAMASMSMMMMXMXMAMXMSMMMAAAAMMMMMMSMSMAAXASMAXAMXMXAAXMXSXSMAAXAXAMASXXMAAMMMMMMSSSXAMAXAMSXSASAMXXXAXXMM +SAMXSMSAXASAMSMSASMMASXSXMAXSXSAMASMSAMMAAAXAAMASAXMMAXXXSMSMMXSAMASMXAAMMSSMMMSMXSAAMMMMMXMAXXMMSMMMSAMXMXSXSAXAXXAAMMSMMMSMXXMASXMASXMSSSS +MSMAMMSMSMMAMMASASASASAMXMMMMXMASMMASXMMMMMXXMSASXSMSSSMASAXXMAXXSASAMSMMSAMXAXAAMMMMSMSXSAMMMXAMXMAAMAMMAMAAMMSMSMMSMAXAAAASAMXXXXMSMSAAAAA +SAMASAXMAMASXSAMASAMXSASXMSAMAMMMAMMMASAMXSSMXMMSMAXAMAAASAMMMMSMMASMMMXMMSSXXXSSSMSXAMAASXSXAXAXAMMSSMXSSSMXMMAMAAMXMSSSMSSSSXMSMXMAAMMMMMM +AMMAMAMXMASMMMXMXMXMXXMXMASASXSSSMSXSMMAXAAAMXAAXAMMXMXXXMAMXAXAAMAMAAXSXAMMXSAAAXAMSSMMAMASASMMMMAAMAMMXAAXMAMXSSSMXAXMAMMAMXSAAAAXMMMAMAXM +SXMASAMXXMASAXAMXMASXXMAMASAMAAAMXMAXASMMMSMMMMMSSXMSMAMSMSMSAMMSMAMMMSAMMSAAMMMMMAMMMAXMMAMMMMXAAMXSAMAMXMMMSAMXXXAMXMSMMMAMAMSXMSSSSSXSMSS +XMAXAXSAAMAXSSSSXXMAMSMMMAMXMMMMMAMXMASAXXMASXXMXAAAAMAMAAXXXASAMMXASXSMXXMMMXSASXMMMSMMSMAMXAXXSSMMSMSSMMMAXAAXSSSSMSMXAAXAMXMMSAMAAASAMMAA +MSMMMXMASMXSAMXMXSXSASAASMSSSXSSSMSAMAXMMXMAXMSMMSMSXSAMXMMSXXAAAXXMXAXXMMASAASASXMSAAASAMMSSMSAAAAAMXAAASASMMSMAXAAAASMSMSAMXAAMXXAMXMXMMMS +AMASAAAAMXXMASXMAMAMASMMMAAAAAMAAAAAMAXSMSMSMMAAAXAXASASMSSXMMSMMSSMMMMMSAAMMXMXMAAMMSXSASAAMAMMSMMSSMSSMSAXMAMMMMSMMMAXXMAAMSMXSASXXMASXSXX +MAAMSAMXSXMSAMXMASAMAMAAMMMMMAMMSMSXMASXAAAAXSSMMMXMASAAAXMASAMAAAMXASAASMXMXASXSMMXMMMSAMMSMAMMMMXMAXMAAMAMMASAAAAAAXMXMASAMXAXMASXAXAASMAX +AMSXXXMXAMAMXMSAMXMSMSSSSMSAXSMMXXMASXAMMMMMMMASAMXXXMMMAMSAMMSMMSSSMSMXSSXMSXSMXSAXSXMMSMAAMXSAMXXSXMSMMMAMMMSXMSSSMSXSAMXAXXSXMSMMXMASAMXM \ No newline at end of file diff --git a/day4/src/main.rs b/day4/src/main.rs new file mode 100644 index 0000000..d9d96d3 --- /dev/null +++ b/day4/src/main.rs @@ -0,0 +1,8 @@ +use crate::task1::task1; + +mod task1; +mod common; + +fn main() { + task1(); +} diff --git a/day4/src/task1.rs b/day4/src/task1.rs new file mode 100644 index 0000000..d6af717 --- /dev/null +++ b/day4/src/task1.rs @@ -0,0 +1,328 @@ +use crate::common::{parse_input, Matrix}; +use std::ops::{Add, Sub}; + +pub(crate) fn task1() { + let raw_input = include_str!("./input.txt"); + let matrix = parse_input(raw_input); + let occurrences = find_occurrences_of_xmas(matrix); + + println!("The answer to task1 is {occurrences}"); +} + +const XMAS: [char; 4] = ['X', 'M', 'A', 'S']; + +fn find_occurrences_of_xmas(matrix: Matrix) -> usize { + matrix + .iter() + .enumerate() + .map(|(row_index, row)| { + row.iter() + .enumerate() + .filter(|(_, value)| **value == 'X') + .map(|(column_index, _)| count_from_position(&matrix, row_index, column_index)) + .sum::() + }) + .sum() +} + +fn count_from_position(matrix: &Matrix, row_index: usize, column_index: usize) -> usize { + let row = &matrix[row_index]; + [ + look_up(matrix, row_index, column_index, &XMAS), + look_right_up(matrix, row_index, column_index, &XMAS), + look_right(row, column_index, &XMAS), + look_right_down(matrix, row_index, column_index, &XMAS), + look_down(matrix, row_index, column_index, &XMAS), + look_left_down(matrix, row_index, column_index, &XMAS), + look_left(row, column_index, &XMAS), + look_left_up(matrix, row_index, column_index, &XMAS), + ] + .iter() + .filter(|is_valid| **is_valid) + .count() +} + +fn look_right(row: &[char], current_index: usize, keyword: &[char]) -> bool { + keyword.is_empty() + || keyword_matches_next_char_in_row(row, current_index, keyword) + && look_right(row, current_index + 1, &keyword[1..]) +} + +fn look_left(row: &[char], current_index: usize, keyword: &[char]) -> bool { + if keyword.is_empty() { + return true; + } + if keyword_matches_next_char_in_row(row, current_index, keyword) { + return if current_index > 0 { + look_left(row, current_index - 1, &keyword[1..]) + } else { + keyword[1..].is_empty() + }; + } + false +} + +fn look_down(matrix: &Matrix, row_index: usize, column_index: usize, keyword: &[char]) -> bool { + look( + matrix, + row_index, + column_index, + keyword, + usize::add, + |value, _| value, + |_, _| true, + ) +} + +fn look_up(matrix: &Matrix, row_index: usize, column_index: usize, keyword: &[char]) -> bool { + look( + matrix, + row_index, + column_index, + keyword, + usize::sub, + |value, _| value, + |row_index, _| row_index > 0, + ) +} + +fn look_right_down( + matrix: &Matrix, + row_index: usize, + column_index: usize, + keyword: &[char], +) -> bool { + look( + matrix, + row_index, + column_index, + keyword, + usize::add, + usize::add, + |_, _| true, + ) +} + +fn look_right_up(matrix: &Matrix, row_index: usize, column_index: usize, keyword: &[char]) -> bool { + look( + matrix, + row_index, + column_index, + keyword, + usize::sub, + usize::add, + |row_index, _| row_index > 0, + ) +} + +fn look_left_down( + matrix: &Matrix, + row_index: usize, + column_index: usize, + keyword: &[char], +) -> bool { + look( + matrix, + row_index, + column_index, + keyword, + usize::add, + usize::sub, + |_, column_index| column_index > 0, + ) +} + +fn look_left_up(matrix: &Matrix, row_index: usize, column_index: usize, keyword: &[char]) -> bool { + look( + matrix, + row_index, + column_index, + keyword, + usize::sub, + usize::sub, + |row_index, column_index| row_index > 0 && column_index > 0, + ) +} + +fn look( + matrix: &Matrix, + row_index: usize, + column_index: usize, + keyword: &[char], + row_op: fn(usize, usize) -> usize, + column_op: fn(usize, usize) -> usize, + guard: fn(row_index: usize, column_index: usize) -> bool, +) -> bool { + if keyword.is_empty() { + return true; + } + if keyword_matches_next_char_in_column(matrix, row_index, column_index, keyword) { + return if guard(row_index, column_index) { + look( + matrix, + row_op(row_index, 1), + column_op(column_index, 1), + &keyword[1..], + row_op, + column_op, + guard, + ) + } else { + keyword[1..].is_empty() + }; + } + false +} + +fn keyword_matches_next_char_in_column( + matrix: &Matrix, + row_index: usize, + column_index: usize, + keyword: &[char], +) -> bool { + matrix + .get(row_index) + .and_then(|row| row.get(column_index)) + .and_then(|character| keyword.first().map(|first_char| *character == *first_char)) + .take_if(|matches| *matches) + .is_some() +} + +fn keyword_matches_next_char_in_row(row: &[char], current_index: usize, keyword: &[char]) -> bool { + row.get(current_index) + .and_then(|character| keyword.first().map(|first_char| *character == *first_char)) + .take_if(|matches| *matches) + .is_some() +} + +#[cfg(test)] +mod tests { + use crate::common::{parse_input, parse_line}; + use crate::task1::{ + find_occurrences_of_xmas, look_down, look_left, look_left_up, look_right, look_right_up, + look_up, XMAS, + }; + + #[test] + fn test_look_right() { + let input = String::from("MMMSXXMASM"); + let row = parse_line(input); + assert!(look_right(&row, 5, &XMAS)) + } + + #[test] + fn test_look_right_invalid() { + let input = String::from("MMMSXXMASM"); + let row = parse_line(input); + assert!(!look_right(&row, 0, &XMAS)) + } + + #[test] + fn test_look_left() { + let input = String::from("MSAMXMSMSA"); + let row = parse_line(input); + assert!(look_left(&row, 4, &XMAS)) + } + + #[test] + fn test_look_down() { + let input = r#" + M + A + M + X + M + A + S + A + M + X + "#; + let matrix = parse_input(input); + assert!(look_down(&matrix, 3, 0, &XMAS)) + } + + #[test] + fn test_look_up() { + let input = r#" + M + S + A + M + X + X + S + S + M + M + "#; + let matrix = parse_input(input); + assert!(look_up(&matrix, 4, 0, &['X', 'M', 'A', 'S'])) + } + + #[test] + fn test_look_right_up() { + let input = r#" + MSMS + AXAM + AMMM + XMXA + "#; + let matrix = parse_input(input); + assert!(look_right_up(&matrix, 3, 0, &XMAS)); + } + + #[test] + fn test_look_left_up() { + let input = r#" + SMSM + MAXA + MAMM + MXMX + "#; + let matrix = parse_input(input); + assert!(look_left_up(&matrix, 3, 3, &XMAS)); + } + + #[test] + fn test_look_left_up_and_right_up() { + let input = r#" + SMSMSAS + SAXAMAS + MAMMMXM + MXMXAXM + "#; + let matrix = parse_input(input); + assert_eq!(4, find_occurrences_of_xmas(matrix)) + } + + #[test] + fn test_multiple_directions() { + let input = r#" + SMSMSASXSS + SAXAMASAAA + MAMMMXMMMM + MXMXAXMASX + "#; + let matrix = parse_input(input); + assert_eq!(8, find_occurrences_of_xmas(matrix)) + } + + #[test] + fn test_task1() { + let input = r#" + MMMSXXMASM + MSAMXMSMSA + AMXSXMAAMM + MSAMASMSMX + XMASAMXAMM + XXAMMXXAMA + SMSMSASXSS + SAXAMASAAA + MAMMMXMMMM + MXMXAXMASX + "#; + let matrix = parse_input(input); + assert_eq!(18, find_occurrences_of_xmas(matrix)) + } +}