diff --git a/crates/day_2/data/day2_input.txt b/crates/day_2/data/day2_input similarity index 100% rename from crates/day_2/data/day2_input.txt rename to crates/day_2/data/day2_input diff --git a/crates/day_4/data/day4_input b/crates/day_4/data/day4_input new file mode 100644 index 0000000..ca896ba --- /dev/null +++ b/crates/day_4/data/day4_input @@ -0,0 +1,140 @@ +XSMMXMASMXMXXMMMAMXSXXXXXMASXSMMXSMXASMMMSMXSXSASAMAAXXMAXXAXMMSAMXAMXXSMSMXMSXSSXMSMMXSMMSSMSXSAMXSXMASXMASMSMSXXXSXSSSSXMASXSSXMXSXMSMMMSX +MMASXSMXAASXSMMSXMASMMMMSXASXMAMAAXSSMAXAAMMMAMXMAMMMMMMSMXMASASXXSSMXMXAASAMXSASAMXMMASAAXXAAXMASMSAMAMASXMAAXXMASAAXAAXMASXMAXAMASAAMAXAXX +ASAMXSAMSMMAAXASAAAXAAXAAMXSAMAMMXMMASAMSXSAMAMASMMSAXAAAMXAAMXMAXSAMSAMSMSXSMXMMXMAMMASMMSMMMXSAMASXMASXMAMSMSMMSAMXMMMMMXAMAMSSMASMMMXMSSM +MMASAMAMXAMSMMASXMMMSMXAMXMSAMXMSASXMMMMXASMSMMAMXMMAMMSSSSMMMSMSMMAMXAMAAXASAMXSSSMSMMSAAXXAAMMAMAMXXXSXSXMAMXASXMASAMXAMMSSMXAXMAMAASAXMAM +XSAMMSSMXXMAAAXMAXXXXXSSXMASAMAASAMSXXMASMMXAAMXSMSSSMMAAXAAXAAAAMSSMXSSMMMAMMAMAASAAXSSMMMMMSSSMMSSSSXSAMXSASXXMASMMAXSASAAMXMMXSASXMSMSSSM +AMASAAAXMASXXMSAMXSMMAXMASXSAMSMMAMMMSMMMAXSMSSXAAAAAAXMSSSMMMMXMXAAXXMAMSSXMXXAMAMSMSMXAAAAAMAAMAXAAXXMXSASAXMASXMASXMSAMMMSAXXASXSMAXXAAAA +ASXMMSSMMXSAXSXMMASAMSMSMMASMMMASMMAAAAXMSASAAMMMMSSMMMXAAMXAXSMMMSSMXMAMAXAMASXMXAAXMAMSASMSXMMSSSMMMXXAMMSAMSAXASAMXMMSMSMSASMXSAXMAMMMSMM +XXMAAMMAXAMAMAAAMAXSXAAXXXAXAASXMASMSMSMMMAMMMSXXAXXASXMASXXSAMAXAAAAXMAMXSAMAMXAMSSMMSAXAMMXAAAAXAAAXMMMXMMAMMASMMMSAMAAXAASXMAXMXMASXMXMXM +AASMMSSSMMSSMSSMMSXXSMSMSMSSMMXMXMAMMMMASMAMSAMMMSMMMMASXMAXMAMXMMSSMMSASXSAMSSSXMAMXAASAMXASMMMXSMMMSMAXSSSSMMMMXAAMMXSSSMXMAMXMXSXAMAMMMAM +MMMSAAXXAAAXAXAXAMMMMXAAAAAAASMMAXXXSASAMXMMMASXAMASXMMXAXMXSXMXSXAMAMSXSASXMXAASMMSMSSMSXMMMMMXMSASAXXXXAXAASXAAXMSSXXMAXXAXXMAAXMMMXAMASAS +XAAMMMSMSMMSSSMMASAAMSMSMSSSMMAXAMXXMAMXMASMSAMXXSAMAXXSMMMMMAXASMMSSMSXMAMMMXSMXMMAXMAAMXMXSASAASAMASAMSMAMXSSMSSMAXMASAMXMSMSSSXMAXMAMMSAS +XMASXMXAAAXAMAXSAMMXMAXXXXXAXSMMSMMAMXMXSXSAXMMSMMMSMMMMXXMAMSMMSAMAAAXMSAMASAMXXSSMSSMMMAXXSASMXMXMSSXAAXMXAMXMXAMSSXAMAXMASAAMAASAMSSMAMMM +MMXMXSXMSXMXMSAMXSAMSMMMMSMMMSAAAAXAMXSASAMXMMAMAAXXXXXAMSSMSXAMSXMMMSMASASAMASAMXAAAXMAMMSMMMMMMMMSAMASMSXMAMAMXXXXSMXSAXSASMSMSMMAMAMMXMAS +ASASXMAMXAMXXMASAMXXAMASXMASASMMSXXASAMASMMSXMASMMMSAXMXMXAMSXSMMXSAAAMXSAMASAMXXSMMMXMSAMXMASAMAAXMASAMASMMMSMSMMXMXSAAMMMAXXMAXMMXMASMSSXS +XSAMXAMASAMAXSXMMXXXASASMSMMASXMAXSAMMSMSAASMSMSMSXAMXSSSMAMMAXAAASMSXMXMASAMXAMMMMMSAAMXMASMSXSSSSSMMMMMSAMAAXAAAAMAMXMXAMAMSMMMMSSMMMAMAAX +XMAMSXSMSXMXMAMXXAMXMMXSAAAMXMAMAXMSMASASMMSAAXXAXXMXSAAAXXMMASAMXSMXAAXSXMMXSAAAXAAXMSMMSMSXMAAAMMAMXXAXXAMMSSSXSAXXMXXMMXXXAAAAXXXAAMAMMMM +XMAMXAXXXMAXXAMMMMXAMXAMMSSMMSSMXSAXMAMAMAMMMMSMMMXXXMMXMMSXMASXMASASMMMSSMAMSASMSMSXXAXAAAMAMXMMMSAMXSSXSMMXMAXAXXXSSSMSSSMMMSSSSSSSMSSXMAX +XSAMMXMAXMMSSMMXAASXMMXSMMXMAAAXXMMAXSMSMXSAMXAAXAXMXAXSMMMAMASAMAMXMASAXAXMMXMMAAAAXMASXMMSASAMAAMASMAMXAAXMMAMMMMXMXAAAXMAMXAAMAMXMXMAMSMS +ASASAAXSXSAXAAMMXMAAAXASXMXMMSSMXMMMAMAAAMMMSSSSMSAMAXSAXAMAMXSAMXXMSMMASMMXMAMMXMMMSMASXMAMASASMXSASMAMSXMMSMXMAAMAMSMMMSSMMMMSMAMAMAMAMAAA +XXXSXSAMAMMSMMSAMMSMMMMMAAAMAMMMAXASAMXMMMAXAAMXXXXXAMXMSMSMMXSMMSXAAXXAAXMASASAMXMAXMXMAMMSAMAMAAMMSMMMSAAASMMSSXMAMAXAAAAXMASMMXSAXAXAXMSM +MMMXAXMMAMXXXAMMXAAAMMSSMMSMAMASXSMSMSMSMSSSXSMSMMMMXXMXSMAMSMMAAXMSMSMSSXSASASMSAMMXAMMXMMAXMAMMMSASAMASMXMXAXXXMMMXMSMMSMMXXXMAMSASMSMSAMX +XAAMSMXSSMXAMXSAASXSMAAAAAMXMMAMAMXSAAAXASAXMXAXAAASMSMASMXMAAXMMSMAMMMAAAMMSAMASMSXMASXAAMAMXXSXXMMSAMAXSAXSMMMXMASXXXXAAMSSSMSXMMXMMAASASX +SSSXMMXMXAMXXAXXXMMMMMSXMMSASMSMXSAMMMSMMMMMAMSMMSXSAAMAMASMMMSAMAXASAMMSSMAMAMXMMAMSAMMMSMMSXAMMMMXSAMASXMAXXAXXSAXAMXMMXSAAAAMAMXMXMMMSAMM +MAMXMMSMSXMMMMSMSAAXMAXAMXMAMAMXAMXSAXAAMMXXXAMMXXMMMMMSXMSAAXXAMMSMSXXMAMMXSMMMSMXMMASMXAAMXMAMSASXMAMXMAMMSSSMAMASXMSAMSMMXMMMAMXMASXXMAMX +SASAXSAAXXAXAXAASXMXMASMSXMAMSMMXSASASMSXSMSAMAMXMXAXMAMAASMMSXAMXAXSXXMAMSAMAAAAXXASAMXSSSMXSXXMMSAMSAXMSMAAMAXMMMMMAXXMAAXXSASMSXMAXAXSMMS +SASMMMMSMSMSMMMMMAMSMMSASXMMSMASAMMSAMAAAAAXSXAAMAMXSMAMMMMMASXMMXMMMMMSMMMASXMSSMSMMASXAAAMXAASMXSAMXSMAXMMMSAMSMMAMXMSSSSMAMASAAMMASXMMAAA +MXMXMSXXMAXXMASASXMAAXMXMAXXAXMMAXXMMMXMSMSAAMSMXSXMMMSMSAMMXSAMASXMAXMAMXSAMAMMXMAAAAXMMSMMSMMAAMMASAMMAMAAMMAXAMSMSMAAAAAMXMXMAMMMXSAAXMSS +SAXAXAAMSSSXSASASXSXSMMXSXMSSSXSXMSMMASXMXXMMMMMMMMSAAXXSASMASAMASASASMXMAMASXSAMXMMMMSSXXMASAXSMASAMAMMAMXMSSSMMMAXAMAMMSMMSSXMSMXXXSXSAMXM +SXSMSMXMAMXAMASXMAMXXAMAMAXXAMAAMAAAXAMAXAMMXAAAXXASMXMASXMMMSAMASXMASXMMXMAMAMAMMSMXSAMXXMASXMAXMXMSSMMSAMXMAXAMSXSXSSXMAXXAAXXAXXSMMAAMSAM +XMAAXXAMMSMXMXSAMXMAMAMAXXXMMMMMAMXXMMMMMMSXSSSMMMMSXSMXMAXMXSMMXSXMAMMSMMSSSXXAMMAAXMAMSMMXMASMXXXMAMAAXXMXMAMMXMASMXMASMSMMMMSMSMSAMMMASAS +SXMASXXMAAAAMXSMMSMMMXSAXMMXAAXXSASXMSAMAXAXXXAMXSXMAXMASMMMMMXMAMXSAMAAAXAXAMSSSSMSMMAMAAXASXMXMMXMMSMMMSMAMXXSAMMMSXSAMAXAAAAAAAMSAMXXMSAM +SXSXMMMXSSSXXAMAXXSAAMAMAAMSSSSMMASAASXMMSAXSXSAMXAMSAMXAXMAXXAMXSASASXSXMMSMXAXMAXMMSASXMSAMXMXMAAMXSASXASASMMSAXSAMXMXXASMMXSMSMXSASAMXMAM +MXMAMMSMMAMMMASXMMMMXSASXSMAMMAAMAMMMMMMXAMXMAMSSXXMAASXSSSSMMMSAMASAMXAASXSXMASASAXAXXSAMMXMAXAMXMSASASAMMMMAXMXMMAXSXASMMMSAMAAMXSAMXAMXMM +MASMMAAAMAAASXMAMAAMAMAMAAMXMSSMMASMMSMMAAXSMSMAMASXMSMAAAAAASXXXMAMXMMMMSAMXMMMAAMMMSMMMMMAXXSXSAXMMMMXAXSSXMMSMMSSMXMAMAAAMXSAMMAMAMSSMSMS +SASAMSSSSMSMSMSAMXXSAMXMSXMAXXAXSXMXAAAMSSMXAAMAMXMASAMXMMMXMAAMSMSSXXAMAMMMASAMXMXAXAAAMAXSSMXAMXMMXMMSXMXMASASAAAMMMMSSMMMSMMAXMXMAMMMAAAX +MXSXMXXAXMMXSASXXAXMAMMMMMSSSSMMSAXMSSXMAMMMSMSMXAMXAMXMXXXSMMSMAAXXMMXMASASXSAMMXMMSSSMMMSXAXMSMSXMASAMMSMSMMASMMSMSMAMAMXAAAMAMAASXSSMMMMM +SMMMSXXMSXSAMMXAMSSXXMMXSAAMXMXAXAXMAMAMAXSAMXAAXSMSMSASAMMAXMAMMSMAMASMMXXMASMMSSMAAMAAXMAXSMAAAMSXXMAXXAAAXMXMXMAAAMXMAMMSSSMSMSMMAAAXMAXA +MAAASMSXSAMXSAMSMMAASMXAMMMSASMASMMMASXMMSMASMMSMMAAASMSAMXMMSAMMAMSMASAASMSMXMAAAMMMSSMMXMAXXSMSMMMSSMMSMMMXXAMASMMMXMMAMXMAMAXAAXMMMMMSASM +SXMMSAMMMAMXMMXMAMSMSAMXSAMSAMMAAAMXAMMSXXMAMAAAAMSMXMASMMMXMMASXXSXMXSMMMAAXMMMSSMMAMXMXSMAMXAMMMSAMXXAAXASXSASASMASAAMASAMMMSMSMSASXAXXMAX +AXSXMMMXSAMXXXASXMAXMXXAMAMXSXMSXMSMXMXMXSMSSMMSSMMXSMAMAAMAMSAMXMMMMMMMSMMMMSMAMMAMXSASAMMASMMMSAMASAMSMMASAMAMAMXASASASMMMAAXAAMXAMXSMXSAM +AMXAXXXAXASXMXMMAMXSMSMMSSMAXXMMAXAAMSASAXAAXAAXMASAMMASXMSAMAAXXMAXAXAAAASXMAMASXSMAXAMXMSAXAAAMAXMMAXAAASMMMSMXMMMSXMMMAXSMSMXMAMAMXAXAMAS +AAMMMSMXSAMASXMSMMSAAAAAAAMAMMASMMMAMSAMMMMMSMMMSAMMSSMMMMSXSSMMMSMSMMMXSMMASXSAXMXSSMMMMMMXSSMMSSMASMMMSMMAMSMAAMXAXAXXSSMMAAAMAXAAXXMMSSXM +MSMAASAMXASAMXXAAXMMXMSMSXMMMSAAAAMAAMXMXMAXAMXXMXSAAMAXXXMAAAAXXAAAMASXMASXMMMXSAXAXASASXAXXXSMAXSMMASAMASXMMAXMMMMSSMAMAAMMMMAMXXASMXMAMMM +AAMXXMAXSAMXSMMSMSASAMXAXAMXAMMXMXSSSMXMASASAMSAMXMMSSSMMAXAMSMMSMSMSASASAMAAXAAMXMXMMSASMASMAMMMMMXSAMXSMMMAMXMSXMAAAMAMSXMASXSMMSMMMAAMMAS +SMSMSMSMSXMAXAMAASAMMSMXMAMSXSAXMAMMAMSSMSAMAMXMSMSAAAAXSAMMXMMAMMMAMXSXMAMXMMMXMAMMMXMMMMXAMAMAAASMMXXXMMASXMAXMAMMMMMAXXXMASAMXAAAASMSXSAS +XXMAAAAASMMMSSMMMMXMAAMASXMXAMAXMAXMAMXAAMXMAMAMAMMXMMMMSASXAMASXAMSMAMMSMSSSSMSAMXAMAXXAXXMSASXXAMAMMMMMXAXAMSXSAMASXSMASXSAMXMMSSSMMAMAMXS +SAMSMMMXMAAXXMAMMMMMSXSASMMMSMAMSSMSMMSMMMASASASMSMSXMAASXMMMSAMMMMXXXXAAMMAAAASAMSSSMSMXSXXSASAASXMMSASASXSMSAMSAMXSAAXMMXXXSXXAAAMAMSMSMMX +SMMXMSMMSSMSMMAXAAAAAAMXMASAXMAMAAXAMMMMASXSASASXAAMAXMXSAMSMSMSAMAMMXMSSSMMMMAMAMAAMASAAMMAXAMMMMAXXMXMAMMAMMAMMMXXMMMMXMAMXMMMMMMMAMAAAAAS +XSAMXAAXAASAASMSSMXMSXSMSMMSSXXMSMMMSAAXMSMMMMAMMMMSAMXXSAMXAXASXMASAXAAAAMXMSASXMMSMAMMMXAMMMMXASXMASMMAMSAMSAMXSASAAXXAXASAMAAAXXMXMMXMMXX +SMXSMSSMSSMMMAAMASMXXXAAAXAAXMXXAXAMMXXMXXAAXMMMXSAMASAASAMMMMXSASXSXSXMSMMMMXAAXAAXMASAMAMSAMXSXSAAXSXMAXSAXSASASAMSXSSXSXSASMSSXMMSSXMSMSM +MSAXMAMAXMMMXMSMAMXAMSMMMMMSSMMSMSSSMSSMMSSMSMAMXMASAMMMMMAMXAMSAXAMASXMAMAASMSMMMXSMMSAXSMSASMXMSXMAMMSSXSMMMAMXMAMMMMXMMXSMMMMMXMAAAAAMAAA +MMMSASMSMSASMAXMASMXMAMASAAAXXAAXAAAXAAAAMAXXAAXAMAMAMXMAXSSSSMMAMXMAMAXMMMSMAXAMSASXXMMMMAXAAXMAMAMMMAAXXSSMMSMXSMMXAMASXASAMSAAAMMSSSMMSMS +SAMXMAAXAXASMXMSAMAASMSXMSSMSMSMSSMMMSSMMSAMXSMSSSXXMMSMSXXAMXMMMMXMXSMXSAMXMAXAMMASXMXASMSMXMASXSXMAMMSSMMAXAAAAXAAXXXAMMMXAMMMSXMAAAAXAAXA +SXSAXMMMMMSMXAMXMMSASAAXMAMXAAAAXAMSXMXXMXAMAAXXAAXAMAXAMXMXMAMXAXXMMSXAMASXMAXXMMAMAMMASAXAMXAXAAAXXSAAXAMAMMSMASAMXSMSSMMSSMSAMXMSMMMMSSSS +MMMMXAMMSXMASXMAXXMAMMMSMSSMMMMMMAMSAMXAMXAMSMMMXMXSMMMMAMXSSXSSMXMMAXMASAMXMAMSASXMASMMMXMXSMMSSMSAMMMSMSMMMMAXAAAMXSAXAMAAXMAMXXXXAAXXXAAA +MAXXMXAMXAMAMMSMSMXAMXXXAMMAMXAMXMMMAMXMAXAXASASAMAMASAMXAAAMXMAXASASXXMAXMXMAXMAMXMASMMSMSAAAAMMAXMMXXAAXXSAMXSSSMMAMMMMMMSSSMMSMMSSMMMMMMM +SSSMSMSSSMMAMAAXAMSSMXAMMMSSMMMSAASXMMMXAASXMAXMAMMSAMXMAXMMMXSSMXSAMAXASMSXMMSMSMXMASAMAAMSSMMSMXMASMSMSMAXXXAMMAMSXSAMXAAAXAAAAAAMMMMAAXAM +MAAAXSAAAMSXSSMSXMAMXSMMMAAAAXAMXXMAMXAMMMXAMXXSMMMMASXMASMXMXAXMXMAMMMXMAMSAAAMXMAXAXMSXSMMXXMSAMAAXXAXAMMMSMMSSXMAASXSMMSSSMMMMMMSAASXMSMS +MSMMMSMSMMAMMAMMMSMMAXAASMSMMMSXSXSAMMSMSXSSMSXXXAXMAXASXMMAMMAMXMSAMXMAMMMSMSSSSSSSSSMSAAAXAAXMAMXSMSMSXMAAXAXXMAMMXMMAMAMAMXMASMXMMMSAMAAS +XAAAAXXMXMAMXAMAAAAMSXSMSXXAMAMAAASASXAAXMMAAXASMSMSXSAMXMMSMMAMAASASASASAXXXXMXMAAAMAAXMSMMXSXSAMXMAAAAXXMXSXMMSAMMAXAAMMMAMMXMASMXMXSMSASX +SMSMSXSMXSAMXASMSSSMMAXAXAXXMAMXMASAMXMMMASMMMMMAAAAXMMMSMAMASASMMSASASASMSMMMSSMMMSMMSMXXAMXMMSASAMSMMMSSSMMAMMMMXXAXXMSSMSXMAMMXMAMXXMXMXM +MXAXMASXMMASMMMAMAAAMSMMMXMASMSAXXMAMMSXXMAMASMMSMMMXMASAMAXXMAMMAMMMMMXMMAAAAAAAXAXAXAXASAMASXMAMXXXMAXAMAASMMAMSMMSXMAAMMAAXAMMASAMSXSASAS +SMSSMAMAMMAMAMMMMXMXMMAAAAXAMASMSAMXXASMMSMSAXAAMXAAXXXXXMASXMSMMSMMSSSSMSXSMSSSXMMSMMAMXSXXXXAMSMSMMMXMASMMMXMAXAAMAAXMMSMSXMAMSASAMSASASAM +AAAXMAXAMMSSMMAMXSXAMSSMSXSAMAMSXXAXMASAAAAMMSMMSSSMSMMMSMXSXAXAAAAXXAAAMSXMAMXXMXXXXAXSAMMMSMMMAAAAMASMMMASXXSSSSSMSSMAXXAAASAMMAMMMMAMAMAM +MSMSMSSSSXMAMSASAMSMXAAXAXSMMAMXMSMXAASMMMXMXAMAXAAXMASAMXAMMSMMSSSMMMSMMSAMXMAAMMMMMSSMXSAAAAXSSMMSMAXAASAXMMXAAMAAAAMSMMMMAMASXMAXAXAMXSSM +XAXAAMAMXXMAMMMMMXAXMSSMMXSASMSMAAAXSMMMMXAMSASMXSMMSAMMSAMXAAXXAAXAAXAMSSXMAMMMMAAAAMAMAXXSSSMXXASXMXSAMMMMSMMMMMSMMSXMAMSSXSMMMXSSSSXSXXAS +SMSMMMAMXSMSSXAAMSSSXAAAXASXAAAMSMSXMAMAXMAMMMXAAMXXMAMSSXMMSSMMMSSSXSASXMASAMMASXSMSSSMMSAXMAMXSMMAXMAMXMXAMMAXMAMAXXAMAMAMMSXAXMAXAAAMXMSM +SMAMASXMAMXAMXXSMMAXMMMSMXSXMXMMAAAXXMSMSSXXAMXMXMASMSMAMMMMAXAXXXXAXMMMASAMAXSASMXMMXXAXMMMSSSMMASXMASMMXMSSSSXMASXMXXSAMXSAMSMSSMMSMAMSMAA +XMAMASAMASXXSAMXAMMXAXAAXAMMSXMMMAMMXMAXXAMSAMXXAMMSAAMAMAXMASMMMMMSMMAMXMASXMMMMXXAXAMSMMXMAAMXXASAMMMXMAMAMXAASASAAMXSXSAMAXXXAAXAXSAAAMMX +XXMMMXXMXSAAMMMSAMXMXSMSSXAAMAMXXAAAAMXSMMMSASASXSAMMMSSSMSMMMXAXSMMASMSSMMAMXSSMMSSMXMAAMMMMSMXSAXMMXSAMXMSSMMXMASAMMAMAMAXSMSMXSMSXSMSSSXX +SMSASMMSMMMMMAAXAMMSASMAMXMASMMASMSSSMSAMXASXMASAMXXAXAMAXAAXXSMMSAMAMXAXXSASAAAAAAAMXSMSMAAMAAAMXMSAMXAMXAMAXMXMXMMMMXXAMMMMAXMAXMMAXXAXMXM +XAMASXAAAAAAMMMSAMAMASMAMAXMAXMXMAMAAXSASMMSASAMXMAMMMSSMMSXMMXMASXMASMAMXXAMMXSMMSSMMMMAXSSSXMMSXXMASXMMSXMAMXAMMMMMASXMMAAMAMMAXAMMMMSXMAA +MSMAMMSSSSMMMAXMMSMMAMMSXMXSAMXMSMMSMASAMAXSAMXSXMAMXAMAMXXMAAAMASASASMAXSMSMSAXAAAAAASXSMMAMXSXMMXSAMXSAMAMSMSASASASXMASAMMXSAMXMMMXMMMASAS +AAMSMAXAAXASMSSMASAMMMMXAXXSXMAMMAAASMMAMSXMASMMXMASAASAMSXASXXMASXMASXMXSAMAMASMMMSMMXAAAMAMMSAXAXMASXMASMSAAAAMAXMMAMAMASAAMMXSXXAMXAMMMAX +SMSMMSMMMMMXAAAMAXXMAAAMXAMXAXAMSMMMAXSAMXMSAMAMAAAXMAMAXMXXXXSMMSASAMXMAMXMXMASMSXXMMMSMMSMSASXMSXSAMASAMXAMAMAMSMSSSMASAMMSSSMXAASMMSSSMMM +XXSXAAAMAAXMSMXMAXMMSMXXAMAXSSSXSXMXXXSXSAXMMMXMXMAMSASMSMMSMXSXASAMXMXMASXMXMASAXMASXXAAMAXMAMASXAMMXAMASMSXXMXAXAMAAXAMASXAAAXXMAMAMAMAASX +MXXMASMSMSMMXXXMSMSAXAAASMSMXAXAMXMMMMMSMMSAMSMXXXMASASXAAAASAMSMMMSASASASAMXMAMXMXAMMMXMMAMMAMXAMMMSMMSXMMXMXMXSMSMMMMXSXXMMSMMAXXXXMASXMMS +AXXXAXXAMAXXMAMXAAMAMMMMXAXMMMMSMMMAAASAXASAMAMSMMAMMMMMMMSSMXXAXAASASASASAMAAAXASMSMSSSSMSASMXAMXXAXMAXASXAMAXAXMAAXXAXAXMAMXXMMSMSMSASASAS +MMMSMMSSMSMSMSAMXSMSMMXXSAMXMAAAAMSSMSMMSXMXSASAAAMXSAMXXAMXAMSMSMXMAMAMXMXXXSMSMXAMASAAAAAXMMSSXMMXSMMSMMSMSASMMSMXXMSMASASXMAXXMAAMMMSAMAS +MAXAAXXASAAXXXMAMXMAMXMASMXXSXSSXMAMSMAAMAMASMSAXMSAAMXMASMMXMAXXXXMAMSSMSMMMXMAXMAMXMMMMMMMSAAAAXXMMMMAMXAMXMXMAMXMMXAXAXMXMMMMMMSMMAMMXMXM +SXSSSMXMSMMMMSMMMSSMXSAMSAMXMMMMMMASASMMSAMMSASASXXMMMASAAAAMXXMMMXXXAXAAAAXAASASMXSAMXSMXXAMMSSMMSXMASASMMSMASMMMAAXSMMSSMMSAMAAMAMSXSXMMSM +MMMXAXXXXXXAAAXAAMXXAMXXMMAAMAAAAXMMMSXMSASAMMMAMMAXXSMMSXMSSMASAAMAMASMSXMMSAMMSMXSASAMMMMMSAAAAAMASAMXMAMXMAAAASMMMSAAAAAASAXSXSAMAASASAAX +MASXMMMMMAMMMMXMSSSMXXSAMXXASMXXSSSXAXMASXMASXMMMSSMXMMMMSMAAXAXXXAXMAMXAXMMMMSMMMAXMMMMAAMXMMSMMMSAMMSSSSMAXAMSMXASASMMSSMMSMMMASMMMMSAMSSS +SASXMAXAXMASASAMXAAXAMMSSSMMXMAXXAMXXAXXSXMASXMAAAAXAAAXSAMSSMSSSSSXMASMSMSAAAAAAMMMSAMSSMSAXXAMXAMMSAMXAAMXSMXMAXMMMSAMAMMAMXMXAXMAXXMMMAMX +MASXSSSSXMAXAXMMMMMMMSAAMXMSAMMMMAMAXMSXSAMASMXMMSSSSXMSSXMAXAXAAAAMSAMXAASMMSSSXXSAMAMMXASXSMMSMASMXMSMSMXMAMSMMXSAXXXMASMASAMMXMASMXMASMSS +MSMMXMAXMMSSSSSXSAXAXMMSMXXXAMXXSSMMAXMASAMXSAMXMXAMAASXMXSSMXMMMMMMMASMMXMXMXMAMXMMSSMMMMMMSAAMMMMMAMAAAAMXAMXAAAMSSXMXAMXAMAMAMMAMXASASXAX +XAASAMXMXAAXXAAASXMASMXMAMSSMMSMMAASXAMAMASMSAMXMMSMSMMAAASAMXMASAASXMMXMASAMXXMASMMAXAAAXAASMMSAXASXSMSMSSMAMSMMMSAMXSAMXMSSSSSMMSASMMMSMSS +SSSMMXAXMMMXMMMMMMAAXMAMMMAAMAAAMSMMSXMASAMXSMMXAAAXMAMMMXSAMXSASXXXAXSSXAMXXSAMXMAMMSSSSSMXMSASXMXMAAAXMAAXAMXXAXAMXAXAMAXMAXMAAMXAMXAAMMMS +XMMAXSMSMAMSMSAMASMMAMMSXMSSMXSSMXAXAXMAMASAMMSAMXXSSSXXSASXMXMASMXSMMAMMSSMXSAMSSMMXAMXAMMMMMMMMSMMSMMMMSMMXAXMMSMXMMSSSMSMMMSSMMMAMSMMSAAM +MAMMMMXAMXSAAXASASAASXXMMMMAMXAAMSMMMMMASAMASASAMXSMAXXAXMMXMAXXXMMAXMAXXXAMXSAMAAXSMSSMMMAAXASXAAXXAAXMAXXMASMMMAMXAAXAMXAMXXAAAMXMASXAXMXS +MMMXAMSASXSMSMMMAXAMXSSMAXSAMMSMMAAAXAMASAMXMXXAMXAMAMMMMXMAMMMMASAMXSXSXSAMXSMMSSMMAXAASMSXSASMSMSXSSMMASASAAAASASXSSXMMSXXSMXXMMSAMXMMSSMM +SAXXAMXXXAMAAASMSMSXAAXSAXMASAMXSMSMSXSAMXSXSMSMAMMASXXAAAMXSAASXMMMASXMASXMAMXMAAAMXMMMMAAXAAMAAXXAMXAMAXMMSSSXSASAAAAXMASXMSSXAXASXMAXAAAA +SASMXMMMMMMSSSMAAAXMMSMMMXSAMXSASXMXAXMAMAMAXXAXAXXXMASMSMSAMXXMASXMASAMMMAMXSAMSSMMSXXSMMMMMSMSMSSMMSSMMMAAMXMAMXMAMMSXMAXSAAXMASAMXAXXXSMM +MAMXAAAMAXXAXAMXMSMXXAAAAMMXSXMASMMMMMSAMAMSMSSSMMSAMXMMAAMMMMMSMMMMSXXAMXXMASMMAMAMXXXSAMXMXMAMAMAMXAMASAMXSAMMMMMAXAXXXAXMMMSXMSXMASMMAXAM +SAASXSSMSXMXSXMXXXMMSMSMXSASMMMAMAAXMASXSXMMAXAAAASAAAXMXMMXSAMAMXASAMASXSAMASXMXMXAMXMSAMAASMSMXSAMMAMAMAMAMMMAAMSSMMSSMMSAMAXAXXAAAXAMAMAM +XAMXXAMXXXSAMASMMASXAMAASXMMAAMAMMMMMXXMXMMMSMMMMMSMSSSMSXXAXASXSSMXAXAXXXXMASXMASMMAAXSAMXMSAAXXMMMSMMSMSMSSSSSSMXAAAMAAASAMSSMMSXMASXMASXM +XSMSAMSAXAMXSAXASAXSMMSXMASMSMSSSMSSSSXMAAXAAAAXMXMXAXAMXMMMSMMAAXXSMMMSMMSSMMAMAXASXMMSAMMAMMMMMMXAXMAXAAAXAXXAMAMMMMMMMMSXMMAAAXAMAXMAXAMM +AAAXXXMMSMXMMXSMMMXXXAMASXMAAAXAAAAAMAASMSMSXSMSMAMMMSMSSSXMAXMMMMXAXAAXXAAAASXMSMMMAMASMMAASASAAMMMSMMSSMXMXMMSMSAMSXMXAMXXMSXMMSXMXSSMXMSS +SMXMAXXAAMAXAAMMAMXMSMSAMAMXMMMSMMMSMMMMAAAMXXAMMASAMXAAAAXMAMSAAXXMSMSMMMSMMMXMMAASXMASASMMSASXXMAXAAMAMMXSXMAAAMAMXAXSAMMSMAMSMSXMMAAAXSAM +AXMMMSMSASMSMASMMSXAAAMMXAMXMSMMXMMAMXMMSMMMAMAMMMSMSMMMXMSMASXSMSMXAMAAAMAMSXMASMMMAMASXMAAMMMXSSXSSMMASMASAMMMSMMMSAMXAMAAMAXAASAMXMMXMMAS +MMSAMAAMAAAXAAXXMAMXMSMSSMSASAMXASMMSXSAMXSMASAMAAMAMXXXAAAMXMXAXMASMSSSMSAXMAAXMXMSXMXXXSMMMXAXMMAXAXSAMMMSAMSAMAXXXXMSSMMSSSSMXSAMAXASMSAM +SXSASMSMSMMSMSSSMSSSXAMXAAXMXMASMSAAAAMXMMXMAMAMMMXAMXASMSMMXSSMMSAMXAAAASXSSMMMMMAXXSMMMMMMXMASMMSMSMMASXMSAMMASXMMMXMXXAXMAMXXXSAMXSASAMXS +XASAMAXXXAXXAXAAAAAXSMSMSMSXSXXMASMMMSMMASAMSMXSAMXMSMXAXMAMAXAMAXAXMMSMMMAAMAAXAAXXASXMAAASASAAXAXAXAXAMMMXAMSMMMAAMXSXMXMMAMSSXSAMMMAMXMAS +MXMAMMMMSXMASMSMMMMMMXSAMAMXSAMXXMAXXAXMAMMSAAMMMSAMXMSMXSAMMSAMMSAMXXMXSMXMSSMSXXSSXSAMSSMMAMMXMASXSMMASASMMMAAASMSXMSASAXXAMAXMSSMAMAMAXMM +AAMXMAAXXASXMXMMXSAAXAMMMSMMXAMXMASXSAMMASMMMSMAAMMMMXAAAXASXSMMXSMSSSMAXXAXXAMXXMXMASMMMAMMAMXSAAAXAXSMXMXAXMXXMSXXAASAMXXSAMXSAMXSASASXMMM +SMSSSSSXSAMAMAXMAMMXMMXSAAAASAMASMMASAXSASASAXMMMXSAMMMSMSMMXMAXAMSAAAMSSSSSMMMAMMAMXMXXSAMSSMAXMAXXAMXMSASMMMSMAXASMMMAMAMMASAMMXMMMSMMXAAM +AAAAXAMMXMSAMASMSSSMAXAMSMSMSAMXXAMAMXMMASAMMXSMMAMASAAAXAMSMSSMSSMMXMMMXAAMXAMXMMMMMAMMMAMXXMASXSMMMAXSAMAMAAAAAMXMAXXAMXMMAMXXAMSAMXMSSSMS +MMMSAMXSAMXMAMXMAAMMXMAXAXMXSXMASAMXXASMMMAMSAMAMMSASMSMSASAAXAAXAXSAMXMMMMMSXXAMSMMSASXSSMXMAMMAAAASXMXSXMXMXMMMSSSMMSSSMSMSSSMSMSAMMAXAAXX +XSXMMSASASXMMXAMMSMAAMMMXMXAMAMXMXMASMXAMXSMMASXMXMAMAMXSXXMSSMMMMAMMXAAXAMASAMXAAAXSASXAAAAAAAMSMSXSASAMXXMMXSAAXMASAMXAMXMAAAAMMSAMMSMXMMX +AMAMAMASAMAASMXXAXMSXSAXAMSSMAXSAMXXAXSXMAMASMMXMASAMAMAMMXXXMMAMXASXSASXSMASMASMMMMMMMMAMSMSSMXXXXAMAMXXXAXAASMMMSAMXXSXMAMMSMMMAMAMAXASXSS +AMAMAMXMMMSMMASMASAAAMXMSXAASXMMMMXMXXMASAMAMXXSMXSXSAMASMSMAMXAXSMSASAXAXMXMXMSASAMAAXXAXAAAXMSMSMSMSMSMSMMMMMAAXXXSMMSASXSAMXXMXSAMMXMMAAX +MSMSSSMMSMAMMAMMAMXMMMSXXMSMMSXSAAASAMSAMMMAXMASXXMASASAAAASAMSSXXXMAMAMSXSMSSXMAMASXSMMXSMSSSMAAAAAAAAAAXAAXXSSMSMAXXASXSXMASAXSAMMMXSAMMMM +MAXAAAAAAMASMXSXSMMAAAMAXAXMAXMSMXMMAXXXMSASASASAAXXXAXMMSMSMMAMXMSMMMSMXAXAMXAMAMXMMMAAMMAAAAXMSMSMSMSMXSXMXAMXAAAMMMXSASAMXMAAMASMAAMAXAAA +SSSMSMMXXXAMMAMMAMSSMASMMMMMAMMXSSSSMMMMXAMXASASAMXSMMMXAMASMMMSAAAAMAAAMSMSMAAMSXSAASMMSMMMSMMXMAMXAXXMASMXAMXMMMASXAAMASXMXMMMSAMMMSXSSSXS +AMAAAASXSMSSMMSAMMAXMXSAAMSMSSXAAMMASAXMASXSAMMMXMMXAMSASMAMMAXXXMXMMXMXAXMXAMXXXASMMAMAXAXAXXXXMAMSMSAMXSAMSSSXXSAXAXXMAMMAAXXMMASXXXAAXXMM +SSMMAMMAAXMAXAMXXMASMXXMXXSAASMMMSSMMXSXAXAMXMASXSXXXMAAXMASXXSXSSMSMSAMXMMSXMMSMMMSMMMXSMMSSMSMSSMMXSAMMMXMAAAXXMMXSSMMASMSSSMASAMXAMMMMSAA +XAMMSSMXMMSMMMSMSXAAXMXMMMMSMXXSAXAXMASMSMXMASAXMXAMSSMMMSAMXAMAXAAAASXSAAAXAAAAAAAAMXMMXMAXAAMAAMAMXSAMSASMMSMMXAAAMAXSAXXXAAMAMASMAMSAAAXM +SAMAAMXXMXXXAXAAXMMSAMASASAMXMAMXSSMSXXAAAASXMASMMXMAAAMXXASMMMSMMSMXMAXMMMXSMSSSMSXMAAMAMMSMMMMMSXMXMXMMASXMXXAXAMMSMMSSSMMSMMSSXXXAXXMSSSX +SSMMMSAMXSXSSSMSMSAXASASMMMXAAMXMMAASXMSMXMMAMAAXAAMSXMXXXMSASMXAXXASMSMASXAXAMXAAMXSSXSAMXAMXXSAMASMXMMMAMASXSSSMXAAXXXAXAAAXAMMMMSMSMAAAXX +SXSAMXMMASXMMXXAAMASAMXMMSSMMXSAASMMMAMAAASMSMSSSSMXMASMMMXSAMMSSMSAMAXSAMMMSAMXSMSXXAASAMSAMSMMASAMXAMXMAMAMXAAAXXSXMSAMMXSAMXMAAAAAAMXMMMM +SAMMSASMAXAMSSMMSSMMAMAXSASASASXMXXASMMMSMSAAAMMAAXMSAMAAAMMSMAAXASAMXMMXSXXSMMMXAXXMMMMMAMAMAXSMMMSSXSAXMMSMSMSMMMXMSXAXSXMMAXSSMSMSMSMMXSA +SASMSASMMSAMASAAXXASXMMMMASXMASMAMSMMMSXXXMMMMMXSMMMMMSSMSAAMSMXSXXMXSMAAXMMMAASMMMAXMMAMMSSSXXXAASMMASASXAAAMAMAMAXMSSXMASMSMMMMAAAXMXMAAXX +SAMXMXMXMAMMASMMMSMMMAMSMMMAMAMAAAAXAAMXMXMAMXMAAAXXAAAAAMMXMXMMXMASAMXMXXXAXXMSAAXMSAXXMXSAXXXSMMXAMXMAMMSMSMAMAMSSMXXMASXMASAMMSMSSMAAMMSA +MAMMMSXXSMXMXXXSAXAASAAAXAXAMXSSSSSSMMSAAXSASAMMSMMSMMXMMMXMXAMMAXAMMXAMSMSSSMXSMMSXXAXSXMMMMSXAAASMMMMSMAXAMMASAMXAXAMXMAXSASMSAAXXAMMSMAMM +XMMSAAMMAXXAMXMMXXXMMAXASXSMSMMMMAXMXAMAMXMXSAMXMAMXAASMXXXAXMAXMMSSSMMXAAAAAMAMAMXMMXMSAXMSAMSMMMSAAAAAMMMAMXAMAXXAMMSMSSMMXSAMMSSSMMXAMASX +MSAMXSAAMMSSXASMMSSSXMSMAAXMAMAAMMMMMSMSXSMXMMMMMAMSXMSAAASXSSMMAMAAMASMMSMMMMXMAMAMAMMSAMXMAXAMSASMSMSSXXMXMMSMSMSSMXAMAAASASMXMXAAAASXSXSM +AMASXMMSXASXSMSAAAASAAAMMMMSASAXXAASAXAMASMSXAXXMAMAMXXMMMXAAAASAMMSMAMAAXXSMASXMMMSMMAMXMASXMAXMAXXMAXAMSSSMAXAAAMAMSMMSSMMXXXXMASMMMSXMAMM +XSXMXAAXMXMAMSSMMMXSMSXSMAAMASAMSSXSAMXMXMASXMMMSMSMASXSXXXMMMMXASXMMXXMMMAAMAMMSAMAAMAMAMXSXMMMSMSMMSMMMAAXMASMMMMMMMAAAAXSMSMXSAMXAXXAMAMM +XMMMSMMSXMSSMAXXXXXXAXMAXMSSMMMMAMAMXMXMSMMMMSSMAXAASAAMSAMXXMXSASAMASXASMMMMXSASASXSSMMSSMMMXSMXAAXAAAXMMSMMASAXXMXMSMMSSMMAAAAMAXSAXSXSMSS +SAAXAMSXMXAMXXSXMMSMMMMSSMMAMXMMXSMMMXXXAAMMAAAXMSSSMSXMASXMASXAXXAMAMXAMAAXMMMAXAMXMAMAMAAXSASMMSMXXSSMXAAMMASAMMMMMAMXAMAMSMSMSMMSMMSAMAAX +SSMSSXSAMMXXAMMAXMAAAXSAAASXMSXSMSAMSAMSSMMMMXSMXAXXAXMXXXMXAAMMSSMMASMMSSMXXAMMMSMMSAMXSSMXMASXAAXSXXMMMMMXMAXXXXAAXAXMMMMXAXAMXAAMAAMAMMMS +MAMAMMSAMSSSMASAMSMSMSAASMMMASASASAMMAXAAXXSMAMXMAMMAMMSMSAMXMAXAAASAXAMXAAASXXAXAAAMASAXMASMAMMSMSAMXAMXMAXMSMMMSSSSSSMMASXMSXSSMMMMMSXMAXX +MSMXXAMAMAAASAMXXXMAMMMMMAXMAMXMAMMMSMMSSMXXMASAXAMSAMXSAMASXSSXSXMMMSXMSMMMAMSMSSSMSXMAMSMSMAMMAMXMASMMSAXSAAAAAMAMAAAMSMSAMAAMAXMASMSMSSMX +MXSSMXMAMMSMMMXSMMSASAAAMXXMASAMXMXAMSAAMAAMMMSAMXXXASAMMSAMMAAAMSXMMAMMXSAXXXAMXAAAAXMSMAXXMSSMXSAXMAAXMAMXMSSMAMAMMMMMAASXMMXSAMMAMAXAAAAS +MSAMXXSASXAMMMXMAXSASMSSSSXSASMSMSMMSMMSXXXAAMXMASMMXMASAMMSMMMAMAXXMASMAMMASMXSMMMMMAMASXSXAMAAMMMMMMSXMXMAXMAMXSASAMASMMMASMASXSSSMMMMSSMS +MMAMAXXAMXXSAMAMSMMMMAMAAAAMXSAAAMSXAXMAMXMMMXAMXMAMAXXMASXSXMMXSMXMAMXMAMXAMAMAMSMXXXSMSXSAMSMMMAAASXXAMMAMXSMMMSMSASASMMSAMMAMMMAAXSAMAAAX +XSSMXSMSMMMSMXSMMXAAMAMMMMMMMMMMXXMMMMXAAAAAMMMXAXAMXMMXAMXMXMAASXSSXSXSXSMXMAAXXAMXMXMXMASMMAAMSMSMSASXMASMMAXXAMASAMMMAAMASMASMMSMMSASMMSM +AMAXMAXAAAAXAAXAMSSSSXSAMXSAAMMSMAMSXMSSSSSXSASAMSASXMSAASAMASMMXAAAASAMXSASXSSSSXXASAMSMMMAMXSMMAXAMAMXMAXAXMSMSMAMAMASMMSAMXASAMXAASMMXMAM +ASAMXMSSSMSMMASAMXXXAAXXMASXXSAASAMAAMXAAAAASAMAMSAMXAMSMSASASAMMSMMMMAXAMSMAMAXXMSMSASAAXSSMMMAMSMMMAMXMASAMXAAAMXMASAXSAMXSMMSAMSMMSSXAAMS +XSXSXXXMXAXMSMSMMSMMMMMSMMSMSMXMSXSSSMMMMMMMMSMXMMSMMMMMXSXMASAMXMASXSXMXSAMMMXMAXAASXMXSMAMAXSAMXMASMSAMXSMMSMSMSSMXMASXXSAMXMSMMSAMXXSXSXA \ No newline at end of file diff --git a/crates/day_4/data/day4_test_input b/crates/day_4/data/day4_test_input new file mode 100644 index 0000000..c41c5ea --- /dev/null +++ b/crates/day_4/data/day4_test_input @@ -0,0 +1,10 @@ +MMMSXXMASM +MSAMXMSMSA +AMXSXMAAMM +MSAMASMSMX +XMASAMXAMM +XXAMMXXAMA +SMSMSASXSS +SAXAMASAAA +MAMMMXMMMM +MXMXAXMASX \ No newline at end of file diff --git a/crates/day_4/src/day_4.rs b/crates/day_4/src/day_4.rs index 4c90ded..b73e9f4 100644 --- a/crates/day_4/src/day_4.rs +++ b/crates/day_4/src/day_4.rs @@ -8,6 +8,7 @@ * @brief Advent of Code 2024 day 4 problems ******************************************************************************/ +use crate::word_grid::WordGrid; use ::solver_base::solver_base::{Solver, DataSet, RunMode}; use utils::utils; @@ -16,6 +17,7 @@ pub struct Day4 data_set: DataSet, run_mode: RunMode, do_debug_prints: bool, + word_grid: Option, pub final_result: i32, } @@ -26,19 +28,26 @@ impl Day4 { pub fn new() -> Day4 { - Day4 { data_set: DataSet::Test, run_mode: RunMode::FirstCase, do_debug_prints: false, final_result: 0 } + Day4 { data_set: DataSet::Test, run_mode: RunMode::FirstCase, do_debug_prints: false, word_grid: None, final_result: 0 } } fn solve_first_case(self: &mut Self) -> String { - + if let Some(word_grid) = &mut self.word_grid + { + self.final_result = word_grid.find_word("XMAS") + } + self.final_result.to_string() } fn solve_second_case(self: &mut Self) -> String { + if let Some(word_grid) = &mut self.word_grid + { + self.final_result = word_grid.find_x_mas(); + } - self.final_result.to_string() } } @@ -66,13 +75,20 @@ impl Solver for Day4 DataSet::Test => format!("{}/data/day4_test_input", dir), DataSet::TestAlt => panic!("Day 4: There is no TestAlt input file!"), //format!("{}/data/day2_test_input", dir), DataSet::Full => format!("{}/data/day4_input", dir), - //DataSet::BALLS => panic!("BALLS"), }; - let _data = utils::load_data(&data_filename); + let data = utils::load_data(&data_filename); - // TODO: Day4::init + self.word_grid = Some(WordGrid::new(&data)); + + if self.do_debug_prints + { + if let Some(word_grid) = &self.word_grid + { + word_grid.print(); + } + } } diff --git a/crates/day_4/src/lib.rs b/crates/day_4/src/lib.rs index d5217ed..3d38bc6 100644 --- a/crates/day_4/src/lib.rs +++ b/crates/day_4/src/lib.rs @@ -1,2 +1,3 @@ -pub mod day_4; \ No newline at end of file +pub mod day_4; +pub mod word_grid; \ No newline at end of file diff --git a/crates/day_4/src/word_grid.rs b/crates/day_4/src/word_grid.rs new file mode 100644 index 0000000..6f95f50 --- /dev/null +++ b/crates/day_4/src/word_grid.rs @@ -0,0 +1,271 @@ + + +#[derive(Copy, Clone, Debug)] +struct IdxPoint +{ + i: usize, + j: usize, +} + +impl IdxPoint +{ + fn new(i: usize, j: usize) -> IdxPoint + { + IdxPoint { i, j } + } + + fn offset_by(self: &mut IdxPoint, offset: Point) -> IdxPoint + { + self.i = ((self.i as i32) + offset.x) as usize; + self.j = ((self.j as i32) + offset.y) as usize; + *self + } + + fn new_with_offset(self: &IdxPoint, offset: Point)-> IdxPoint + { + let i = ((self.i as i32) + offset.x) as usize; + let j = ((self.j as i32) + offset.y) as usize; + + IdxPoint {i, j } + } +} + +#[derive(Copy, Clone, Debug)] +struct Point +{ + x: i32, + y: i32, +} + +impl Point +{ + fn new(x: i32, y: i32) -> Point + { + Point { x, y } + } +} + + + +#[derive(Clone, Debug)] +pub struct WordGrid +{ + grid: Vec> +} + +impl WordGrid +{ + pub fn new(input: &str) -> WordGrid + { + WordGrid { grid: parse_input(input) } + } + + pub fn print(self: &WordGrid) + { + print!("Word Grid:"); + for row in &self.grid + { + println!(); + for c in row + { + print!("{}", c); + } + } + println!(); + } + + + pub fn find_x_mas(self: &WordGrid) -> i32 + { + + let neighbor_offsets = get_x_neighbor_offsets(); + let mut num_occurrences_found = 0; + + for (i, row) in self.grid.iter().enumerate() + { + for (j, c) in row.iter().enumerate() + { + if *c as u8 == b'A' + { + // First make sure all four neighbors exist + // TOP LEFT + let top_left = IdxPoint::new(i, j).offset_by(neighbor_offsets[0]); + if !self.has_neighbor(IdxPoint::new(i, j), neighbor_offsets[0]) + { + continue; + } + + // TOP RIGHT + let top_right = IdxPoint::new(i, j).offset_by(neighbor_offsets[1]); + if !self.has_neighbor(IdxPoint::new(i, j), neighbor_offsets[1]) + { + continue; + } + + // BOTTOM LEFT + let bottom_left = IdxPoint::new(i, j).offset_by(neighbor_offsets[2]); + if !self.has_neighbor(IdxPoint::new(i, j), neighbor_offsets[2]) + { + continue; + } + + // BOTTOM RIGHT + let bottom_right = IdxPoint::new(i, j).offset_by(neighbor_offsets[3]); + if !self.has_neighbor(IdxPoint::new(i, j), neighbor_offsets[3]) + { + continue; + } + + // Check that they contain valid values + if self.grid[top_left.i][top_left.j] as u8 != b'M' && self.grid[top_left.i][top_left.j] as u8 != b'S' + { + continue; + } + + if self.grid[top_right.i][top_right.j] as u8 != b'M' && self.grid[top_right.i][top_right.j] as u8 != b'S' + { + continue; + } + + if self.grid[bottom_left.i][bottom_left.j] as u8 != b'M' && self.grid[bottom_left.i][bottom_left.j] as u8 != b'S' + { + continue; + } + + if self.grid[bottom_right.i][bottom_right.j] as u8 != b'M' && self.grid[bottom_right.i][bottom_right.j] as u8 != b'S' + { + continue; + } + + // Check that the diagonal corners have opposite values + if self.grid[top_left.i][top_left.j] as u8 == self.grid[bottom_right.i][bottom_right.j] as u8 + { + continue; + } + + if self.grid[top_right.i][top_right.j] as u8 == self.grid[bottom_left.i][bottom_left.j] as u8 + { + continue; + } + + num_occurrences_found += 1; + } + } + } + + num_occurrences_found + } + + // Returns the number of times the given word was found in the grid + pub fn find_word(self: &mut WordGrid, word_str: &str) -> i32 + { + let word: Vec = word_str.as_bytes().into_iter().map(|x| *x).collect(); + let neighbor_offsets = get_neighbor_offsets(); + let mut num_occurrences_found = 0; + + for (i, row) in self.grid.iter().enumerate() + { + for (j, c) in row.iter().enumerate() + { + if *c as u8 == word[0] + { + for n in neighbor_offsets + { + let neighbor = IdxPoint::new(i, j).offset_by(n); + if self.has_neighbor(IdxPoint::new(i, j), n) + { + if self.search_direction(neighbor, n, &word, 1) + { + num_occurrences_found += 1; + } + } + } + } + } + } + + num_occurrences_found + } + + fn search_direction(self: &WordGrid, start: IdxPoint, direction: Point, word: &Vec, next_char_idx: usize) -> bool + { + if self.grid.len() <= start.i + { + panic!("i is out of bounds"); + } + + if self.grid[start.i].len() <= start.j + { + panic!("j is out of bounds") + } + + if next_char_idx >= word.len() + { + panic!("next is out of bounds") + } + + if self.grid[start.i][start.j] as u8 == word[next_char_idx] + { + if next_char_idx == word.len() - 1 + { + return true; + } + + let next_idx = start.new_with_offset(direction); + if self.has_neighbor(start, direction) + { + return self.search_direction(next_idx, direction, word, next_char_idx + 1); + } + } + + false + } + + fn has_neighbor(self: &WordGrid, at: IdxPoint, offset: Point) -> bool + { + let neighbor_i = at.i as i32 + offset.x; + let neighbor_j = at.j as i32 + offset.y; + + neighbor_i >= 0 && + neighbor_j >= 0 && + neighbor_i < self.grid.len().try_into().unwrap() && + neighbor_j < self.grid[at.i].len().try_into().unwrap() + } + +} + +//||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| +// HELPERS +//||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| +fn parse_input(input: &str) -> Vec> +{ + let mut grid: Vec> = vec![]; + for (i, row) in input.split("\n").enumerate() + { + grid.push(vec![]); + for c in row.as_bytes() + { + grid[i].push(*c as char); + } + } + + grid +} + +fn get_neighbor_offsets() -> [Point; 8] +{ + [ + Point::new(-1, -1 ), Point::new(0, -1), Point::new(1, -1), + Point::new(-1, 0 ), Point::new(1, 0), + Point::new(-1, 1 ), Point::new(0, 1), Point::new(1, 1), + ] +} + +fn get_x_neighbor_offsets() -> [Point; 4] +{ + [ + Point::new(-1, -1 ), Point::new(1, -1), + + Point::new(-1, 1 ), Point::new(1, 1), + ] +} \ No newline at end of file diff --git a/src/main.rs b/src/main.rs index 0ce3638..a915d6c 100644 --- a/src/main.rs +++ b/src/main.rs @@ -10,6 +10,7 @@ use day_1::day_1::Day1; use day_2::day_2::Day2; use day_3::day_3::Day3; +use day_4::day_4::Day4; use solver_base::solver_base::{Solver, DataSet, RunMode}; fn main() @@ -25,6 +26,8 @@ fn main() let day1_result = day_1.solve(); println!("Day1 Part 2 Final Result: {}", day1_result); + println!("-------------------------"); + // DAY 2 let mut day_2 = Day2::new(); @@ -37,6 +40,8 @@ fn main() let day2_result = day_2.solve(); println!("Day2 Part 2 Final Result: {}", day2_result); + println!("-------------------------"); + // DAY 3 let mut day_3 = Day3::new(); day_3.init(DataSet::Full, RunMode::FirstCase, false); @@ -48,4 +53,19 @@ fn main() let day3_result = day_3.solve(); println!("Day3 Part 2 Final Result: {}", day3_result); + println!("-------------------------"); + + // DAY 4 + let mut day_4 = Day4::new(); + day_4.init(DataSet::Full, RunMode::FirstCase, false); + let day4_result = day_4.solve(); + println!("Day4 Part 1 Final Result: {}", day4_result); + + let mut day_4 = Day4::new(); + day_4.init(DataSet::Full, RunMode::SecondCase, false); + let day4_result = day_4.solve(); + println!("Day4 Part 2 Final Result: {}", day4_result); + + println!("-------------------------"); + }