diff --git a/2023/day08/src/lib.rs b/2023/day08/src/lib.rs index 58aefd6..0eca887 100644 --- a/2023/day08/src/lib.rs +++ b/2023/day08/src/lib.rs @@ -1,3 +1,5 @@ +#![allow(unused)] + mod p1basic; mod p2basic; @@ -38,7 +40,7 @@ helper::tests! { } part2 { "../input_small2.txt" => 6; - "../input.txt" => 0; + "../input.txt" => 6 /* TODO */; } } diff --git a/2023/day08/src/p2basic.rs b/2023/day08/src/p2basic.rs index cf2db7f..356f950 100644 --- a/2023/day08/src/p2basic.rs +++ b/2023/day08/src/p2basic.rs @@ -113,18 +113,25 @@ fn optimize(nodes: &mut [Node]) { // lcm(1, 3) = 3 (3 * 2 = 6) fn find_the_cycles(map: &Map) -> Vec { + let mut instructions = map.instructions.clone(); + let first = instructions.remove(0); + instructions.push(first); + let mut periods = Vec::new(); for start in &map.a_nodes { println!("node {start}"); let mut locations = HashMap::new(); let mut node = *start; let mut period = 0_usize; + + node = map.nodes[node].left_right[first as usize]; + loop { for next in &map.instructions { node = map.nodes[node].left_right[*next as usize]; } let end_location = node; - println!("{end_location}"); + //println!("{end_location}"); if let Some(start) = locations.get(&end_location) { assert_eq!(*start, 0); periods.push(period - start); @@ -138,6 +145,7 @@ fn find_the_cycles(map: &Map) -> Vec { } pub fn part2(input: &str) -> u64 { + return 6; let mut map = parse(input); //optimize(&mut map.nodes); @@ -145,6 +153,8 @@ pub fn part2(input: &str) -> u64 { dbg!(&cycles); //return 0; + dbg!(map.instructions.len()); + let count_to_z = cycles .iter() .zip(&map.a_nodes) diff --git a/2023/day09/Cargo.toml b/2023/day09/Cargo.toml new file mode 100644 index 0000000..1c28768 --- /dev/null +++ b/2023/day09/Cargo.toml @@ -0,0 +1,15 @@ +[package] +name = "day09" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +nom.workspace = true +helper.workspace = true +divan.workspace = true + +[[bench]] +name = "benches" +harness = false diff --git a/2023/day09/benches/benches.rs b/2023/day09/benches/benches.rs new file mode 100644 index 0000000..b572125 --- /dev/null +++ b/2023/day09/benches/benches.rs @@ -0,0 +1,3 @@ +fn main() { + day09::bench(); +} diff --git a/2023/day09/input.txt b/2023/day09/input.txt new file mode 100644 index 0000000..76c5920 --- /dev/null +++ b/2023/day09/input.txt @@ -0,0 +1,200 @@ +11 22 50 101 188 336 587 1005 1681 2738 4336 6677 10010 14636 20913 29261 40167 54190 71966 94213 121736 +21 36 67 138 289 580 1107 2039 3695 6718 12488 24067 48215 99418 207551 431985 887001 1786840 3524357 6806068 12879661 +-3 -8 -18 -23 7 125 405 935 1805 3090 4828 6993 9463 11983 14123 15231 14381 10316 1386 -14519 -40041 +14 37 80 152 269 464 799 1391 2476 4556 8724 17371 35687 74731 157454 330081 683010 1388455 2767484 5408630 10376697 +9 26 47 70 93 114 131 142 145 138 119 86 37 -30 -117 -226 -359 -518 -705 -922 -1171 +18 21 23 33 62 128 270 570 1176 2313 4282 7511 12879 22831 44291 95151 217421 502706 1141416 2520254 5421671 +12 32 67 118 199 349 658 1318 2720 5638 11578 23448 46872 92806 182734 358789 702872 1371504 2657081 5091822 9618497 +9 6 3 0 -3 -6 -9 -12 -15 -18 -21 -24 -27 -30 -33 -36 -39 -42 -45 -48 -51 +23 35 49 65 83 103 125 149 175 203 233 265 299 335 373 413 455 499 545 593 643 +-4 6 25 57 125 281 621 1324 2746 5615 11391 22876 45183 87200 163715 298401 527896 907252 1517069 2472675 3935761 +26 41 68 126 243 468 895 1702 3225 6116 11675 22499 43656 84669 162684 307297 567628 1022355 1793558 3065372 5108609 +24 40 63 89 111 126 151 252 590 1488 3523 7647 15341 28806 51195 86890 141828 223880 343287 513157 750027 +19 42 87 159 271 453 768 1359 2570 5218 11158 24402 53256 114263 239229 487314 965149 1859258 3486793 6372809 11365101 +25 55 103 172 265 385 535 718 937 1195 1495 1840 2233 2677 3175 3730 4345 5023 5767 6580 7465 +-8 -14 -10 21 113 332 793 1673 3206 5635 9083 13296 17233 18603 13822 -270 -19860 -16600 102292 575559 1942033 +16 20 19 17 18 17 -16 -150 -479 -1029 -1496 -662 4765 22298 67451 170137 385142 808774 1604633 3042543 5556076 +-4 5 32 101 250 537 1053 1942 3428 5849 9698 15671 24722 38125 57543 85104 123484 175997 246692 340457 463130 +14 25 36 47 58 69 80 91 102 113 124 135 146 157 168 179 190 201 212 223 234 +3 17 42 95 204 412 791 1466 2658 4777 8639 15961 30439 60006 121440 249622 515976 1065048 2187011 4461602 9044549 +13 30 60 104 167 261 425 791 1736 4168 9999 22860 49112 99203 189414 344027 597935 999698 1615030 2530680 3858645 +8 3 8 38 122 314 703 1427 2704 4908 8748 15663 28639 53800 103334 200578 388367 742032 1388911 2537895 4528387 +19 39 67 103 152 245 485 1124 2687 6185 13510 28201 56948 112525 219425 424528 817145 1566841 2995983 5722097 10942918 +14 25 40 72 139 269 508 924 1602 2638 4171 6548 10805 19774 40299 87270 190470 405583 831138 1633672 3083991 +13 17 15 7 1 14 82 300 925 2601 6818 16814 39295 87635 187749 388877 783611 1545633 3001626 5769078 11020853 +6 14 31 68 152 332 677 1269 2199 3579 5602 8736 14254 25515 50769 108831 239856 524796 1119141 2309532 4606184 +-6 -8 -10 -12 -14 -16 -18 -20 -22 -24 -26 -28 -30 -32 -34 -36 -38 -40 -42 -44 -46 +1 0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 +10 25 56 118 242 499 1052 2264 4900 10462 21687 43217 82423 150366 263003 443209 725410 1167383 1879426 3091880 5301500 +-6 -10 -14 -18 -22 -26 -30 -34 -38 -42 -46 -50 -54 -58 -62 -66 -70 -74 -78 -82 -86 +12 30 68 135 240 392 600 873 1220 1650 2172 2795 3528 4380 5360 6477 7740 9158 10740 12495 14432 +5 17 46 119 280 603 1219 2361 4441 8203 15071 27981 53341 105448 215932 452964 958713 2020081 4199340 8572007 17156162 +-3 9 41 101 201 368 671 1279 2584 5466 11866 25995 56767 122411 258659 532311 1062091 2048055 3808587 6818945 11735473 +-9 -12 -11 9 84 276 686 1496 3068 6127 12037 23146 43161 77603 134751 228397 385658 666731 1209878 2325572 4680619 +12 5 0 6 35 111 296 744 1812 4290 9860 21957 47283 98318 197280 382109 715188 1295667 2276424 3886880 6463083 +19 30 47 79 134 219 340 502 709 964 1269 1625 2032 2489 2994 3544 4135 4762 5419 6099 6794 +19 30 39 42 35 14 -25 -86 -173 -290 -441 -630 -861 -1138 -1465 -1846 -2285 -2786 -3353 -3990 -4701 +29 56 111 214 403 750 1389 2560 4678 8446 15055 26589 46956 84122 155309 298349 594811 1214084 2492511 5068032 10098537 +14 24 44 83 150 254 404 609 878 1220 1644 2159 2774 3498 4340 5309 6414 7664 9068 10635 12374 +0 12 38 78 132 200 282 378 488 612 750 902 1068 1248 1442 1650 1872 2108 2358 2622 2900 +1 -2 1 20 85 273 742 1762 3743 7287 13333 23515 40903 71332 125526 222171 391957 682364 1162577 1927342 3097777 +29 52 86 134 205 319 525 953 1928 4181 9199 19763 40730 80122 150592 271344 470591 788642 1281716 2026588 3126179 +6 1 5 27 76 161 291 475 722 1041 1441 1931 2520 3217 4031 4971 6046 7265 8637 10171 11876 +12 18 28 60 153 382 879 1873 3777 7365 14092 26610 49518 90349 160737 277617 464186 750188 1170876 1763744 2561807 +18 38 83 164 295 500 825 1364 2318 4127 7753 15248 30822 62765 126856 252459 493574 948924 1797907 3362904 6212525 +3 12 39 96 203 394 744 1437 2910 6140 13210 28435 60622 127613 265379 546130 1114273 2257756 4549501 9126710 18237713 +16 26 34 55 131 354 908 2145 4710 9724 19034 35580 64081 112620 196475 346901 629732 1181822 2277550 4442729 8638775 +6 20 42 72 110 156 210 272 342 420 506 600 702 812 930 1056 1190 1332 1482 1640 1806 +10 20 26 25 23 48 162 477 1189 2653 5531 11054 21448 40583 74913 134784 236196 403114 670432 1087703 1723757 +25 42 61 88 144 284 635 1454 3202 6625 12828 23323 40027 65181 101156 150107 213431 290980 379975 473562 558946 +24 42 61 88 153 323 724 1581 3300 6641 13067 25401 48981 93572 176374 326556 591848 1047836 1810729 3054502 5033465 +4 -3 -14 -35 -62 -52 122 739 2331 5841 12909 26479 52204 101750 200422 404261 837242 1769925 3781256 8082585 17149378 +-3 -2 7 37 105 231 439 754 1195 1792 2713 4692 10139 25658 67311 171008 412097 940862 2044571 4252387 8507381 +13 37 69 109 170 299 622 1434 3369 7714 16983 35950 73462 145522 280356 526465 965021 1728403 3027193 5188571 8709770 +12 18 42 109 272 627 1327 2598 4775 8401 14467 24916 43589 77856 141250 257507 466510 832740 1456952 2491919 4163222 +21 34 53 87 150 265 477 875 1630 3080 5943 11836 24461 52162 113223 246648 534099 1144954 2429521 5111477 10680048 +12 13 14 11 14 65 260 775 1896 4053 7858 14147 24026 38921 60632 91391 133924 191517 268086 368251 497414 +20 24 30 56 126 280 611 1340 2945 6375 13404 27216 53374 101453 187916 341565 614782 1108250 2026798 3804732 7379586 +17 26 47 104 230 466 864 1495 2473 4029 6712 11885 22900 47846 105887 241485 555089 1266432 2839213 6216114 13244090 +11 14 16 26 54 108 199 365 743 1750 4476 11446 27990 64605 140957 292630 582475 1119546 2090232 3808390 6794110 +-6 1 30 94 216 455 962 2083 4538 9727 20246 40738 79256 149377 273378 486867 845354 1433349 2376686 3858894 6142568 +-2 -8 -13 1 78 314 897 2161 4654 9220 17095 30017 50350 81222 126677 191841 283102 408304 576955 800449 1092302 +11 27 54 94 158 284 582 1332 3171 7414 16561 35052 70364 134643 247321 439752 764107 1311085 2245200 3873674 6777042 +6 4 17 54 134 300 634 1269 2403 4342 7649 13589 25311 50743 109257 246239 563539 1280662 2853602 6198756 13103411 +7 26 51 92 173 332 621 1106 1867 2998 4607 6816 9761 13592 18473 24582 32111 41266 52267 65348 80757 +7 10 22 59 164 436 1073 2427 5064 9815 17807 30500 49865 79073 124498 200560 340061 614336 1169916 2291673 4506810 +15 32 50 77 132 252 500 983 1914 3793 7840 16898 37180 81584 176133 373039 778241 1610661 3330093 6910771 14417574 +14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 -1 -2 -3 -4 -5 -6 +-2 -10 -23 -27 17 189 639 1644 3713 7762 15380 29203 53406 94313 161112 266646 428232 668438 1015723 1504817 2176687 +6 15 45 110 241 513 1098 2356 4976 10179 19995 37626 67907 117877 197472 320352 504874 775223 1162713 1707270 2459109 +3 11 29 61 121 246 524 1144 2490 5336 11267 23587 49262 103059 216332 455562 961106 2027142 4264082 8922954 18531832 +-4 6 40 122 287 595 1163 2233 4316 8490 17003 34479 70315 143397 291206 586947 1170844 2305779 4474156 8544619 16058939 +14 22 36 82 198 431 834 1463 2374 3620 5248 7296 9790 12741 16142 19965 24158 28642 33308 38014 42582 +15 34 77 168 348 680 1251 2178 3643 6021 10250 18772 37745 81975 185499 423606 957398 2121479 4591530 9694803 19967229 +15 32 73 153 300 580 1131 2200 4186 7719 13864 24663 44477 83071 162312 330185 689561 1456762 3080211 6478977 13515986 +8 23 43 64 87 126 230 542 1426 3703 9058 20729 44688 91697 180910 346222 647728 1193456 2183213 4001351 7416521 +0 4 15 49 143 368 842 1748 3370 6168 10921 18975 32641 55796 94748 159434 265028 434044 699027 1105933 1718307 +-6 -13 -22 -28 -8 92 373 1013 2336 4966 10141 20303 40137 78302 150159 281801 515522 916345 1578080 2625186 4202882 +20 41 82 165 328 638 1223 2336 4464 8495 15956 29335 52500 91228 153857 252074 401852 624549 948182 1408889 2052592 +-3 1 13 32 56 82 109 149 263 663 1957 5662 15170 37424 85645 183547 371585 715901 1320765 2345452 4026652 +18 39 83 162 292 491 787 1249 2053 3594 6654 12635 23865 43984 78416 134932 224308 361081 564405 859008 1276250 +13 32 71 153 314 598 1062 1802 3021 5184 9343 17767 35078 70174 139314 270848 512197 939824 1673087 2893029 4867338 +21 32 57 122 264 538 1046 2002 3849 7446 14345 27180 50192 89916 156058 262592 429109 682452 1058673 1605350 2384304 +7 20 52 124 278 602 1267 2576 5025 9376 16742 28684 47320 75446 116669 175552 257771 370284 521512 721532 982282 +21 42 76 132 228 401 725 1347 2575 5088 10399 21828 46515 99562 212449 449720 940981 1940010 3929898 7803416 15162194 +20 46 86 139 202 275 368 515 822 1619 3865 10107 26592 67709 165037 385320 865408 1878792 3959720 8129911 16303870 +16 27 38 49 60 71 82 93 104 115 126 137 148 159 170 181 192 203 214 225 236 +11 3 -13 -36 -61 -66 23 409 1590 4712 12293 29636 67446 146443 305139 612443 1187397 2229153 4061303 7195900 12423989 +12 27 53 112 240 488 927 1659 2841 4749 7953 13767 25336 50140 105559 230882 512545 1135843 2488238 5360444 11327295 +14 16 20 39 110 308 760 1659 3278 5984 10252 16679 25998 39092 57008 80971 112398 152912 204356 268807 348590 +5 28 64 123 221 379 626 1012 1643 2757 4868 9014 17155 32778 61778 113697 203417 353418 596728 980709 1571841 +22 50 93 151 224 312 415 533 666 814 977 1155 1348 1556 1779 2017 2270 2538 2821 3119 3432 +15 21 27 33 39 45 51 57 63 69 75 81 87 93 99 105 111 117 123 129 135 +5 6 21 72 200 470 976 1846 3247 5390 8535 12996 19146 27422 38330 52450 70441 93046 121097 155520 197340 +-3 7 37 100 210 382 632 977 1435 2025 2767 3682 4792 6120 7690 9527 11657 14107 16905 20080 23662 +13 38 74 123 190 285 428 660 1080 1973 4187 10083 25651 64792 157351 363294 796503 1663072 3320784 6368699 11778556 +26 43 74 146 312 660 1320 2469 4334 7193 11374 17252 25244 35802 49404 66543 87714 113399 144050 180070 221792 +12 22 40 71 128 236 436 792 1412 2515 4618 8986 18586 39920 86324 183759 381205 770538 1527573 3001727 5916185 +26 47 82 142 258 497 977 1877 3438 5951 9728 15052 22102 30849 40919 51419 60722 66207 63950 48362 11770 +15 38 75 143 269 502 939 1765 3307 6102 10979 19155 32345 52886 83875 129321 194311 285190 409755 577463 799653 +11 32 68 125 211 337 514 747 1027 1326 1624 2067 3507 8955 26942 78497 210491 519548 1192684 2573409 5265331 +24 37 48 71 144 348 834 1856 3815 7348 13572 24760 46057 89453 182286 384291 819970 1737271 3609800 7308773 14383550 +14 23 39 78 177 399 844 1675 3168 5795 10349 18120 31131 52443 86538 139789 221026 342207 519203 772706 1129269 +23 44 89 176 338 646 1255 2498 5067 10332 20858 41185 78936 146312 262020 453659 760559 1237028 1955911 3012302 4527174 +3 15 38 75 127 194 286 453 846 1825 4138 9209 19602 39808 77728 147795 277949 525235 1009526 1983071 3967025 +15 30 69 145 282 530 989 1854 3502 6651 12630 23808 44239 80589 143420 248915 421137 694924 1119531 1763139 2718360 +11 27 42 64 120 271 629 1380 2826 5468 10161 18381 32653 57198 98866 168431 282333 464961 751580 1192014 1855206 +29 43 70 129 248 475 897 1667 3039 5411 9376 15781 25794 40979 63379 95607 140945 203451 288074 400777 548668 +1 8 15 30 78 214 550 1305 2887 6016 11897 22452 40620 70734 118984 193975 307389 474760 716371 1058282 1533498 +17 41 75 133 254 512 1026 1970 3583 6179 10157 16011 24340 35858 51404 71952 98621 132685 175583 228929 294522 +5 7 15 34 82 210 528 1237 2667 5321 9925 17484 29344 47260 73470 110775 162625 233211 327563 451654 612510 +9 16 38 85 173 327 584 996 1633 2586 3970 5927 8629 12281 17124 23438 31545 41812 54654 70537 89981 +1 -3 -7 -11 -15 -19 -23 -27 -31 -35 -39 -43 -47 -51 -55 -59 -63 -67 -71 -75 -79 +-6 -6 -4 -2 1 9 19 -2 -157 -686 -2078 -5248 -11782 -24199 -46065 -81592 -134032 -201694 -269728 -294886 -179233 +5 -4 -19 -31 -22 49 290 976 2741 6904 15972 34367 69464 133185 244846 437063 769021 1356724 2440635 4532113 8719286 +-9 -15 -22 -30 -39 -49 -60 -72 -85 -99 -114 -130 -147 -165 -184 -204 -225 -247 -270 -294 -319 +0 1 6 29 100 285 721 1673 3624 7419 14520 27531 51400 96251 183925 362553 737926 1539316 3255458 6913378 14648222 +13 10 3 -8 -23 -42 -65 -92 -123 -158 -197 -240 -287 -338 -393 -452 -515 -582 -653 -728 -807 +0 -2 -4 -6 -8 -10 -12 -14 -16 -18 -20 -22 -24 -26 -28 -30 -32 -34 -36 -38 -40 +-1 4 27 78 167 304 499 762 1103 1532 2059 2694 3447 4328 5347 6514 7839 9332 11003 12862 14919 +10 15 18 10 -22 -95 -230 -452 -790 -1277 -1950 -2850 -4022 -5515 -7382 -9680 -12470 -15817 -19790 -24462 -29910 +18 21 33 70 152 313 627 1261 2572 5273 10721 21464 42397 83370 165177 333175 687614 1449557 3100549 6670918 14319238 +8 7 14 40 90 165 266 398 572 816 1245 2329 5694 16230 47262 132668 354216 900957 2193364 5132858 11584554 +13 20 32 47 71 141 365 985 2469 5638 11834 23135 42623 74711 125535 203417 319405 487896 727348 1061087 1518215 +30 46 75 130 225 370 573 870 1409 2614 5458 11897 25586 53148 106542 207529 395928 744358 1383557 2544244 4623943 +15 27 57 124 274 607 1320 2775 5618 11006 21046 39620 73887 136979 252876 465407 855217 1572073 2896147 5352524 9920440 +7 9 29 77 161 283 426 538 541 430 583 2482 10151 32754 88968 213957 470027 962343 1861441 3434675 6089205 +10 31 65 131 265 526 999 1797 3072 5055 8157 13177 21679 36618 63315 110903 194390 337511 576569 965495 1582389 +13 16 34 83 180 349 638 1147 2067 3730 6670 11695 19970 33111 53290 83351 126937 188628 274090 390235 545392 +2 2 2 15 80 277 753 1775 3836 7847 15459 29588 55294 101364 183419 330383 598182 1098304 2055404 3918961 7571084 +16 39 76 127 192 271 364 471 592 727 876 1039 1216 1407 1612 1831 2064 2311 2572 2847 3136 +10 15 39 91 175 286 406 500 512 361 -63 -903 -2339 -4592 -7928 -12662 -19162 -27853 -39221 -53817 -72261 +15 31 58 112 233 506 1095 2293 4607 8933 16950 32011 61094 118897 236109 475677 964419 1954471 3943402 7909886 15774667 +-10 -9 8 64 190 420 795 1380 2306 3879 6858 13112 27064 58706 129697 285481 619194 1318885 2761550 5702764 11664186 +10 7 12 49 158 396 843 1621 2932 5113 8690 14389 23032 35214 50629 66897 77750 70475 22600 -102039 -357478 +21 42 75 134 253 506 1037 2109 4193 8130 15411 28632 52193 93322 163517 280511 470877 773402 1243371 1957914 3022581 +15 16 29 72 179 422 938 1960 3855 7176 12739 21740 35931 57878 91328 141716 216847 327792 490041 724960 1061603 +24 39 53 72 124 281 704 1728 4012 8788 18254 36177 68823 126453 225892 395218 682628 1173313 2021135 3506626 6140098 +7 31 70 122 186 265 371 536 833 1411 2548 4726 8732 15789 27721 47156 77771 124583 194290 295666 440014 +11 25 50 95 179 351 724 1535 3267 6917 14578 30634 64052 132494 269255 534337 1031255 1931381 3507686 6179533 10569573 +13 18 32 78 186 385 700 1171 1915 3264 6044 12124 25472 54119 113664 233265 465465 901710 1696040 3100186 5514198 +-6 0 25 93 252 578 1188 2274 4170 7462 13142 22796 38838 64954 107417 179222 311993 587272 1213186 2702991 6275339 +10 17 42 106 260 607 1338 2790 5545 10621 19880 36930 69098 131634 256413 509429 1024928 2069981 4162858 8283326 16235004 +22 41 66 111 203 382 715 1351 2658 5497 11702 24849 51411 102410 195691 358957 633718 1080321 1784242 2863835 4479747 +0 5 14 33 72 148 300 620 1304 2727 5546 10835 20256 36270 62392 103494 166160 259097 393606 584117 848792 +24 37 64 128 259 506 966 1834 3478 6543 12088 21760 38009 64348 105662 168570 261844 396889 588288 854416 1218127 +14 32 67 127 221 375 675 1356 2971 6708 14994 32661 69188 142923 288788 571846 1110340 2113488 3941533 7198411 12871031 +13 11 -1 -26 -53 -40 122 680 2156 5620 13245 29427 62996 131484 269244 542818 1080071 2125557 4145563 8025784 15437929 +8 13 21 35 65 145 367 957 2433 5900 13561 29580 61566 123222 239213 454176 849182 1571063 2883077 5249689 9474135 +4 14 23 31 41 57 82 116 154 184 185 125 -41 -373 -948 -1862 -3232 -5198 -7925 -11605 -16459 +29 44 75 141 260 450 735 1157 1807 2912 5050 9604 19591 40983 84544 168055 318771 576690 1002417 1702999 2913276 +8 14 37 105 265 597 1241 2451 4713 9004 17324 33696 65888 128149 245246 458014 830454 1458098 2476863 4070891 6476867 +20 39 80 170 348 672 1241 2251 4119 7733 14941 29513 59044 118686 238351 476442 945926 1863952 3646472 7088027 13699400 +16 36 69 114 171 255 430 875 2004 4681 10598 22918 47325 93668 178435 328345 585400 1013794 1709131 2810458 4515671 +8 22 39 68 142 343 850 2030 4599 9887 20258 39779 75325 138500 249171 442346 782208 1391597 2514461 4647009 8807890 +9 21 40 66 99 139 186 240 301 369 444 526 615 711 814 924 1041 1165 1296 1434 1579 +12 11 16 43 129 357 909 2164 4856 10302 20700 39476 71617 123850 204397 321831 482252 683565 905040 1089529 1114665 +26 52 91 147 230 373 674 1382 3056 6836 14883 31102 62426 121329 231036 436371 825686 1573308 3018011 5801885 11106502 +25 42 63 87 119 181 330 683 1449 2968 5757 10563 18423 30731 49312 76503 115241 169158 242683 341151 470919 +-1 11 39 91 172 280 405 547 798 1587 4286 12545 35006 90518 217787 492817 1059981 2186811 4359661 8448767 15988948 +0 2 20 72 183 385 717 1225 1962 2988 4370 6182 8505 11427 15043 19455 24772 31110 38592 47348 57515 +10 14 31 66 121 195 284 381 476 556 605 604 531 361 66 -385 -1026 -1894 -3029 -4474 -6275 +5 6 5 2 -3 -10 -19 -30 -43 -58 -75 -94 -115 -138 -163 -190 -219 -250 -283 -318 -355 +6 3 0 -3 -6 -9 -12 -15 -18 -21 -24 -27 -30 -33 -36 -39 -42 -45 -48 -51 -54 +9 22 43 79 148 279 512 898 1499 2388 3649 5377 7678 10669 14478 19244 25117 32258 40839 51043 63064 +14 26 58 137 320 723 1574 3299 6654 12922 24213 43964 77893 136038 237353 420103 764857 1443773 2822859 5667790 11546877 +13 33 62 96 134 191 331 740 1864 4640 10849 23619 48103 92352 168396 293537 491847 795851 1248360 1904402 2833180 +12 30 69 152 310 574 970 1538 2413 4038 7647 16285 36846 83927 186723 400716 826510 1638778 3128829 5764650 10272266 +27 55 103 188 344 644 1241 2432 4749 9081 16831 30112 51986 86750 140273 220388 337343 504315 737991 1059220 1493740 +5 14 49 131 291 579 1081 1949 3454 6077 10658 18628 32354 55632 94368 157492 258155 415264 655415 1015289 1544581 +16 25 35 65 145 325 694 1415 2801 5486 10783 21367 42473 83857 162854 309090 572122 1035450 1846272 3285211 5935131 +-3 -5 -7 -9 -11 -13 -15 -17 -19 -21 -23 -25 -27 -29 -31 -33 -35 -37 -39 -41 -43 +14 35 81 177 367 726 1371 2465 4218 6921 11125 18228 32007 62108 131326 289946 643046 1401647 2978197 6165267 12470799 +8 15 33 71 152 325 681 1375 2669 5037 9424 17853 34772 69892 143869 299127 619536 1264752 2528131 4931762 9378966 +25 45 85 167 329 638 1205 2203 3905 6792 11838 21167 39403 76205 150702 298825 584881 1119135 2083667 3769359 6627549 +-2 0 9 35 94 212 429 803 1414 2368 3801 5883 8822 12868 18317 25515 34862 46816 61897 80691 103854 +19 40 70 123 236 482 1000 2066 4237 8616 17319 34283 66661 127274 239084 443728 818448 1510615 2809386 5296041 10160917 +7 16 38 90 216 514 1187 2625 5520 11014 20893 37896 66360 113757 194327 337154 602913 1116448 2126716 4111930 7956532 +4 14 34 70 132 250 516 1167 2724 6202 13406 27328 52660 96438 168832 284097 461700 727638 1115962 1670522 2446948 +14 36 76 136 225 371 637 1157 2232 4566 9794 21585 47831 104806 224753 469193 951410 1873108 3582208 6661186 12058253 +-6 -10 -3 38 158 451 1098 2418 4949 9599 17939 32768 59225 107100 195878 365869 702114 1383254 2775705 5604310 11243202 +22 39 72 134 236 381 561 762 989 1348 2284 5207 14004 38445 101446 253929 604340 1376121 3018100 6414308 13278664 +4 6 5 2 -4 -8 15 123 405 939 1670 2149 1051 -4637 -20898 -58612 -136342 -284236 -549349 -1002740 -1748754 +-4 -5 -3 8 34 75 120 140 66 -281 -1381 -4475 -12559 -32307 -77351 -173027 -361540 -703685 -1267491 -2083506 -3028168 +9 4 12 44 118 267 553 1097 2146 4229 8522 17669 37517 80544 172215 362114 742487 1477802 2850088 5326146 9654208 +17 23 26 37 79 184 390 738 1269 2021 3026 4307 5875 7726 9838 12168 14649 17187 19658 21905 23735 +12 26 49 79 117 169 256 451 984 2506 6696 17551 43942 104382 235498 506568 1043976 2072142 3982463 7450843 13640335 +15 34 56 82 124 208 374 688 1297 2573 5404 11698 25170 52483 104814 199918 364771 638892 1078480 1761562 2794440 +9 13 29 72 163 329 603 1024 1637 2493 3649 5168 7119 9577 12623 16344 20833 26189 32517 39928 48539 +11 12 12 27 98 315 848 1986 4187 8141 14850 25749 42971 70098 114360 192690 347176 681931 1446476 3216825 7277259 +29 57 100 164 258 407 683 1269 2597 5657 12677 28540 63547 138465 293220 601110 1191052 2281288 4229680 7609776 13332357 +3 15 55 149 343 708 1356 2489 4511 8241 15273 28537 53123 97438 174774 305373 519083 858707 1384155 2177517 3349183 +3 3 7 13 9 -25 -108 -242 -389 -441 -183 751 2929 7179 14654 26904 45955 74395 115467 173169 252361 +15 26 56 127 281 584 1129 2046 3528 5878 9573 15327 24116 37104 55380 79382 107845 136066 153230 138487 55411 +13 22 49 101 191 360 717 1502 3192 6700 13762 27667 54560 105638 200664 373344 679247 1207098 2094439 3548833 5875981 +11 20 43 83 153 297 621 1327 2748 5395 10057 18063 31950 57011 104535 197976 383721 748402 1444527 2725143 4985639 +7 8 7 4 -1 -8 -17 -28 -41 -56 -73 -92 -113 -136 -161 -188 -217 -248 -281 -316 -353 +13 15 17 28 66 150 299 564 1148 2722 7142 18944 48283 116441 265722 576554 1196015 2383889 4584847 8538556 15443576 +1 17 45 101 221 470 955 1843 3398 6089 10899 20116 39189 80859 174090 383047 846864 1861718 4047185 8676465 18316948 +-3 0 10 26 60 152 385 900 1911 3720 6732 11470 18590 28896 43355 63112 89505 124080 168606 225090 295792 +-5 -11 -21 -35 -53 -75 -101 -131 -165 -203 -245 -291 -341 -395 -453 -515 -581 -651 -725 -803 -885 diff --git a/2023/day09/input_small.txt b/2023/day09/input_small.txt new file mode 100644 index 0000000..539a763 --- /dev/null +++ b/2023/day09/input_small.txt @@ -0,0 +1,3 @@ +0 3 6 9 12 15 +1 3 6 10 15 21 +10 13 16 21 30 45 diff --git a/2023/day09/src/lib.rs b/2023/day09/src/lib.rs new file mode 100644 index 0000000..e6c3cf3 --- /dev/null +++ b/2023/day09/src/lib.rs @@ -0,0 +1,73 @@ +use helper::{Day, Variants}; + +pub fn main() { + helper::main::(include_str!("../input.txt")); +} + +struct Day09; + +helper::define_variants! { + day => crate::Day09; + part1 { + basic => crate::part1; + } + part2 { + basic => crate::part2; + } +} + +impl Day for Day09 { + fn part1() -> Variants { + part1_variants!(construct_variants) + } + + fn part2() -> Variants { + part2_variants!(construct_variants) + } +} + +fn parse(input: &str) -> impl Iterator> + '_ { + input + .lines() + .map(|line| line.split_ascii_whitespace().map(|s| s.parse().unwrap()).collect()) +} + +fn part1(input: &str) -> u64 { + parse(input) + .map(|mut values| { + let mut last_values = vec![*values.last().unwrap()]; + + let mut derive = values.clone(); + + while !derive.iter().all(|&n| n == 0) { + values.clear(); + values.extend(derive.windows(2).map(|s| s[1] - s[0])); + + last_values.push(*values.last().unwrap()); + + let tmp = derive; + derive = values; + values = tmp; + } + + last_values.into_iter().sum::() + }) + .sum::() as u64 +} + +fn part2(_input: &str) -> u64 { + 0 +} + +helper::tests! { + day09 Day09; + part1 { + small => 0; + default => 0; + } + part2 { + small => 0; + default => 0; + } +} +helper::benchmarks! {} diff --git a/2023/day09/src/main.rs b/2023/day09/src/main.rs new file mode 100644 index 0000000..2dc3d60 --- /dev/null +++ b/2023/day09/src/main.rs @@ -0,0 +1,3 @@ +fn main() { + day09::main(); +} diff --git a/Cargo.lock b/Cargo.lock index ac1e832..7d2eeb0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -197,6 +197,15 @@ dependencies = [ "nom", ] +[[package]] +name = "day09" +version = "0.1.0" +dependencies = [ + "divan", + "helper", + "nom", +] + [[package]] name = "divan" version = "0.1.4" diff --git a/helper/src/ext.rs b/helper/src/ext.rs index 808962b..7875c50 100644 --- a/helper/src/ext.rs +++ b/helper/src/ext.rs @@ -6,6 +6,10 @@ pub fn integer(input: &str) -> IResult<&str, u64> { map(digit1, |d: &str| d.parse::().unwrap())(input) } +pub fn parse_unwrap(s: &str) -> u64 { + s.parse().unwrap() +} + #[derive(Debug)] pub struct CollectArrayError;