diff --git a/src/day05/input.txt b/src/day05/input.txt new file mode 100644 index 0000000..f4c16be --- /dev/null +++ b/src/day05/input.txt @@ -0,0 +1,1364 @@ +48|18 +22|59 +22|85 +27|94 +27|26 +27|49 +14|65 +14|19 +14|59 +14|18 +58|42 +58|86 +58|59 +58|78 +58|51 +95|44 +95|65 +95|35 +95|49 +95|36 +95|46 +46|59 +46|37 +46|26 +46|86 +46|17 +46|62 +46|78 +49|22 +49|75 +49|94 +49|72 +49|55 +49|37 +49|78 +49|53 +55|95 +55|98 +55|26 +55|79 +55|37 +55|54 +55|17 +55|32 +55|63 +32|46 +32|35 +32|58 +32|48 +32|21 +32|11 +32|72 +32|13 +32|87 +32|33 +41|36 +41|95 +41|44 +41|98 +41|46 +41|32 +41|62 +41|19 +41|27 +41|99 +41|63 +51|65 +51|59 +51|63 +51|89 +51|26 +51|98 +51|97 +51|79 +51|39 +51|99 +51|17 +51|44 +53|14 +53|54 +53|97 +53|94 +53|26 +53|51 +53|79 +53|59 +53|65 +53|18 +53|86 +53|55 +53|41 +37|24 +37|19 +37|97 +37|86 +37|68 +37|59 +37|18 +37|89 +37|95 +37|39 +37|27 +37|41 +37|65 +37|36 +79|27 +79|32 +79|73 +79|87 +79|44 +79|72 +79|78 +79|69 +79|63 +79|75 +79|48 +79|11 +79|47 +79|22 +79|39 +39|75 +39|87 +39|53 +39|11 +39|27 +39|62 +39|14 +39|33 +39|94 +39|73 +39|85 +39|68 +39|78 +39|21 +39|42 +39|58 +13|33 +13|78 +13|11 +13|17 +13|75 +13|14 +13|94 +13|72 +13|47 +13|22 +13|46 +13|69 +13|21 +13|85 +13|26 +13|48 +13|55 +59|27 +59|13 +59|79 +59|35 +59|18 +59|65 +59|24 +59|89 +59|19 +59|63 +59|54 +59|49 +59|36 +59|41 +59|95 +59|21 +59|44 +59|87 +65|22 +65|98 +65|48 +65|44 +65|24 +65|89 +65|39 +65|87 +65|79 +65|46 +65|72 +65|73 +65|62 +65|68 +65|32 +65|21 +65|58 +65|13 +65|63 +17|19 +17|36 +17|37 +17|97 +17|68 +17|59 +17|95 +17|41 +17|79 +17|39 +17|54 +17|63 +17|65 +17|89 +17|99 +17|32 +17|86 +17|24 +17|18 +17|44 +85|54 +85|59 +85|37 +85|32 +85|89 +85|55 +85|98 +85|97 +85|44 +85|19 +85|26 +85|95 +85|24 +85|99 +85|65 +85|86 +85|51 +85|94 +85|17 +85|41 +85|18 +35|69 +35|46 +35|48 +35|47 +35|39 +35|53 +35|14 +35|11 +35|13 +35|87 +35|72 +35|22 +35|33 +35|62 +35|75 +35|78 +35|42 +35|27 +35|58 +35|49 +35|21 +35|85 +26|19 +26|44 +26|89 +26|63 +26|95 +26|87 +26|41 +26|86 +26|59 +26|73 +26|35 +26|79 +26|32 +26|39 +26|98 +26|24 +26|97 +26|99 +26|68 +26|18 +26|36 +26|37 +26|65 +47|98 +47|37 +47|17 +47|14 +47|94 +47|85 +47|59 +47|95 +47|41 +47|69 +47|86 +47|65 +47|42 +47|36 +47|51 +47|55 +47|97 +47|26 +47|54 +47|19 +47|24 +47|53 +47|99 +47|18 +75|94 +75|42 +75|65 +75|17 +75|26 +75|53 +75|51 +75|98 +75|41 +75|55 +75|14 +75|95 +75|85 +75|97 +75|37 +75|69 +75|86 +75|18 +75|36 +75|54 +75|59 +75|78 +75|19 +75|47 +68|55 +68|47 +68|48 +68|69 +68|46 +68|33 +68|58 +68|62 +68|11 +68|27 +68|78 +68|42 +68|53 +68|51 +68|94 +68|21 +68|22 +68|75 +68|73 +68|72 +68|85 +68|14 +68|13 +68|49 +36|24 +36|63 +36|22 +36|58 +36|48 +36|39 +36|27 +36|99 +36|79 +36|35 +36|44 +36|87 +36|32 +36|46 +36|21 +36|68 +36|33 +36|49 +36|62 +36|13 +36|11 +36|73 +36|72 +36|89 +44|53 +44|47 +44|14 +44|62 +44|87 +44|21 +44|75 +44|27 +44|73 +44|39 +44|35 +44|72 +44|49 +44|46 +44|33 +44|58 +44|11 +44|68 +44|63 +44|78 +44|22 +44|69 +44|48 +44|13 +87|62 +87|22 +87|94 +87|42 +87|85 +87|58 +87|49 +87|73 +87|69 +87|75 +87|68 +87|47 +87|78 +87|33 +87|11 +87|14 +87|72 +87|51 +87|46 +87|48 +87|21 +87|53 +87|27 +87|13 +98|58 +98|32 +98|73 +98|68 +98|48 +98|27 +98|87 +98|36 +98|13 +98|21 +98|22 +98|44 +98|24 +98|99 +98|62 +98|89 +98|33 +98|39 +98|63 +98|79 +98|46 +98|35 +98|49 +98|72 +54|73 +54|68 +54|49 +54|35 +54|95 +54|32 +54|19 +54|39 +54|41 +54|89 +54|24 +54|13 +54|21 +54|79 +54|87 +54|63 +54|99 +54|44 +54|27 +54|62 +54|65 +54|46 +54|36 +54|98 +33|17 +33|97 +33|37 +33|75 +33|65 +33|86 +33|55 +33|18 +33|26 +33|47 +33|19 +33|41 +33|53 +33|11 +33|95 +33|51 +33|54 +33|14 +33|94 +33|78 +33|85 +33|42 +33|59 +33|69 +19|44 +19|65 +19|98 +19|13 +19|73 +19|68 +19|62 +19|63 +19|36 +19|35 +19|46 +19|24 +19|21 +19|22 +19|39 +19|27 +19|79 +19|89 +19|58 +19|99 +19|49 +19|32 +19|87 +19|48 +97|24 +97|36 +97|27 +97|39 +97|99 +97|68 +97|63 +97|98 +97|65 +97|95 +97|89 +97|13 +97|54 +97|41 +97|79 +97|87 +97|44 +97|19 +97|32 +97|21 +97|35 +97|18 +97|59 +97|73 +86|73 +86|39 +86|35 +86|68 +86|54 +86|99 +86|44 +86|32 +86|65 +86|13 +86|95 +86|36 +86|89 +86|18 +86|24 +86|59 +86|87 +86|63 +86|97 +86|79 +86|98 +86|19 +86|27 +86|41 +89|78 +89|47 +89|22 +89|63 +89|58 +89|48 +89|49 +89|13 +89|21 +89|75 +89|33 +89|39 +89|35 +89|87 +89|72 +89|62 +89|32 +89|46 +89|79 +89|44 +89|68 +89|27 +89|73 +89|11 +78|97 +78|24 +78|37 +78|85 +78|98 +78|42 +78|69 +78|51 +78|59 +78|86 +78|65 +78|41 +78|26 +78|19 +78|18 +78|95 +78|55 +78|53 +78|94 +78|14 +78|47 +78|36 +78|17 +78|54 +72|14 +72|19 +72|11 +72|95 +72|54 +72|97 +72|55 +72|18 +72|17 +72|41 +72|37 +72|53 +72|26 +72|94 +72|51 +72|42 +72|86 +72|85 +72|33 +72|78 +72|59 +72|75 +72|47 +72|69 +42|19 +42|18 +42|86 +42|94 +42|54 +42|65 +42|36 +42|79 +42|37 +42|85 +42|26 +42|59 +42|89 +42|44 +42|97 +42|55 +42|41 +42|51 +42|95 +42|17 +42|32 +42|99 +42|24 +42|98 +21|86 +21|58 +21|46 +21|94 +21|14 +21|85 +21|47 +21|51 +21|55 +21|17 +21|62 +21|26 +21|48 +21|75 +21|22 +21|37 +21|53 +21|49 +21|11 +21|72 +21|33 +21|69 +21|78 +21|42 +63|72 +63|46 +63|33 +63|42 +63|68 +63|62 +63|48 +63|75 +63|87 +63|47 +63|22 +63|13 +63|78 +63|58 +63|27 +63|39 +63|35 +63|69 +63|73 +63|49 +63|21 +63|53 +63|14 +63|11 +94|65 +94|44 +94|17 +94|59 +94|97 +94|98 +94|32 +94|26 +94|18 +94|63 +94|24 +94|54 +94|95 +94|36 +94|19 +94|99 +94|55 +94|86 +94|89 +94|37 +94|35 +94|79 +94|41 +94|51 +73|51 +73|49 +73|78 +73|13 +73|33 +73|21 +73|55 +73|53 +73|75 +73|14 +73|58 +73|27 +73|22 +73|11 +73|94 +73|42 +73|46 +73|17 +73|72 +73|48 +73|47 +73|69 +73|85 +73|62 +62|26 +62|51 +62|53 +62|48 +62|58 +62|18 +62|85 +62|72 +62|17 +62|33 +62|37 +62|59 +62|47 +62|14 +62|86 +62|22 +62|78 +62|75 +62|42 +62|69 +62|97 +62|11 +62|94 +62|55 +69|86 +69|98 +69|42 +69|65 +69|89 +69|94 +69|51 +69|26 +69|24 +69|55 +69|14 +69|18 +69|54 +69|17 +69|19 +69|53 +69|59 +69|41 +69|36 +69|95 +69|97 +69|37 +69|99 +69|85 +99|62 +99|58 +99|22 +99|27 +99|44 +99|39 +99|11 +99|68 +99|87 +99|72 +99|48 +99|13 +99|35 +99|78 +99|21 +99|75 +99|32 +99|63 +99|49 +99|79 +99|73 +99|89 +99|33 +99|46 +18|99 +18|46 +18|73 +18|87 +18|98 +18|68 +18|54 +18|36 +18|32 +18|65 +18|41 +18|95 +18|49 +18|24 +18|89 +18|35 +18|63 +18|13 +18|44 +18|39 +18|27 +18|19 +18|79 +18|21 +11|53 +11|94 +11|18 +11|97 +11|75 +11|85 +11|47 +11|98 +11|69 +11|59 +11|37 +11|78 +11|41 +11|42 +11|51 +11|65 +11|95 +11|54 +11|17 +11|55 +11|26 +11|86 +11|19 +11|14 +24|63 +24|75 +24|13 +24|89 +24|22 +24|72 +24|99 +24|21 +24|68 +24|46 +24|27 +24|35 +24|39 +24|49 +24|62 +24|87 +24|33 +24|11 +24|58 +24|32 +24|73 +24|79 +24|48 +24|44 +48|42 +48|11 +48|53 +48|37 +48|26 +48|78 +48|85 +48|17 +48|72 +48|54 +48|94 +48|14 +48|59 +48|55 +48|97 +48|58 +48|33 +48|41 +48|51 +48|47 +48|75 +48|86 +48|69 +22|47 +22|69 +22|97 +22|42 +22|26 +22|94 +22|17 +22|33 +22|53 +22|37 +22|75 +22|51 +22|54 +22|55 +22|72 +22|58 +22|11 +22|18 +22|48 +22|14 +22|78 +22|86 +27|46 +27|72 +27|48 +27|58 +27|14 +27|42 +27|75 +27|78 +27|62 +27|11 +27|22 +27|85 +27|55 +27|51 +27|21 +27|47 +27|53 +27|17 +27|69 +27|13 +27|33 +14|79 +14|95 +14|99 +14|51 +14|94 +14|97 +14|24 +14|98 +14|42 +14|85 +14|54 +14|26 +14|41 +14|55 +14|37 +14|36 +14|32 +14|86 +14|89 +14|17 +58|14 +58|75 +58|47 +58|95 +58|41 +58|55 +58|72 +58|97 +58|54 +58|69 +58|53 +58|94 +58|18 +58|26 +58|17 +58|37 +58|11 +58|85 +58|33 +95|27 +95|63 +95|98 +95|24 +95|89 +95|19 +95|87 +95|99 +95|68 +95|48 +95|62 +95|22 +95|32 +95|21 +95|13 +95|39 +95|79 +95|73 +46|47 +46|53 +46|33 +46|85 +46|58 +46|11 +46|51 +46|75 +46|42 +46|55 +46|69 +46|72 +46|94 +46|97 +46|48 +46|22 +46|14 +49|86 +49|17 +49|69 +49|14 +49|42 +49|85 +49|47 +49|46 +49|62 +49|26 +49|58 +49|33 +49|97 +49|48 +49|51 +49|11 +55|44 +55|41 +55|36 +55|19 +55|89 +55|59 +55|87 +55|24 +55|99 +55|86 +55|39 +55|18 +55|65 +55|35 +55|97 +32|73 +32|78 +32|63 +32|44 +32|62 +32|49 +32|53 +32|69 +32|47 +32|75 +32|22 +32|27 +32|68 +32|39 +41|79 +41|65 +41|35 +41|24 +41|89 +41|68 +41|21 +41|39 +41|22 +41|13 +41|49 +41|73 +41|87 +51|41 +51|54 +51|95 +51|55 +51|18 +51|24 +51|36 +51|35 +51|19 +51|32 +51|86 +51|37 +53|24 +53|95 +53|19 +53|17 +53|99 +53|85 +53|36 +53|37 +53|98 +53|89 +53|42 +37|32 +37|87 +37|98 +37|73 +37|35 +37|54 +37|99 +37|63 +37|44 +37|79 +79|49 +79|58 +79|33 +79|21 +79|62 +79|46 +79|13 +79|35 +79|68 +39|69 +39|46 +39|13 +39|72 +39|48 +39|22 +39|47 +39|49 +13|51 +13|62 +13|58 +13|53 +13|37 +13|42 +13|49 +59|99 +59|32 +59|73 +59|68 +59|98 +59|39 +65|49 +65|35 +65|99 +65|27 +65|36 +17|87 +17|98 +17|35 +17|26 +85|79 +85|63 +85|36 +35|73 +35|68 +26|54 + +35,58,32,63,89,99,72,79,68 +86,51,18,55,24,17,65,14,26,54,41,47,97,69,19,36,42,85,98 +21,22,58,33,75,47,69,42,17,26,37 +11,47,69,85,94,51,55,37,59,95,65 +75,58,44,68,49,63,13,39,33,46,27,62,87,53,22,11,69,48,72 +54,19,46,65,44,68,99 +33,11,75,78,47,69,53,14,85,94,51,55,26,37,86,97,59,18,54,95,19 +94,22,62,37,11,14,97,86,33,26,69,42,17,58,59,55,53,75,72,51,48 +44,68,73,27,13,46,22,58,72,75,78 +46,62,75,78,47,53,97 +69,53,14,94,55,17,86,54,41 +63,58,32,87,62,48,35,22,79,39,73,65,44,99,24,49,36,46,27,13,98 +86,53,14,94,47,75,97,85,59,78,42,26,55,72,69,41,37,11,54 +47,69,53,14,42,85,94,51,55,17,26,97,59,41,95,19,98,36,24 +35,39,87,68,73,27,13,49,46,62,22,48,58,72,33,75,78,47,69,53,42 +97,63,89,51,99,35,37,95,19 +86,59,54,41,19,98,89,79,32,44,63,35,39,87,68,73,27 +46,22,42,85,51,17,97 +55,53,72,47,69,17,11,27,33 +13,33,21,26,48,11,62,85,78,49,47,51,17,75,55 +79,35,87,39,21,58,48,33,11,13,68,62,49,75,78,73,89,46,32,44,63,27,72 +68,13,62,11,75 +95,19,65,98,36,24,99,89,79,44,63,39,68,73,27,21,49,62,22 +33,11,42,75,55,26,58,59,97,72,51,41,47,78,86,14,94,17,37,53,69 +79,26,37,36,35 +78,53,42,94,51,55,17,37,86,97,59,95,19,65,98 +99,32,44,35,21,22,48,33,75 +97,69,18,14,55,53,22,59,33,86,11,75,72,26,47,42,85,51,48,37,58,94,17 +78,55,54,95,37,86,33,42,26,18,17,59,75,11,72,14,97,41,69,94,47 +95,78,51,19,18,59,17,37,53,36,54,94,26 +98,95,41,14,85,86,54,51,89,94,97,42,19,24,99,65,36 +19,65,98,36,24,99,79,32,63,35,39,87,68,73,27,21,49,46,62,22,48 +79,32,44,63,39,68,73,27,49,46,62,48,72,11,75,78,47 +85,11,47,17,75,33,78,62,22,55,69,94,48,59,86 +98,24,44,63,73,27,21,46,72 +24,79,68,73,21,46,48 +46,32,79,13,36,19,68,49,21,27,65,99,89 +13,35,75,99,39,68,32 +11,89,99,68,58,49,48,24,87,62,22 +97,26,41,51,37,85,36,94,99,18,95,59,89,32,24,98,44,79,19,17,55 +46,33,17,13,53,47,26,21,55,72,42,69,49,78,85 +48,58,33,11,75,78,47,69,53,42,85,94,51,55,26,37,86,97,59,18,54 +87,97,18,95,36,39,19,86,32,24,54,99,63,65,41,35,89,44,27,59,68,98,79 +44,99,35,37,41,55,98,86,89,26,36,65,32,54,39 +63,21,18,99,27,32,49,13,65,35,95,54,73,19,89,79,41 +55,26,37,86,18,41,95,19,65,98,36,99,32,44,63,35,39 +18,54,41,95,19,98,36,24,99,89,79,32,44,63,35,39,87,27,13,21,49 +48,62,73,14,11,53,13,68,39,47,78,21,75,22,49,72,87,42,35,58,27,33,69 +49,48,58,47,69,94,26,37,86 +97,59,18,54,41,65,98,24,99,79,44,73,13 +54,41,95,19,65,98,36,99,79,32,44,63,35,39,87,73,27,13,21,49,46 +22,35,24,62,32 +39,87,68,73,13,21,46,62,22,48,72,11,75,78,53,14,85 +33,46,73,75,51,49,27,68,13 +33,11,75,78,47,69,53,14,42,85,94,51,55,86,97,59,18,54,41,95,19 +65,18,21,68,59,63,73,79,44,99,24 +98,99,89,79,32,44,35,87,68,73,27,13,21,49,48,58,72 +22,48,58,33,11,75,78,47,69,14,42,85,51,55,17,26,86,97,18 +14,42,94,55,17,26,37,86,97,18,54,65,98,36,99,89,79 +89,32,44,63,35,39,87,68,73,27,13,21,49,62,22,48,58,72,33,11,75 +26,37,86,97,59,18,54,41,19,65,98,36,24,99,89,79,32,44,63,35,39,87,68 +14,97,18,36,42,17,51,98,95,55,54,94,47,85,53 +58,72,33,11,75,78,69,53,14,42,85,55,17,26,37,86,59,18,54 +17,86,97,95,98,24,99,79,87 +48,63,27,24,35,13,46,87,44,68,32,89,21,36,65,39,98,49,22,79,19 +48,51,21,73,85,53,33,47,13,49,94,72,62,27,68,42,75,69,11 +32,63,35,39,27,13,21,46,62,22,48,58,72,11,75,78,47 +75,62,21,49,22,68,11,44,58,78,79 +36,99,89,32,39,87,73,13,62,22,48,72,33 +41,78,98,14,19,47,53,94,36 +68,73,48,75,69,14,42,85,51 +44,63,68,73,13,21,62,58,33,11,53 +69,75,46,11,47,22,94,72,48,21,85,26,17,42,13 +95,19,99,32,13 +17,26,37,97,59,18,54,19,65,36,99,89,79,32,44,63,35,39,87 +37,97,59,54,41,19,65,98,36,24,99,79,32,44,63,35,39,68,73 +85,17,94,22,46,58,37,62,48,78,69,97,53,14,26,72,75,47,51,55,33 +79,32,44,35,39,87,68,73,27,13,49,46,22,48,58,72,33,11,75,78,47 +59,18,54,41,19,65,98,36,24,99,89,79,32,44,63,35,39,87,68,27,21 +75,69,53,14,85,94,51,17,26,37,86,97,59,18,54,41,19,65,98 +69,53,14,42,85,94,51,55,17,26,86,97,59,18,54,41,19,98,36,24,99 +63,75,87,69,13,11,14,39,46 +73,49,46,22,58,72,33,11,47,69,42,85,55 +14,98,69,36,19,78,54 +75,26,53,69,59,17,58,47,97,37,51,86,94,33,42,18,72,41,54 +78,53,14,42,94,51,26,37,86,97,59,18,54,41,19 +11,78,69,85,94,51,26,19,65 +87,33,48,36,58,72,73 +65,89,79,32,35,87,68,27,13,21,49,62,48 +48,58,11,47,69,53,14,42,94,55,17,26,37,86,97,18,54 +46,44,89,79,21,48,13,73,22,98,72,58,24,27,99,63,35,68,36 +87,46,58,47,42,85,94 +24,44,87,73,46,48,72 +14,62,33,85,53,72,94,49,86,26,37,55,58 +98,36,24,99,89,79,32,44,63,35,39,87,68,73,27,13,21,49,46,22,48,58,72 +51,53,59,36,54,41,19,98,65,37,97,94,86,89,99,24,14,26,42 +47,48,69,72,39,27,46,87,11 +78,22,62,48,47,14,51 +78,14,53,11,49,68,94,46,27,48,75,22,51 +44,63,35,87,68,73,27,13,49,62,22,48,58,33,11,75,78,47,69 +39,68,13,46,48,14,85 +94,17,37,18,41,19,44 +47,69,53,85,94,55,26,37,86,59,54,41,19 +47,69,42,85,94,51,55,26,97,59,18,54,41,19,65,36,24 +75,85,78,17,33,26,53,86,22,97,46,69,51 +89,35,39,27,49,48,58 +59,86,26,94,89,18,63 +63,33,58,48,69,44,22,32,47 +33,11,75,78,47,69,53,14,42,85,94,55,17,26,37,86,97,59,18,54,41,95,19 +98,26,75,85,65,19,95 +24,99,79,32,63,35,39,87,68,73,27,21,49,46,62,22,48,58,72,33,11 +94,44,65,32,99,24,17,51,19,41,98,55,95,86,89 +26,47,72,78,94,46,69,51,42,37,62,14,11,48,22,85,17,58,49 +65,24,44,27,21,49,58 +41,95,19,65,98,24,99,89,79,32,44,63,35,87,68,73,27,13,21,46,62 +86,78,18,94,37,22,75 +18,54,95,65,24,89,32,44,63,35,87,73,27,13,49 +24,37,18,55,86,47,14,41,26,98,94,36,51,54,59,69,85,95,42 +73,46,33,13,21,69,62,32,63,47,78 +18,54,41,95,65,98,36,24,99,89,79,44,63,35,39,68,73,27,13,21,49 +97,54,41,95,65,98,24,89,32,44,63,35,87,68,73,27,13 +35,63,65,44,18,73,89,79,32,21,87,68,54,13,98,36,99,41,24,27,19,59,39 +73,24,32,87,97,89,63,36,35,65,95,19,18,54,41,98,68,59,27,13,39 +86,18,54,41,95,19,65,98,36,24,79,32,44,63,35,73,27 +37,97,59,18,54,95,19,65,98,36,24,99,89,79,32,63,35,39,87,68,73 +59,18,54,41,95,65,98,24,99,89,79,32,44,63,39,68,27,13,21 +17,85,36,37,41,95,55,14,94,99,97 +35,68,73,27,46,62,72,78,42 +11,14,42,85,94,37,86,97,59,54,95,19,65 +44,63,35,87,68,73,27,13,21,49,46,48,58,72,33,75,78,47,53 +98,86,99,69,18,14,59,19,95,94,85,41,24,26,37,53,51 +48,58,33,11,75,78,47,69,53,14,42,85,94,51,55,17,37,86,97,59,54 +27,13,21,49,46,62,22,48,58,11,75,78,47,69,53,14,85,94,51,55,17 +97,36,32,24,44,39,99,13,59,27,19,98,79,54,35,89,73,65,68 +39,87,27,49,46,62,48,33,11,47,53,14,85 +99,79,32,44,35,87,73,13,21,49,46,62,48,58,33,11,75 +59,95,19,89,63,13,21 +42,59,75,53,94,17,19,65,26,98,54 +78,33,72,42,39,69,62 +73,75,55,47,85,33,94,49,11 +48,58,72,33,11,78,47,69,53,14,42,85,94,51,55,17,26,37,86,97,59,18,54 +69,14,85,94,55,17,37,86,97,18,65,36,99 +73,75,47,42,85,94,55 +62,13,21,87,99,65,24,89,39,49,44,32,35,63,68,79,46,19,98,36,73,22,95 +86,17,98,44,35,54,18,87,99,19,36,41,24 +87,27,13,62,58,72,69,85,94 +19,98,36,99,79,32,44,63,35,39,87,68,13,21,46,22,48 +65,98,36,89,79,44,35,87,68,13,58 +99,98,59,89,44,95,85 +46,39,62,79,63,21,27,13,35,73,33,49,68,75,58,22,87,11,48 +62,89,79,35,49,78,46,68,33,21,87,63,72,39,58,44,48,32,75,13,22 +32,51,54,42,89,85,94,99,24 +97,86,17,36,99,26,65,14,59,24,51,94,18,69,42,53,54 +13,89,75,35,73,11,99,33,63,49,27 +26,94,14,72,54,17,85,42,97,59,95,51,37,18,33 +65,98,24,99,89,32,44,63,35,87,73,27,21,49,46,62,58 +73,21,62,48,33,78,85,94,55 +48,58,72,33,11,75,78,47,69,53,14,42,94,51,55,17,26,37,86,97,59,18,54 +27,13,21,49,46,62,22,48,58,72,33,11,75,47,53,14,85,94,51,55,17 +18,97,86,24,68,95,36,65,37,59,19,99,39 +39,87,68,13,49,46,62,48,58,72,33,11,75,78,69,53,14,42,85 +18,41,19,99,79,63,73 +24,89,32,87,68,21,22,48,58,33,11 +24,89,68,62,73,35,32,21,99,22,44,49,48,19,46,39,13 +63,79,59,97,36,32,73,24,13,89,68,39,54,35,18,27,87 +59,18,39,24,86 +86,79,51,36,63 +68,21,46,58,72,69,42,85,51 +62,58,11,13,33,53,47,73,75,78,48,27,42,69,87,22,46,14,72,49,35 +42,85,17,37,86,97,59,54,41,95,65,98,36,24,89,79,32 +85,94,51,55,17,26,97,59,54,65,24,89,44 +98,32,24,21,39,65,22,35,49,89,48,99,44,87,68,63,79,73,19,62,13 +54,41,65,98,36,99,44,63,35,39,68,73,13,49,46 +35,19,44,68,36,32,73,27,18,54,39,87,24,99,79 +98,24,79,27,49,62,72 +24,99,89,32,63,39,87,27,21,49,46,62,58,33,11 +42,85,94,51,55,17,26,37,86,97,95,19,65,98,36,24,99,79,32 +24,37,94,65,99,59,89,36,63 +13,51,58,42,62,47,11,73,48,27,49,21,94,33,68,69,78,72,22 +42,94,97,14,85,54,95,26,78,37,41,55,75,69,65,51,47,17,98,19,86 +78,87,22,11,89,68,73,79,32,46,13,48,62,58,72,39,75,21,35 +99,89,44,39,87,73,49,72,75 +73,44,95,87,98,41,63,62,32,68,35,65,24,89,36,19,13,99,79 +47,14,42,85,86,97,18,54,41,95,24 +27,95,19,46,49,44,65,21,32,13,41,54,63 +75,78,47,53,55,19,98 +18,41,95,36,89,35,39,87,68,73,13,21,49 \ No newline at end of file diff --git a/src/day05/mod.rs b/src/day05/mod.rs new file mode 100644 index 0000000..d021bbc --- /dev/null +++ b/src/day05/mod.rs @@ -0,0 +1,178 @@ +use std::{collections::HashMap, error::Error, fs}; + +/// Solves the problem for day 04. +/// +/// # Errors +/// +/// This function will return an error if the file cannot be read or if the input is invalid. +#[allow(clippy::cast_possible_truncation, clippy::cast_possible_wrap)] +pub fn solve_day05(path: &str) -> Result<(i32, i32), Box> { + let content = fs::read_to_string(path)?; + + let (rules, updates) = parse_input(&content); + + let ordered_updates = updates + .iter() + .map(|update| order_updates(update, &rules)) + .collect::>(); + + let result_one = updates + .iter() + .zip(ordered_updates.iter()) + .filter(|(a, b)| a == b) + .map(|(a, _)| a.clone()) + .collect::>(); + + let result_two = updates + .iter() + .zip(ordered_updates.iter()) + .filter(|(a, b)| a != b) + .map(|(_, b)| b.clone()) + .collect::>(); + let part_one = sum_middle_value(&result_one); + let part_two = sum_middle_value(&result_two); + Ok((part_one, part_two)) +} + +fn parse_input(input: &str) -> (HashMap>, Vec>) { + let parts: Vec<_> = input.split("\n\n").collect(); + let mut map: HashMap> = HashMap::new(); + parts[0].split('\n').for_each(|r| { + let values = r + .split('|') + .map(|i| i.parse().unwrap()) + .collect::>(); + + let index = values[0]; + map.entry(index) + .or_default() + .append(values[1..].to_vec().as_mut()); + }); + // .collect(); + + let updates: Vec> = parts[1] + .split('\n') + .map(|r| r.split(',').map(|i| i.parse().unwrap()).collect()) + .collect(); + + (map, updates) +} + +fn order_updates(updates: &[i32], rules: &HashMap>) -> Vec { + if !updates.iter().any(|u| rules.contains_key(u)) { + return updates.to_vec(); + } + + let mut ordered_updates: Vec = updates.to_vec(); + + ordered_updates.sort_by(|a, b| { + for (key, values) in rules { + if a == key && values.contains(b) { + return std::cmp::Ordering::Less; + // } else if b == key && values.contains(a) { + // return std::cmp::Ordering::Greater; + // } else if a < b { + // return std::cmp::Ordering::Less; + // } else if a > b { + // return std::cmp::Ordering::Greater; + } + } + std::cmp::Ordering::Equal + }); + ordered_updates +} + +fn sum_middle_value(input: &[Vec]) -> i32 { + input + .iter() + .filter_map(|row| { + if row.is_empty() || row.len() % 2 == 0 { + None + } else { + Some(row[row.len() / 2]) + } + }) + .sum() +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_parse_input() { + let input = "47|53 +97|13 +97|61 +97|47 +75|29 +61|13 +75|53 +29|13 +97|29 +53|29 +61|53 +97|53 +61|29 +47|13 +75|47 +97|75 +47|61 +75|61 +47|29 +75|13 +53|13 + +75,47,61,53,29 +97,61,53,29,13 +29,13,75 +75,97,47,61,53 +61,13,29 +97,13,75,29,47"; + let (rules, updates) = parse_input(input); + assert_eq!(rules.len(), 6); + assert_eq!(rules[&47], vec![53, 13, 61, 29]); + assert_eq!(rules[&53], vec![29, 13]); + + assert_eq!(updates.len(), 6); + assert_eq!(updates[0], vec![75, 47, 61, 53, 29]); + + let sum = sum_middle_value(&updates); + assert_eq!(sum, 61 + 53 + 13 + 47 + 13 + 75); + + let want = vec![75, 29, 13]; + let got = order_updates(&updates[2], &rules); + dbg!(&got, &updates[2]); + assert_eq!(got, want); + + let want = vec![97, 75, 47, 61, 53]; + let got = order_updates(&updates[3], &rules); + dbg!(&got, &updates[3]); + assert_eq!(got, want); + + let want = vec![61, 29, 13]; + let got = order_updates(&updates[4], &rules); + dbg!(&got, &updates[4]); + assert_eq!(got, want); + + let want = vec![97, 75, 47, 29, 13]; + let got = order_updates(&updates[5], &rules); + dbg!(&got, &want, &updates[5]); + assert_eq!(got, want); + + let want = 61; + let got = sum_middle_value(&[order_updates(&updates[0], &rules)]); + assert_eq!(got, want); + + let want = 143; + let got = sum_middle_value( + &updates + .iter() + .take(3) + .map(|u| order_updates(u, &rules)) + .collect::>(), + ); + + assert_eq!(got, want); + } +} diff --git a/src/lib.rs b/src/lib.rs index e051fbd..f290640 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -2,3 +2,4 @@ pub mod day01; pub mod day02; pub mod day03; pub mod day04; +pub mod day05; diff --git a/src/main.rs b/src/main.rs index d811dcc..1e6549a 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,5 +1,6 @@ use adventofcode_24::{ day01::solve_day01, day02::solve_day02, day03::solve_day03, day04::solve_day04, + day05::solve_day05, }; use clap::{Arg, Command}; @@ -28,6 +29,11 @@ fn main() { .short('4') .help("Path to Day 04 Input file"), ) + .arg( + Arg::new("day05") + .short('5') + .help("Path to Day 05 Input file"), + ) .get_matches(); if let Some(file) = matches.get_one::("day01") { @@ -67,4 +73,13 @@ fn main() { Err(e) => eprintln!("{e}"), } } + + if let Some(file) = matches.get_one::("day05") { + match solve_day05(file) { + Ok((r1, r2)) => { + println!("Result of Day 05:\nOrdered middle page count: {r1}\nPart two: {r2}"); + } + Err(e) => eprintln!("{e}"), + } + } }