From 7928c2334f32359cd12d7c96bb66bc790780f54f Mon Sep 17 00:00:00 2001 From: Timo Schneider Date: Tue, 9 Dec 2025 20:11:49 +0100 Subject: [PATCH] refactored project structure --- Cargo.lock | 34 -- Cargo.toml | 8 +- README.md | 28 +- {src/day01 => puzzles}/input01.txt | 0 {src/day02 => puzzles}/input02.txt | 0 {src/day03 => puzzles}/input03.txt | 0 {src/day04 => puzzles}/input04.txt | 0 {src/day05 => puzzles}/input05.txt | 0 {src/day06 => puzzles}/input06.txt | 0 puzzles/input09.txt | 496 +++++++++++++++++++++++++++++ src/.DS_Store | Bin 0 -> 6148 bytes src/day01/Cargo.lock | 7 - src/day01/Cargo.toml | 6 - src/day01/mod.rs | 28 ++ src/day01/{src => }/part01a.rs | 14 +- src/day01/{src => }/part01b.rs | 14 +- src/day01/src/lib.rs | 2 - src/day02/Cargo.lock | 7 - src/day02/Cargo.toml | 6 - src/day02/mod.rs | 19 ++ src/day02/{src => }/part02a.rs | 11 +- src/day02/{src => }/part02b.rs | 11 +- src/day02/src/lib.rs | 2 - src/day03/Cargo.lock | 16 - src/day03/Cargo.toml | 7 - src/day03/mod.rs | 22 ++ src/day03/{src => }/part03a.rs | 11 +- src/day03/{src => }/part03b.rs | 11 +- src/day03/src/lib.rs | 2 - src/day04/Cargo.lock | 7 - src/day04/Cargo.toml | 6 - src/day04/mod.rs | 29 ++ src/day04/{src => }/part04a.rs | 17 +- src/day04/part04b.rs | 7 + src/day04/src/lib.rs | 3 - src/day04/src/part04b.rs | 16 - src/day05/Cargo.lock | 7 - src/day05/Cargo.toml | 6 - src/day05/mod.rs | 31 ++ src/day05/part05a.rs | 4 + src/day05/part05b.rs | 7 + src/day05/src/lib.rs | 3 - src/day05/src/part05a.rs | 13 - src/day05/src/part05b.rs | 16 - src/day06/Cargo.lock | 7 - src/day06/Cargo.toml | 7 - src/day06/day6.py | 43 --- src/day06/mod.rs | 22 ++ src/day06/{src => }/part06a.rs | 11 +- src/day06/{src => }/part06b.rs | 11 +- src/day06/src/lib.rs | 3 - src/day09/mod.rs | 27 ++ src/day09/part09a.rs | 19 ++ src/day09/part09b.rs | 7 + src/main.rs | 46 +-- {src/day01 => story}/story01a.txt | 0 {src/day01 => story}/story01b.txt | 0 {src/day02 => story}/story02a.txt | 0 {src/day02 => story}/story02b.txt | 0 {src/day03 => story}/story03a.txt | 0 {src/day03 => story}/story03b.txt | 0 {src/day04 => story}/story04a.txt | 0 {src/day04 => story}/story04b.txt | 0 {src/day05 => story}/story05a.txt | 0 {src/day05 => story}/story05b.txt | 0 {src/day06 => story}/story06a.txt | 0 {src/day06 => story}/story06b.txt | 0 story/story09a.txt | 0 story/story09b.txt | 0 69 files changed, 783 insertions(+), 354 deletions(-) rename {src/day01 => puzzles}/input01.txt (100%) rename {src/day02 => puzzles}/input02.txt (100%) rename {src/day03 => puzzles}/input03.txt (100%) rename {src/day04 => puzzles}/input04.txt (100%) rename {src/day05 => puzzles}/input05.txt (100%) rename {src/day06 => puzzles}/input06.txt (100%) create mode 100644 puzzles/input09.txt create mode 100644 src/.DS_Store delete mode 100644 src/day01/Cargo.lock delete mode 100644 src/day01/Cargo.toml create mode 100644 src/day01/mod.rs rename src/day01/{src => }/part01a.rs (52%) rename src/day01/{src => }/part01b.rs (67%) delete mode 100644 src/day01/src/lib.rs delete mode 100644 src/day02/Cargo.lock delete mode 100644 src/day02/Cargo.toml create mode 100644 src/day02/mod.rs rename src/day02/{src => }/part02a.rs (67%) rename src/day02/{src => }/part02b.rs (79%) delete mode 100644 src/day02/src/lib.rs delete mode 100644 src/day03/Cargo.lock delete mode 100644 src/day03/Cargo.toml create mode 100644 src/day03/mod.rs rename src/day03/{src => }/part03a.rs (66%) rename src/day03/{src => }/part03b.rs (78%) delete mode 100644 src/day03/src/lib.rs delete mode 100644 src/day04/Cargo.lock delete mode 100644 src/day04/Cargo.toml create mode 100644 src/day04/mod.rs rename src/day04/{src => }/part04a.rs (71%) create mode 100644 src/day04/part04b.rs delete mode 100644 src/day04/src/lib.rs delete mode 100644 src/day04/src/part04b.rs delete mode 100644 src/day05/Cargo.lock delete mode 100644 src/day05/Cargo.toml create mode 100644 src/day05/mod.rs create mode 100644 src/day05/part05a.rs create mode 100644 src/day05/part05b.rs delete mode 100644 src/day05/src/lib.rs delete mode 100644 src/day05/src/part05a.rs delete mode 100644 src/day05/src/part05b.rs delete mode 100644 src/day06/Cargo.lock delete mode 100644 src/day06/Cargo.toml delete mode 100644 src/day06/day6.py create mode 100644 src/day06/mod.rs rename src/day06/{src => }/part06a.rs (68%) rename src/day06/{src => }/part06b.rs (82%) delete mode 100644 src/day06/src/lib.rs create mode 100644 src/day09/mod.rs create mode 100644 src/day09/part09a.rs create mode 100644 src/day09/part09b.rs rename {src/day01 => story}/story01a.txt (100%) rename {src/day01 => story}/story01b.txt (100%) rename {src/day02 => story}/story02a.txt (100%) rename {src/day02 => story}/story02b.txt (100%) rename {src/day03 => story}/story03a.txt (100%) rename {src/day03 => story}/story03b.txt (100%) rename {src/day04 => story}/story04a.txt (100%) rename {src/day04 => story}/story04b.txt (100%) rename {src/day05 => story}/story05a.txt (100%) rename {src/day05 => story}/story05b.txt (100%) rename {src/day06 => story}/story06a.txt (100%) rename {src/day06 => story}/story06b.txt (100%) create mode 100644 story/story09a.txt create mode 100644 story/story09b.txt diff --git a/Cargo.lock b/Cargo.lock index 533ff30..d10b31b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -5,42 +5,8 @@ version = 4 [[package]] name = "AdventOfCode2025" version = "0.1.0" -dependencies = [ - "day01", - "day02", - "day03", - "day04", - "day05", - "day06", -] - -[[package]] -name = "day01" -version = "0.1.0" - -[[package]] -name = "day02" -version = "0.1.0" - -[[package]] -name = "day03" -version = "0.1.0" dependencies = [ "iter-first-max", -] - -[[package]] -name = "day04" -version = "0.1.0" - -[[package]] -name = "day05" -version = "0.1.0" - -[[package]] -name = "day06" -version = "0.1.0" -dependencies = [ "itertools", ] diff --git a/Cargo.toml b/Cargo.toml index 400aa35..778dd13 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -4,9 +4,5 @@ version = "0.1.0" edition = "2024" [dependencies] -day01 = {path = "src/day01"} -day02 = {path = "src/day02"} -day03 = {path = "src/day03"} -day04 = {path = "src/day04"} -day05 = {path = "src/day05"} -day06 = {path = "src/day06"} +itertools = "0.14.0" +iter-first-max = "0.1.2" \ No newline at end of file diff --git a/README.md b/README.md index 09253df..7472c25 100644 --- a/README.md +++ b/README.md @@ -1,17 +1,19 @@ # Advent of Code 2025 ```bash -day01:A => 1150 ( 87us) -day01:B => 6738 ( 85us) -day02:A => 31839939622 ( 8509us) -day02:B => 41662374059 ( 67840us) -day03:A => 16812 ( 143us) -day03:B => 166345822896410 ( 304us) -day04:A => 1518 ( 213us) -day04:B => 0 ( 12us) -day05:A => 0 ( 15us) -day05:B => 0 ( 11us) -day06:A => 6503327062445 ( 214us) -day06:B => 9640641878593 ( 39us) +day01:A => 1150 ( 50us) +day01:B => 1150 ( 48us) +day02:A => 31839939622 ( 9568us) +day02:B => 41662374059 ( 69966us) +day03:A => 16812 ( 83us) +day03:B => 166345822896410 ( 287us) +day04:A => 1518 ( 192us) +day04:B => 0 ( 0us) +day05:A => 0 ( 0us) +day05:B => 0 ( 0us) +day06:A => 6503327062445 ( 203us) +day06:B => 9640641878593 ( 27us) +day09:A => 4725826296 ( 163us) +day09:B => 0 ( 0us) ---------- - 77631us + 82834us ``` \ No newline at end of file diff --git a/src/day01/input01.txt b/puzzles/input01.txt similarity index 100% rename from src/day01/input01.txt rename to puzzles/input01.txt diff --git a/src/day02/input02.txt b/puzzles/input02.txt similarity index 100% rename from src/day02/input02.txt rename to puzzles/input02.txt diff --git a/src/day03/input03.txt b/puzzles/input03.txt similarity index 100% rename from src/day03/input03.txt rename to puzzles/input03.txt diff --git a/src/day04/input04.txt b/puzzles/input04.txt similarity index 100% rename from src/day04/input04.txt rename to puzzles/input04.txt diff --git a/src/day05/input05.txt b/puzzles/input05.txt similarity index 100% rename from src/day05/input05.txt rename to puzzles/input05.txt diff --git a/src/day06/input06.txt b/puzzles/input06.txt similarity index 100% rename from src/day06/input06.txt rename to puzzles/input06.txt diff --git a/puzzles/input09.txt b/puzzles/input09.txt new file mode 100644 index 0000000..e510eec --- /dev/null +++ b/puzzles/input09.txt @@ -0,0 +1,496 @@ +97918,50201 +97918,51425 +98247,51425 +98247,52647 +98195,52647 +98195,53859 +98005,53859 +98005,55071 +97872,55071 +97872,56297 +97835,56297 +97835,57522 +97759,57522 +97759,58659 +97171,58659 +97171,59849 +96924,59849 +96924,61075 +96832,61075 +96832,62278 +96613,62278 +96613,63385 +96045,63385 +96045,64538 +95663,64538 +95663,65837 +95705,65837 +95705,66999 +95314,66999 +95314,68121 +94816,68121 +94816,69159 +94132,69159 +94132,70235 +93557,70235 +93557,71392 +93150,71392 +93150,72594 +92813,72594 +92813,73464 +91858,73464 +91858,74283 +90857,74283 +90857,75827 +91050,75827 +91050,76622 +90026,76622 +90026,77623 +89334,77623 +89334,78461 +88419,78461 +88419,79592 +87898,79592 +87898,80529 +87121,80529 +87121,81258 +86103,81258 +86103,82506 +85676,82506 +85676,82951 +84373,82951 +84373,84417 +84129,84417 +84129,84738 +82744,84738 +82744,85431 +81740,85431 +81740,86272 +80874,86272 +80874,86984 +79898,86984 +79898,87707 +78934,87707 +78934,88651 +78132,88651 +78132,89825 +77471,89825 +77471,90048 +76152,90048 +76152,91026 +75332,91026 +75332,91113 +73969,91113 +73969,92433 +73319,92433 +73319,92653 +72052,92653 +72052,92817 +70779,92817 +70779,93561 +69793,93561 +69793,94429 +68844,94429 +68844,94816 +67683,94816 +67683,94825 +66387,94825 +66387,95504 +65340,95504 +65340,96215 +64286,96215 +64286,95778 +62890,95778 +62890,96609 +61858,96609 +61858,97235 +60751,97235 +60751,97506 +59554,97506 +59554,97496 +58306,97496 +58306,97162 +57021,97162 +57021,97638 +55863,97638 +55863,98017 +54678,98017 +54678,98087 +53458,98087 +53458,98404 +52250,98404 +52250,98467 +51023,98467 +51023,97591 +49799,97591 +49799,97549 +48594,97549 +48594,97447 +47393,97447 +47393,97559 +46176,97559 +46176,97590 +44957,97590 +44957,97139 +43794,97139 +43794,97718 +42484,97718 +42484,97235 +41328,97235 +41328,97025 +40129,97025 +40129,96569 +38986,96569 +38986,96439 +37767,96439 +37767,96227 +36561,96227 +36561,95775 +35425,95775 +35425,95708 +34160,95708 +34160,94873 +33165,94873 +33165,94442 +32030,94442 +32030,93853 +30961,93853 +30961,93475 +29801,93475 +29801,93145 +28610,93145 +28610,92571 +27533,92571 +27533,91778 +26580,91778 +26580,91054 +25599,91054 +25599,90700 +24392,90700 +24392,90098 +23330,90098 +23330,89610 +22181,89610 +22181,88575 +21422,88575 +21422,87836 +20456,87836 +20456,87257 +19358,87257 +19358,86584 +18325,86584 +18325,85761 +17416,85761 +17416,84396 +17026,84396 +17026,83497 +16219,83497 +16219,82724 +15282,82724 +15282,81812 +14488,81812 +14488,81287 +13242,81287 +13242,80044 +12835,80044 +12835,79273 +11850,79273 +11850,78300 +11117,78300 +11117,77140 +10654,77140 +10654,76100 +10032,76100 +10032,75292 +9038,75292 +9038,74404 +8140,74404 +8140,73087 +7988,73087 +7988,71995 +7455,71995 +7455,71036 +6653,71036 +6653,69869 +6271,69869 +6271,68669 +5984,68669 +5984,67752 +5008,67752 +5008,66446 +5011,66446 +5011,65435 +4213,65435 +4213,64209 +4035,64209 +4035,63114 +3426,63114 +3426,61827 +3512,61827 +3512,60715 +2925,60715 +2925,59521 +2657,59521 +2657,58341 +2305,58341 +2305,57063 +2555,57063 +2555,55868 +2321,55868 +2321,54631 +2469,54631 +2469,53453 +1978,53453 +1978,52239 +1840,52239 +1840,51023 +1568,51023 +1568,50187 +94581,50187 +94581,48595 +2489,48595 +2489,47360 +1948,47360 +1948,46149 +2099,46149 +2099,44932 +2173,44932 +2173,43745 +2490,43745 +2490,42544 +2663,42544 +2663,41373 +3007,41373 +3007,40066 +2674,40066 +2674,39008 +3523,39008 +3523,37778 +3604,37778 +3604,36502 +3567,36502 +3567,35540 +4584,35540 +4584,34126 +4191,34126 +4191,33194 +5204,33194 +5204,32063 +5639,32063 +5639,30930 +6073,30930 +6073,29848 +6623,29848 +6623,28717 +7070,28717 +7070,27492 +7350,27492 +7350,26613 +8281,26613 +8281,25390 +8594,25390 +8594,24514 +9492,24514 +9492,23522 +10191,23522 +10191,22173 +10377,22173 +10377,21180 +11097,21180 +11097,20343 +12018,20343 +12018,19523 +12942,19523 +12942,18816 +13983,18816 +13983,17981 +14858,17981 +14858,16809 +15376,16809 +15376,16068 +16353,16068 +16353,15030 +17038,15030 +17038,14301 +18019,14301 +18019,13410 +18855,13410 +18855,12559 +19733,12559 +19733,12152 +20957,12152 +20957,10852 +21506,10852 +21506,10788 +22952,10788 +22952,9988 +23871,9988 +23871,8781 +24548,8781 +24548,8442 +25771,8442 +25771,7748 +26780,7748 +26780,7638 +28098,7638 +28098,6597 +28936,6597 +28936,6634 +30295,6634 +30295,5530 +31137,5530 +31137,5119 +32291,5119 +32291,5171 +33611,5171 +33611,4750 +34745,4750 +34745,4394 +35901,4394 +35901,4192 +37101,4192 +37101,3248 +38105,3248 +38105,3209 +39349,3209 +39349,2909 +40529,2909 +40529,2965 +41774,2965 +41774,2208 +42884,2208 +42884,2578 +44163,2578 +44163,2700 +45391,2700 +45391,1938 +46543,1938 +46543,2387 +47786,2387 +47786,2473 +48995,2473 +48995,2002 +50202,2002 +50202,1582 +51430,1582 +51430,1775 +52649,1775 +52649,2210 +53841,2210 +53841,2166 +55067,2166 +55067,2369 +56270,2369 +56270,2715 +57447,2715 +57447,2376 +58742,2376 +58742,3117 +59840,3117 +59840,2894 +61140,2894 +61140,3742 +62185,3742 +62185,3817 +63425,3817 +63425,3989 +64648,3989 +64648,5057 +65573,5057 +65573,4922 +66910,4922 +66910,5185 +68120,5185 +68120,5964 +69117,5964 +69117,6674 +70128,6674 +70128,6710 +71460,6710 +71460,7450 +72454,7450 +72454,8385 +73327,8385 +73327,8392 +74729,8392 +74729,9508 +75475,9508 +75475,10041 +76576,10041 +76576,10869 +77480,10869 +77480,11720 +78357,11720 +78357,12429 +79335,12429 +79335,12852 +80550,12852 +80550,13833 +81313,13833 +81313,14720 +82144,14720 +82144,15684 +82895,15684 +82895,16530 +83752,16530 +83752,17162 +84838,17162 +84838,17952 +85773,17952 +85773,18787 +86668,18787 +86668,19898 +87235,19898 +87235,20534 +88399,20534 +88399,21819 +88718,21819 +88718,22937 +89233,22937 +89233,23968 +89861,23968 +89861,24660 +91036,24660 +91036,25849 +91424,25849 +91424,26916 +92004,26916 +92004,27802 +92933,27802 +92933,28832 +93616,28832 +93616,30336 +93275,30336 +93275,31169 +94394,31169 +94394,32316 +94816,32316 +94816,33403 +95397,33403 +95397,34581 +95737,34581 +95737,35916 +95557,35916 +95557,37120 +95737,37120 +95737,38230 +96258,38230 +96258,39290 +97047,39290 +97047,40627 +96600,40627 +96600,41738 +97237,41738 +97237,42902 +97667,42902 +97667,44190 +97201,44190 +97201,45331 +97913,45331 +97913,46539 +98110,46539 +98110,47754 +98296,47754 +98296,48987 +97943,48987 +97943,50201 \ No newline at end of file diff --git a/src/.DS_Store b/src/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..cff917968a35d5e5703e1cfba4b5854442ba8d68 GIT binary patch literal 6148 zcmeHKI|>3Z5S{S@f{mqRj-ZWo5IunxP!McHK~S*U%5!-%-+Y>7vC~3%1Cy6b<|X76 zJ3Atx%j z0V+TRr~nn90-shOE9_|e>4SM56`%q?uYi3Y3f!z~C(aaDcEI=H5#Hiv@r+ zu?a*3ra=V;RkOv=pd(%~uO>EuK^M*DL-S_M4n_TToL@X$v<7md0#u-_KtGlftN&~G zoBqE|;))7Tfxl8f2dm9$i6>=k?L5wEZGms$mh*(0VeS+RUXFoYjlb| WO>6?4j=0l-{24G^XjI_a3cLV$QWPKn literal 0 HcmV?d00001 diff --git a/src/day01/Cargo.lock b/src/day01/Cargo.lock deleted file mode 100644 index 2a24086..0000000 --- a/src/day01/Cargo.lock +++ /dev/null @@ -1,7 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -version = 4 - -[[package]] -name = "day01" -version = "0.1.0" diff --git a/src/day01/Cargo.toml b/src/day01/Cargo.toml deleted file mode 100644 index f21afc2..0000000 --- a/src/day01/Cargo.toml +++ /dev/null @@ -1,6 +0,0 @@ -[package] -name = "day01" -version = "0.1.0" -edition = "2024" - -[dependencies] diff --git a/src/day01/mod.rs b/src/day01/mod.rs new file mode 100644 index 0000000..8df9c19 --- /dev/null +++ b/src/day01/mod.rs @@ -0,0 +1,28 @@ +pub mod part01a; +pub mod part01b; + +#[cfg(test)] +mod tests { + use crate::day01::{part01a, part01b}; + + const PUZZLE: &str = "L68 +L30 +R48 +L5 +R60 +L55 +L1 +L99 +R14 +L82"; + + #[test] + fn part01a() { + assert_eq!(part01a::solve(PUZZLE.to_string()), 3); + } + + #[test] + fn part01b() { + assert_eq!(part01b::solve(PUZZLE.to_string()), 6); + } +} \ No newline at end of file diff --git a/src/day01/src/part01a.rs b/src/day01/part01a.rs similarity index 52% rename from src/day01/src/part01a.rs rename to src/day01/part01a.rs index 951ec88..11801ff 100644 --- a/src/day01/src/part01a.rs +++ b/src/day01/part01a.rs @@ -1,16 +1,9 @@ -use std::fs::File; -use std::io::Read; -pub fn solve() -> u64 { +pub fn solve(puzzle: String) -> u64 { let mut solution: u64 = 0; - let mut file: File = File::open("src/day01/input01.txt").unwrap(); - let mut file_content: String = String::new(); - file.read_to_string(&mut file_content) - .expect("Can't read file"); - let mut dial: i32 = 50; - file_content.split("\n").enumerate().for_each(|(_, line)| { + puzzle.split("\n").enumerate().for_each(|(_, line)| { let direction: i32 = match &line[0..1] { "L" => -1, "R" => 1, @@ -24,5 +17,4 @@ pub fn solve() -> u64 { }); solution -} - +} \ No newline at end of file diff --git a/src/day01/src/part01b.rs b/src/day01/part01b.rs similarity index 67% rename from src/day01/src/part01b.rs rename to src/day01/part01b.rs index ec8d7bf..c82fa72 100644 --- a/src/day01/src/part01b.rs +++ b/src/day01/part01b.rs @@ -1,16 +1,9 @@ -use std::fs::File; -use std::io::Read; -pub fn solve() -> u64 { +pub fn solve(puzzle: String) -> u64 { let mut solution: u64 = 0; - let mut file: File = File::open("src/day01/input01.txt").unwrap(); - let mut file_content: String = String::new(); - file.read_to_string(&mut file_content) - .expect("Can't read file"); - let mut dial: i32 = 50; - file_content.split("\n").enumerate().for_each(|(_, line)| { + puzzle.split("\n").enumerate().for_each(|(_, line)| { let direction: i32 = match &line[0..1] { "L" => -1, "R" => 1, @@ -36,5 +29,4 @@ pub fn solve() -> u64 { }); solution -} - +} \ No newline at end of file diff --git a/src/day01/src/lib.rs b/src/day01/src/lib.rs deleted file mode 100644 index b7c7d70..0000000 --- a/src/day01/src/lib.rs +++ /dev/null @@ -1,2 +0,0 @@ -pub mod part01a; -pub mod part01b; \ No newline at end of file diff --git a/src/day02/Cargo.lock b/src/day02/Cargo.lock deleted file mode 100644 index 2762917..0000000 --- a/src/day02/Cargo.lock +++ /dev/null @@ -1,7 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -version = 4 - -[[package]] -name = "day02" -version = "0.1.0" diff --git a/src/day02/Cargo.toml b/src/day02/Cargo.toml deleted file mode 100644 index 3304419..0000000 --- a/src/day02/Cargo.toml +++ /dev/null @@ -1,6 +0,0 @@ -[package] -name = "day02" -version = "0.1.0" -edition = "2024" - -[dependencies] diff --git a/src/day02/mod.rs b/src/day02/mod.rs new file mode 100644 index 0000000..d8aa66c --- /dev/null +++ b/src/day02/mod.rs @@ -0,0 +1,19 @@ +pub mod part02a; +pub mod part02b; + +#[cfg(test)] +mod tests { + use crate::day02::{part02a, part02b}; + + const PUZZLE: &str = "11-22,95-115,998-1012,1188511880-1188511890,222220-222224,1698522-1698528,446443-446449,38593856-38593862,565653-565659,824824821-824824827,2121212118-2121212124"; + + #[test] + fn part02a() { + assert_eq!(part02a::solve(PUZZLE.to_string()), 1227775554); + } + + #[test] + fn part02b() { + assert_eq!(part02b::solve(PUZZLE.to_string()), 4174379265); + } +} \ No newline at end of file diff --git a/src/day02/src/part02a.rs b/src/day02/part02a.rs similarity index 67% rename from src/day02/src/part02a.rs rename to src/day02/part02a.rs index 7123b67..3fca729 100644 --- a/src/day02/src/part02a.rs +++ b/src/day02/part02a.rs @@ -1,15 +1,8 @@ -use std::fs::File; -use std::io::Read; -pub fn solve() -> u64 { +pub fn solve(puzzle: String) -> u64 { let mut solution: u64 = 0; - let mut file: File = File::open("src/day02/input02.txt").unwrap(); - let mut file_content: String = String::new(); - file.read_to_string(&mut file_content) - .expect("Can't read file"); - - file_content.split(",").for_each(|id_range| { + puzzle.split(",").for_each(|id_range| { match id_range.split_once("-") { Some((a, b)) => { a.parse::().expect("invalid range start") diff --git a/src/day02/src/part02b.rs b/src/day02/part02b.rs similarity index 79% rename from src/day02/src/part02b.rs rename to src/day02/part02b.rs index e1febee..7c95b75 100644 --- a/src/day02/src/part02b.rs +++ b/src/day02/part02b.rs @@ -1,15 +1,8 @@ -use std::fs::File; -use std::io::Read; -pub fn solve() -> u64 { +pub fn solve(puzzle: String) -> u64 { let mut solution: u64 = 0; - let mut file: File = File::open("src/day02/input02.txt").unwrap(); - let mut file_content: String = String::new(); - file.read_to_string(&mut file_content) - .expect("Can't read file"); - - file_content.split(",").for_each(|id_range| { + puzzle.split(",").for_each(|id_range| { match id_range.split_once("-") { Some((a, b)) => { a.parse::().expect("invalid range start") diff --git a/src/day02/src/lib.rs b/src/day02/src/lib.rs deleted file mode 100644 index f89298c..0000000 --- a/src/day02/src/lib.rs +++ /dev/null @@ -1,2 +0,0 @@ -pub mod part02a; -pub mod part02b; \ No newline at end of file diff --git a/src/day03/Cargo.lock b/src/day03/Cargo.lock deleted file mode 100644 index 169f416..0000000 --- a/src/day03/Cargo.lock +++ /dev/null @@ -1,16 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -version = 4 - -[[package]] -name = "day03" -version = "0.1.0" -dependencies = [ - "iter-first-max", -] - -[[package]] -name = "iter-first-max" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42ace18d32276b4ce7d8261c06b376398a4ea82e4715a5b37e46fddbff41a617" diff --git a/src/day03/Cargo.toml b/src/day03/Cargo.toml deleted file mode 100644 index 9375cc7..0000000 --- a/src/day03/Cargo.toml +++ /dev/null @@ -1,7 +0,0 @@ -[package] -name = "day03" -version = "0.1.0" -edition = "2024" - -[dependencies] -iter-first-max = "0.1.2" diff --git a/src/day03/mod.rs b/src/day03/mod.rs new file mode 100644 index 0000000..64289a0 --- /dev/null +++ b/src/day03/mod.rs @@ -0,0 +1,22 @@ +pub mod part03a; +pub mod part03b; + +#[cfg(test)] +mod tests { + use crate::day03::{part03a, part03b}; + + const PUZZLE: &str = "987654321111111 +811111111111119 +234234234234278 +818181911112111"; + + #[test] + fn part03a() { + assert_eq!(part03a::solve(PUZZLE.to_string()), 357); + } + + #[test] + fn part03b() { + assert_eq!(part03b::solve(PUZZLE.to_string()), 3121910778619); + } +} \ No newline at end of file diff --git a/src/day03/src/part03a.rs b/src/day03/part03a.rs similarity index 66% rename from src/day03/src/part03a.rs rename to src/day03/part03a.rs index fb4b6a1..72f83e1 100644 --- a/src/day03/src/part03a.rs +++ b/src/day03/part03a.rs @@ -1,16 +1,9 @@ use iter_first_max::IterFirstMaxExt; -use std::fs::File; -use std::io::Read; -pub fn solve() -> u64 { +pub fn solve(puzzle: String) -> u64 { let mut solution: u64 = 0; - let mut file: File = File::open("src/day03/input03.txt").unwrap(); - let mut file_content: String = String::new(); - file.read_to_string(&mut file_content) - .expect("Can't read file"); - - file_content.lines().for_each(|battery_bank| { + puzzle.lines().for_each(|battery_bank| { let batteries = battery_bank .chars() .map(|c| c as u8 - 0x30) diff --git a/src/day03/src/part03b.rs b/src/day03/part03b.rs similarity index 78% rename from src/day03/src/part03b.rs rename to src/day03/part03b.rs index 9e191ed..8ee8a7b 100644 --- a/src/day03/src/part03b.rs +++ b/src/day03/part03b.rs @@ -1,6 +1,4 @@ use iter_first_max::IterFirstMaxExt; -use std::fs::File; -use std::io::Read; fn get_n_max(vec: &Vec, n: usize) -> Vec { let mut n = n; @@ -33,15 +31,10 @@ fn get_n_max(vec: &Vec, n: usize) -> Vec { max } -pub fn solve() -> u64 { +pub fn solve(puzzle: String) -> u64 { let mut solution: u64 = 0; - let mut file: File = File::open("src/day03/input03.txt").unwrap(); - let mut file_content: String = String::new(); - file.read_to_string(&mut file_content) - .expect("Can't read file"); - - file_content.lines().for_each(|battery_bank| { + puzzle.lines().for_each(|battery_bank| { let batteries = battery_bank .chars() .map(|c| c as u8 - 0x30) diff --git a/src/day03/src/lib.rs b/src/day03/src/lib.rs deleted file mode 100644 index 8c58ef6..0000000 --- a/src/day03/src/lib.rs +++ /dev/null @@ -1,2 +0,0 @@ -pub mod part03a; -pub mod part03b; \ No newline at end of file diff --git a/src/day04/Cargo.lock b/src/day04/Cargo.lock deleted file mode 100644 index de1e82f..0000000 --- a/src/day04/Cargo.lock +++ /dev/null @@ -1,7 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -version = 4 - -[[package]] -name = "day04" -version = "0.1.0" diff --git a/src/day04/Cargo.toml b/src/day04/Cargo.toml deleted file mode 100644 index a3cc735..0000000 --- a/src/day04/Cargo.toml +++ /dev/null @@ -1,6 +0,0 @@ -[package] -name = "day04" -version = "0.1.0" -edition = "2024" - -[dependencies] diff --git a/src/day04/mod.rs b/src/day04/mod.rs new file mode 100644 index 0000000..9978634 --- /dev/null +++ b/src/day04/mod.rs @@ -0,0 +1,29 @@ +pub mod part04a; +pub mod part04b; + +#[cfg(test)] +mod tests { + use crate::day04::{part04a, part04b}; + + const PUZZLE: &str = "..@@.@@@@. +@@@.@.@.@@ +@@@@@.@.@@ +@.@@@@..@. +@@.@@@@.@@ +.@@@@@@@.@ +.@.@.@.@@@ +@.@@@.@@@@ +.@@@@@@@@. +@.@.@@@.@."; + + #[test] + fn part04a() { + assert_eq!(part04a::solve(PUZZLE.to_string()), 13); + } + + #[test] + #[ignore] + fn part04b() { + assert_eq!(part04b::solve(PUZZLE.to_string()), 43); + } +} \ No newline at end of file diff --git a/src/day04/src/part04a.rs b/src/day04/part04a.rs similarity index 71% rename from src/day04/src/part04a.rs rename to src/day04/part04a.rs index dd6fd22..a7130b0 100644 --- a/src/day04/src/part04a.rs +++ b/src/day04/part04a.rs @@ -1,18 +1,11 @@ -use std::fs::File; -use std::io::Read; -pub fn solve() -> u64 { +pub fn solve(puzzle: String) -> u64 { let mut solution: u64 = 0; - let mut file: File = File::open("src/day04/input04.txt").unwrap(); - let mut file_content: String = String::new(); - file.read_to_string(&mut file_content) - .expect("Can't read file"); - - let mut rows: Vec> = Vec::with_capacity(file_content.len() + 2); - rows.push(vec![0u8; file_content.len()]); + let mut rows: Vec> = Vec::with_capacity(puzzle.len() + 2); + rows.push(vec![0u8; puzzle.len()]); rows.append( - &mut file_content + &mut puzzle .lines() .map(|line| { let mut col: Vec = Vec::with_capacity(line.len() + 2); @@ -31,7 +24,7 @@ pub fn solve() -> u64 { }) .collect(), ); - rows.push(vec![0u8; file_content.len()]); + rows.push(vec![0u8; puzzle.len()]); rows.windows(3).for_each(|rows| { rows[0] diff --git a/src/day04/part04b.rs b/src/day04/part04b.rs new file mode 100644 index 0000000..10fe1d8 --- /dev/null +++ b/src/day04/part04b.rs @@ -0,0 +1,7 @@ + +pub fn solve(puzzle: String) -> u64 { + 0 // TODO +} + + + diff --git a/src/day04/src/lib.rs b/src/day04/src/lib.rs deleted file mode 100644 index b2d3085..0000000 --- a/src/day04/src/lib.rs +++ /dev/null @@ -1,3 +0,0 @@ -pub mod part04a; -pub mod part04b; - diff --git a/src/day04/src/part04b.rs b/src/day04/src/part04b.rs deleted file mode 100644 index fc9e012..0000000 --- a/src/day04/src/part04b.rs +++ /dev/null @@ -1,16 +0,0 @@ -use std::fs::File; -use std::io::Read; - -pub fn solve() -> u64 { - let mut solution: u64 = 0; - - let mut file: File = File::open("src/day04/input04.txt").unwrap(); - let mut file_content: String = String::new(); - file.read_to_string(&mut file_content) - .expect("Can't read file"); - - solution -} - - - diff --git a/src/day05/Cargo.lock b/src/day05/Cargo.lock deleted file mode 100644 index de1e82f..0000000 --- a/src/day05/Cargo.lock +++ /dev/null @@ -1,7 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -version = 4 - -[[package]] -name = "day04" -version = "0.1.0" diff --git a/src/day05/Cargo.toml b/src/day05/Cargo.toml deleted file mode 100644 index 4dee21c..0000000 --- a/src/day05/Cargo.toml +++ /dev/null @@ -1,6 +0,0 @@ -[package] -name = "day05" -version = "0.1.0" -edition = "2024" - -[dependencies] diff --git a/src/day05/mod.rs b/src/day05/mod.rs new file mode 100644 index 0000000..5e07cb7 --- /dev/null +++ b/src/day05/mod.rs @@ -0,0 +1,31 @@ +pub mod part05a; +pub mod part05b; + +#[cfg(test)] +mod tests { + use crate::day05::{part05a, part05b}; + + const PUZZLE: &str = "3-5 +10-14 +16-20 +12-18 + +1 +5 +8 +11 +17 +32"; + + #[test] + #[ignore] + fn part05a() { + assert_eq!(part05a::solve(PUZZLE.to_string()), 3); + } + + #[test] + #[ignore] + fn part05b() { + assert_eq!(part05b::solve(PUZZLE.to_string()), todo!()); + } +} \ No newline at end of file diff --git a/src/day05/part05a.rs b/src/day05/part05a.rs new file mode 100644 index 0000000..986c86a --- /dev/null +++ b/src/day05/part05a.rs @@ -0,0 +1,4 @@ + +pub fn solve(puzzle: String) -> u64 { + 0 // TODO +} diff --git a/src/day05/part05b.rs b/src/day05/part05b.rs new file mode 100644 index 0000000..10fe1d8 --- /dev/null +++ b/src/day05/part05b.rs @@ -0,0 +1,7 @@ + +pub fn solve(puzzle: String) -> u64 { + 0 // TODO +} + + + diff --git a/src/day05/src/lib.rs b/src/day05/src/lib.rs deleted file mode 100644 index 59d552e..0000000 --- a/src/day05/src/lib.rs +++ /dev/null @@ -1,3 +0,0 @@ -pub mod part05a; -pub mod part05b; - diff --git a/src/day05/src/part05a.rs b/src/day05/src/part05a.rs deleted file mode 100644 index ec3ac1c..0000000 --- a/src/day05/src/part05a.rs +++ /dev/null @@ -1,13 +0,0 @@ -use std::fs::File; -use std::io::Read; - -pub fn solve() -> u64 { - let mut solution: u64 = 0; - - let mut file: File = File::open("src/day05/input05.txt").unwrap(); - let mut file_content: String = String::new(); - file.read_to_string(&mut file_content) - .expect("Can't read file"); - - solution -} diff --git a/src/day05/src/part05b.rs b/src/day05/src/part05b.rs deleted file mode 100644 index 0f0882f..0000000 --- a/src/day05/src/part05b.rs +++ /dev/null @@ -1,16 +0,0 @@ -use std::fs::File; -use std::io::Read; - -pub fn solve() -> u64 { - let mut solution: u64 = 0; - - let mut file: File = File::open("src/day05/input05.txt").unwrap(); - let mut file_content: String = String::new(); - file.read_to_string(&mut file_content) - .expect("Can't read file"); - - solution -} - - - diff --git a/src/day06/Cargo.lock b/src/day06/Cargo.lock deleted file mode 100644 index de1e82f..0000000 --- a/src/day06/Cargo.lock +++ /dev/null @@ -1,7 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -version = 4 - -[[package]] -name = "day04" -version = "0.1.0" diff --git a/src/day06/Cargo.toml b/src/day06/Cargo.toml deleted file mode 100644 index 8fde244..0000000 --- a/src/day06/Cargo.toml +++ /dev/null @@ -1,7 +0,0 @@ -[package] -name = "day06" -version = "0.1.0" -edition = "2024" - -[dependencies] -itertools = "0.14.0" \ No newline at end of file diff --git a/src/day06/day6.py b/src/day06/day6.py deleted file mode 100644 index c663009..0000000 --- a/src/day06/day6.py +++ /dev/null @@ -1,43 +0,0 @@ -import math -import time -from itertools import zip_longest - -if __name__ == "__main__": - solution = 0 - with open("input06.txt", "r") as f: - start = time.time() - for equation in zip(*(line.split() for line in f.readlines())): - it = (int(e) for e in equation[:-1]) - if equation[-1] == "+": - solution += sum(it) - if equation[-1] == "*": - solution += math.prod(it) - - print(time.time() - start) - - print(solution) - - # ---------- - - solution = 0 - with open("input06.txt", "r") as f: - start = time.time() - operator = " " - temp = 0 - for col in zip_longest(*f.readlines(), fillvalue=" "): - if col[4] != " ": - operator = col[4] - solution += temp - temp = 0 if col[4] == "+" else 1 - - try: - if operator == "+": - temp += int("".join(col[:4])) - if operator == "*": - temp *= int("".join(col[:4])) - except: - pass - solution += temp - print(time.time() - start) - - print(solution) \ No newline at end of file diff --git a/src/day06/mod.rs b/src/day06/mod.rs new file mode 100644 index 0000000..892ddf4 --- /dev/null +++ b/src/day06/mod.rs @@ -0,0 +1,22 @@ +pub mod part06a; +pub mod part06b; + +#[cfg(test)] +mod tests { + use crate::day06::{part06a, part06b}; + + const PUZZLE: &str = "123 328 51 64 + 45 64 387 23 + 6 98 215 314 +* + * + "; + + #[test] + fn part06a() { + assert_eq!(part06a::solve(PUZZLE.to_string()), 4277556); + } + + #[test] + fn part06b() { + assert_eq!(part06b::solve(PUZZLE.to_string()), 3263827); + } +} \ No newline at end of file diff --git a/src/day06/src/part06a.rs b/src/day06/part06a.rs similarity index 68% rename from src/day06/src/part06a.rs rename to src/day06/part06a.rs index f2fd51e..2df842a 100644 --- a/src/day06/src/part06a.rs +++ b/src/day06/part06a.rs @@ -1,13 +1,6 @@ -use std::fs::File; -use std::io::Read; -pub fn solve() -> u64 { - let mut file: File = File::open("src/day06/input06.txt").unwrap(); - let mut file_content: String = String::new(); - file.read_to_string(&mut file_content) - .expect("Can't read file"); - - let mut iters: Vec<_> = file_content +pub fn solve(puzzle: String) -> u64 { + let mut iters: Vec<_> = puzzle .lines() .map(|line| line.split_whitespace()) .collect(); diff --git a/src/day06/src/part06b.rs b/src/day06/part06b.rs similarity index 82% rename from src/day06/src/part06b.rs rename to src/day06/part06b.rs index e5396bf..09c6a50 100644 --- a/src/day06/src/part06b.rs +++ b/src/day06/part06b.rs @@ -1,16 +1,9 @@ -use std::fs::File; -use std::io::Read; use itertools::Itertools; -pub fn solve() -> u64 { +pub fn solve(puzzle: String) -> u64 { let mut solution: u64 = 0; - let mut file: File = File::open("src/day06/input06.txt").unwrap(); - let mut file_content: String = String::new(); - file.read_to_string(&mut file_content) - .expect("Can't read file"); - - file_content + puzzle .lines() .map(|line| line.chars()) .tuple_windows::<(_, _, _, _, _)>() diff --git a/src/day06/src/lib.rs b/src/day06/src/lib.rs deleted file mode 100644 index 1125371..0000000 --- a/src/day06/src/lib.rs +++ /dev/null @@ -1,3 +0,0 @@ -pub mod part06a; -pub mod part06b; - diff --git a/src/day09/mod.rs b/src/day09/mod.rs new file mode 100644 index 0000000..2aa472c --- /dev/null +++ b/src/day09/mod.rs @@ -0,0 +1,27 @@ +pub mod part09a; +pub mod part09b; + +#[cfg(test)] +mod tests { + use crate::day09::{part09a, part09b}; + + const PUZZLE: &str = "7,1 +11,1 +11,7 +9,7 +9,5 +2,5 +2,3 +7,3"; + + #[test] + fn part09a() { + assert_eq!(part09a::solve(PUZZLE.to_string()), 50); + } + + #[test] + #[ignore] + fn part09b() { + assert_eq!(part09b::solve(PUZZLE.to_string()), 24); + } +} \ No newline at end of file diff --git a/src/day09/part09a.rs b/src/day09/part09a.rs new file mode 100644 index 0000000..5d61cf0 --- /dev/null +++ b/src/day09/part09a.rs @@ -0,0 +1,19 @@ +use std::ops::Add; + +pub fn solve(puzzle: String) -> u64 { + let mut solution: u64 = 0; + + let points = puzzle + .lines() + .map(|line| line.split_once(',').unwrap()) + .map(|(left, right)| (left.parse::().unwrap(), right.parse::().unwrap())) + .collect::>(); + + points.iter().enumerate().for_each(|(i, point1)| { + points.iter().skip(i).for_each(|point2| { + solution = solution.max(point1.0.abs_diff(point2.0).add(1) * point1.1.abs_diff(point2.1).add(1)); + }) + }); + + solution +} diff --git a/src/day09/part09b.rs b/src/day09/part09b.rs new file mode 100644 index 0000000..10fe1d8 --- /dev/null +++ b/src/day09/part09b.rs @@ -0,0 +1,7 @@ + +pub fn solve(puzzle: String) -> u64 { + 0 // TODO +} + + + diff --git a/src/main.rs b/src/main.rs index 71166a1..24a895b 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,9 +1,10 @@ -use day01::{part01a, part01b}; -use day02::{part02a, part02b}; -use day03::{part03a, part03b}; -use day04::{part04a, part04b}; -use day05::{part05a, part05b}; -use day06::{part06a, part06b}; +mod day01; +mod day02; +mod day03; +mod day04; +mod day05; +mod day06; +mod day09; use std::time::Instant; use std::fs::OpenOptions; @@ -20,28 +21,31 @@ fn main() { file.write_all(b"# Advent of Code 2025\n```bash\n") .expect("Cannot write to file"); - let exercises: Vec<(&str, fn() -> u64)> = vec![ - ("day01:A", part01a::solve), - ("day01:B", part01b::solve), - ("day02:A", part02a::solve), - ("day02:B", part02b::solve), - ("day03:A", part03a::solve), - ("day03:B", part03b::solve), - ("day04:A", part04a::solve), - ("day04:B", part04b::solve), - ("day05:A", part05a::solve), - ("day05:B", part05b::solve), - ("day06:A", part06a::solve), - ("day06:B", part06b::solve), + let exercises: Vec<(&str, fn(String) -> u64, &str)> = vec![ + ("day01:A", day01::part01a::solve, "puzzles/input01.txt"), + ("day01:B", day01::part01a::solve, "puzzles/input01.txt"), + ("day02:A", day02::part02a::solve, "puzzles/input02.txt"), + ("day02:B", day02::part02b::solve, "puzzles/input02.txt"), + ("day03:A", day03::part03a::solve, "puzzles/input03.txt"), + ("day03:B", day03::part03b::solve, "puzzles/input03.txt"), + ("day04:A", day04::part04a::solve, "puzzles/input04.txt"), + ("day04:B", day04::part04b::solve, "puzzles/input04.txt"), + ("day05:A", day05::part05a::solve, "puzzles/input05.txt"), + ("day05:B", day05::part05b::solve, "puzzles/input05.txt"), + ("day06:A", day06::part06a::solve, "puzzles/input06.txt"), + ("day06:B", day06::part06b::solve, "puzzles/input06.txt"), + ("day09:A", day09::part09a::solve, "puzzles/input09.txt"), + ("day09:B", day09::part09b::solve, "puzzles/input09.txt"), ]; let start: Instant = Instant::now(); - exercises.iter().for_each(|(day, func)| { + exercises.iter().for_each(|(day, func, filename)| { + let file_content = std::fs::read_to_string(filename).expect("Cannot read file"); let day_start: Instant = Instant::now(); let solution = format!( "{:7} => {:15} ({:6}us)\n", day, - func(), + func(file_content), day_start.elapsed().as_micros() ); print!("{}", solution); diff --git a/src/day01/story01a.txt b/story/story01a.txt similarity index 100% rename from src/day01/story01a.txt rename to story/story01a.txt diff --git a/src/day01/story01b.txt b/story/story01b.txt similarity index 100% rename from src/day01/story01b.txt rename to story/story01b.txt diff --git a/src/day02/story02a.txt b/story/story02a.txt similarity index 100% rename from src/day02/story02a.txt rename to story/story02a.txt diff --git a/src/day02/story02b.txt b/story/story02b.txt similarity index 100% rename from src/day02/story02b.txt rename to story/story02b.txt diff --git a/src/day03/story03a.txt b/story/story03a.txt similarity index 100% rename from src/day03/story03a.txt rename to story/story03a.txt diff --git a/src/day03/story03b.txt b/story/story03b.txt similarity index 100% rename from src/day03/story03b.txt rename to story/story03b.txt diff --git a/src/day04/story04a.txt b/story/story04a.txt similarity index 100% rename from src/day04/story04a.txt rename to story/story04a.txt diff --git a/src/day04/story04b.txt b/story/story04b.txt similarity index 100% rename from src/day04/story04b.txt rename to story/story04b.txt diff --git a/src/day05/story05a.txt b/story/story05a.txt similarity index 100% rename from src/day05/story05a.txt rename to story/story05a.txt diff --git a/src/day05/story05b.txt b/story/story05b.txt similarity index 100% rename from src/day05/story05b.txt rename to story/story05b.txt diff --git a/src/day06/story06a.txt b/story/story06a.txt similarity index 100% rename from src/day06/story06a.txt rename to story/story06a.txt diff --git a/src/day06/story06b.txt b/story/story06b.txt similarity index 100% rename from src/day06/story06b.txt rename to story/story06b.txt diff --git a/story/story09a.txt b/story/story09a.txt new file mode 100644 index 0000000..e69de29 diff --git a/story/story09b.txt b/story/story09b.txt new file mode 100644 index 0000000..e69de29