From 4ab100300da2a6c9cf2fa1ab96db360a03f3e54a Mon Sep 17 00:00:00 2001 From: Philippe Zwietering Date: Tue, 17 Dec 2024 16:52:09 +0100 Subject: [PATCH] Dag 13 af, was makkelijk als je het gewoon direct uitrekende --- advent_of_code/2024/13/Cargo.toml | 7 + advent_of_code/2024/13/input.txt | 1279 ++++++++++++++++++++++++++++ advent_of_code/2024/13/src/main.rs | 163 ++++ advent_of_code/2024/13/test.txt | 15 + 4 files changed, 1464 insertions(+) create mode 100644 advent_of_code/2024/13/Cargo.toml create mode 100644 advent_of_code/2024/13/input.txt create mode 100644 advent_of_code/2024/13/src/main.rs create mode 100644 advent_of_code/2024/13/test.txt diff --git a/advent_of_code/2024/13/Cargo.toml b/advent_of_code/2024/13/Cargo.toml new file mode 100644 index 0000000..846ccce --- /dev/null +++ b/advent_of_code/2024/13/Cargo.toml @@ -0,0 +1,7 @@ +[package] +name = "main" +version = "0.1.0" +edition = "2021" + +[dependencies] +nom = "7.1.3" diff --git a/advent_of_code/2024/13/input.txt b/advent_of_code/2024/13/input.txt new file mode 100644 index 0000000..e1e0a29 --- /dev/null +++ b/advent_of_code/2024/13/input.txt @@ -0,0 +1,1279 @@ +Button A: X+22, Y+26 +Button B: X+93, Y+23 +Prize: X=7306, Y=3246 + +Button A: X+40, Y+26 +Button B: X+13, Y+42 +Prize: X=17433, Y=2622 + +Button A: X+50, Y+15 +Button B: X+41, Y+69 +Prize: X=1448, Y=2022 + +Button A: X+50, Y+26 +Button B: X+15, Y+49 +Prize: X=7130, Y=13722 + +Button A: X+31, Y+73 +Button B: X+57, Y+14 +Prize: X=13320, Y=1168 + +Button A: X+66, Y+32 +Button B: X+34, Y+63 +Prize: X=3846, Y=2702 + +Button A: X+72, Y+35 +Button B: X+17, Y+38 +Prize: X=6041, Y=5821 + +Button A: X+11, Y+38 +Button B: X+88, Y+67 +Prize: X=5379, Y=6732 + +Button A: X+13, Y+50 +Button B: X+24, Y+12 +Prize: X=1539, Y=11878 + +Button A: X+33, Y+66 +Button B: X+90, Y+52 +Prize: X=5817, Y=4722 + +Button A: X+11, Y+63 +Button B: X+61, Y+20 +Prize: X=5731, Y=10788 + +Button A: X+20, Y+60 +Button B: X+71, Y+16 +Prize: X=11221, Y=11716 + +Button A: X+50, Y+21 +Button B: X+14, Y+80 +Prize: X=2890, Y=7514 + +Button A: X+23, Y+83 +Button B: X+69, Y+12 +Prize: X=11048, Y=818 + +Button A: X+42, Y+60 +Button B: X+97, Y+31 +Prize: X=8994, Y=4458 + +Button A: X+33, Y+19 +Button B: X+11, Y+21 +Prize: X=10660, Y=15728 + +Button A: X+15, Y+59 +Button B: X+48, Y+17 +Prize: X=19097, Y=15211 + +Button A: X+50, Y+19 +Button B: X+11, Y+61 +Prize: X=6863, Y=3248 + +Button A: X+14, Y+29 +Button B: X+50, Y+29 +Prize: X=19724, Y=7862 + +Button A: X+14, Y+35 +Button B: X+39, Y+13 +Prize: X=5513, Y=17028 + +Button A: X+43, Y+24 +Button B: X+13, Y+44 +Prize: X=2463, Y=6704 + +Button A: X+73, Y+24 +Button B: X+57, Y+89 +Prize: X=5513, Y=3569 + +Button A: X+67, Y+28 +Button B: X+20, Y+56 +Prize: X=4999, Y=6052 + +Button A: X+28, Y+85 +Button B: X+71, Y+22 +Prize: X=6332, Y=7610 + +Button A: X+62, Y+32 +Button B: X+11, Y+37 +Prize: X=5916, Y=588 + +Button A: X+58, Y+76 +Button B: X+95, Y+36 +Prize: X=7890, Y=3260 + +Button A: X+45, Y+81 +Button B: X+93, Y+32 +Prize: X=5553, Y=3090 + +Button A: X+14, Y+34 +Button B: X+53, Y+33 +Prize: X=15587, Y=2467 + +Button A: X+44, Y+75 +Button B: X+65, Y+27 +Prize: X=5832, Y=4578 + +Button A: X+21, Y+62 +Button B: X+53, Y+20 +Prize: X=11972, Y=1664 + +Button A: X+33, Y+84 +Button B: X+50, Y+24 +Prize: X=5471, Y=5148 + +Button A: X+78, Y+44 +Button B: X+14, Y+46 +Prize: X=13970, Y=6432 + +Button A: X+39, Y+18 +Button B: X+46, Y+66 +Prize: X=13799, Y=15128 + +Button A: X+68, Y+31 +Button B: X+18, Y+63 +Prize: X=8310, Y=9213 + +Button A: X+17, Y+55 +Button B: X+64, Y+34 +Prize: X=19678, Y=7670 + +Button A: X+14, Y+24 +Button B: X+29, Y+15 +Prize: X=2409, Y=13691 + +Button A: X+29, Y+11 +Button B: X+13, Y+55 +Prize: X=13679, Y=6953 + +Button A: X+31, Y+86 +Button B: X+74, Y+45 +Prize: X=1019, Y=1224 + +Button A: X+88, Y+41 +Button B: X+41, Y+72 +Prize: X=10508, Y=8916 + +Button A: X+38, Y+23 +Button B: X+43, Y+97 +Prize: X=4871, Y=8981 + +Button A: X+87, Y+64 +Button B: X+25, Y+65 +Prize: X=9628, Y=9786 + +Button A: X+57, Y+21 +Button B: X+16, Y+32 +Prize: X=6271, Y=2259 + +Button A: X+85, Y+24 +Button B: X+29, Y+49 +Prize: X=6058, Y=4853 + +Button A: X+28, Y+67 +Button B: X+59, Y+21 +Prize: X=19630, Y=15140 + +Button A: X+12, Y+72 +Button B: X+58, Y+58 +Prize: X=2822, Y=5042 + +Button A: X+20, Y+85 +Button B: X+92, Y+47 +Prize: X=8756, Y=5221 + +Button A: X+24, Y+79 +Button B: X+60, Y+11 +Prize: X=2960, Y=18745 + +Button A: X+14, Y+45 +Button B: X+81, Y+45 +Prize: X=2317, Y=4130 + +Button A: X+60, Y+30 +Button B: X+35, Y+91 +Prize: X=1195, Y=1847 + +Button A: X+80, Y+11 +Button B: X+13, Y+67 +Prize: X=9530, Y=1052 + +Button A: X+22, Y+83 +Button B: X+71, Y+24 +Prize: X=7421, Y=7269 + +Button A: X+90, Y+39 +Button B: X+36, Y+81 +Prize: X=2718, Y=1701 + +Button A: X+32, Y+22 +Button B: X+30, Y+68 +Prize: X=3696, Y=5194 + +Button A: X+58, Y+26 +Button B: X+12, Y+39 +Prize: X=14114, Y=5333 + +Button A: X+12, Y+66 +Button B: X+93, Y+39 +Prize: X=1752, Y=3966 + +Button A: X+23, Y+82 +Button B: X+65, Y+19 +Prize: X=7150, Y=6983 + +Button A: X+35, Y+15 +Button B: X+16, Y+50 +Prize: X=6441, Y=18515 + +Button A: X+29, Y+55 +Button B: X+29, Y+17 +Prize: X=1163, Y=2807 + +Button A: X+29, Y+94 +Button B: X+98, Y+38 +Prize: X=8867, Y=3852 + +Button A: X+54, Y+29 +Button B: X+26, Y+92 +Prize: X=4032, Y=9891 + +Button A: X+68, Y+19 +Button B: X+21, Y+76 +Prize: X=1276, Y=6219 + +Button A: X+82, Y+11 +Button B: X+29, Y+31 +Prize: X=8842, Y=3626 + +Button A: X+26, Y+86 +Button B: X+80, Y+42 +Prize: X=5898, Y=5484 + +Button A: X+86, Y+39 +Button B: X+43, Y+73 +Prize: X=8342, Y=7635 + +Button A: X+23, Y+63 +Button B: X+39, Y+11 +Prize: X=3003, Y=13859 + +Button A: X+17, Y+43 +Button B: X+54, Y+34 +Prize: X=10278, Y=9618 + +Button A: X+69, Y+19 +Button B: X+23, Y+69 +Prize: X=6586, Y=14946 + +Button A: X+29, Y+19 +Button B: X+13, Y+33 +Prize: X=843, Y=17873 + +Button A: X+70, Y+97 +Button B: X+39, Y+11 +Prize: X=8868, Y=8759 + +Button A: X+19, Y+75 +Button B: X+78, Y+63 +Prize: X=7717, Y=9156 + +Button A: X+14, Y+97 +Button B: X+91, Y+20 +Prize: X=2702, Y=6511 + +Button A: X+74, Y+26 +Button B: X+22, Y+95 +Prize: X=310, Y=458 + +Button A: X+36, Y+67 +Button B: X+58, Y+26 +Prize: X=16556, Y=13007 + +Button A: X+53, Y+44 +Button B: X+19, Y+69 +Prize: X=4901, Y=5772 + +Button A: X+46, Y+19 +Button B: X+11, Y+21 +Prize: X=18795, Y=8780 + +Button A: X+35, Y+93 +Button B: X+54, Y+37 +Prize: X=2814, Y=5241 + +Button A: X+53, Y+12 +Button B: X+14, Y+31 +Prize: X=16310, Y=8315 + +Button A: X+65, Y+14 +Button B: X+45, Y+55 +Prize: X=9930, Y=5854 + +Button A: X+53, Y+67 +Button B: X+69, Y+13 +Prize: X=3746, Y=1618 + +Button A: X+18, Y+45 +Button B: X+78, Y+46 +Prize: X=18092, Y=7771 + +Button A: X+27, Y+81 +Button B: X+97, Y+20 +Prize: X=9256, Y=6359 + +Button A: X+59, Y+12 +Button B: X+26, Y+75 +Prize: X=8625, Y=12128 + +Button A: X+20, Y+55 +Button B: X+70, Y+27 +Prize: X=6290, Y=3892 + +Button A: X+37, Y+22 +Button B: X+31, Y+58 +Prize: X=7203, Y=3474 + +Button A: X+11, Y+76 +Button B: X+85, Y+22 +Prize: X=9142, Y=9462 + +Button A: X+30, Y+99 +Button B: X+87, Y+32 +Prize: X=2064, Y=1199 + +Button A: X+95, Y+68 +Button B: X+21, Y+56 +Prize: X=8921, Y=9704 + +Button A: X+79, Y+17 +Button B: X+59, Y+77 +Prize: X=2267, Y=1581 + +Button A: X+58, Y+86 +Button B: X+38, Y+12 +Prize: X=3782, Y=6586 + +Button A: X+20, Y+50 +Button B: X+49, Y+19 +Prize: X=10085, Y=1085 + +Button A: X+62, Y+47 +Button B: X+15, Y+82 +Prize: X=3088, Y=4036 + +Button A: X+25, Y+74 +Button B: X+52, Y+37 +Prize: X=3659, Y=2997 + +Button A: X+11, Y+24 +Button B: X+55, Y+34 +Prize: X=16798, Y=11028 + +Button A: X+68, Y+12 +Button B: X+12, Y+74 +Prize: X=5428, Y=5774 + +Button A: X+88, Y+29 +Button B: X+26, Y+61 +Prize: X=9592, Y=5468 + +Button A: X+57, Y+11 +Button B: X+11, Y+31 +Prize: X=413, Y=17857 + +Button A: X+42, Y+79 +Button B: X+53, Y+13 +Prize: X=3699, Y=4617 + +Button A: X+16, Y+37 +Button B: X+23, Y+15 +Prize: X=6809, Y=2386 + +Button A: X+21, Y+43 +Button B: X+55, Y+22 +Prize: X=10134, Y=4909 + +Button A: X+74, Y+31 +Button B: X+16, Y+47 +Prize: X=9496, Y=1068 + +Button A: X+59, Y+48 +Button B: X+16, Y+66 +Prize: X=2710, Y=4536 + +Button A: X+20, Y+61 +Button B: X+94, Y+48 +Prize: X=9096, Y=5305 + +Button A: X+45, Y+85 +Button B: X+81, Y+27 +Prize: X=9900, Y=8620 + +Button A: X+97, Y+58 +Button B: X+15, Y+41 +Prize: X=6741, Y=5376 + +Button A: X+44, Y+66 +Button B: X+33, Y+15 +Prize: X=804, Y=11000 + +Button A: X+50, Y+14 +Button B: X+14, Y+36 +Prize: X=5256, Y=5028 + +Button A: X+12, Y+53 +Button B: X+70, Y+37 +Prize: X=19572, Y=16626 + +Button A: X+56, Y+15 +Button B: X+30, Y+62 +Prize: X=840, Y=810 + +Button A: X+67, Y+32 +Button B: X+28, Y+54 +Prize: X=4624, Y=2696 + +Button A: X+12, Y+51 +Button B: X+51, Y+17 +Prize: X=19490, Y=15323 + +Button A: X+63, Y+40 +Button B: X+19, Y+45 +Prize: X=11259, Y=6820 + +Button A: X+42, Y+45 +Button B: X+12, Y+77 +Prize: X=3558, Y=8238 + +Button A: X+24, Y+14 +Button B: X+29, Y+58 +Prize: X=8026, Y=14618 + +Button A: X+40, Y+17 +Button B: X+16, Y+60 +Prize: X=8232, Y=577 + +Button A: X+97, Y+12 +Button B: X+15, Y+53 +Prize: X=6091, Y=2339 + +Button A: X+83, Y+37 +Button B: X+11, Y+43 +Prize: X=4635, Y=9493 + +Button A: X+14, Y+57 +Button B: X+64, Y+17 +Prize: X=2394, Y=17022 + +Button A: X+59, Y+30 +Button B: X+14, Y+26 +Prize: X=13648, Y=7420 + +Button A: X+22, Y+92 +Button B: X+78, Y+68 +Prize: X=9062, Y=12852 + +Button A: X+44, Y+59 +Button B: X+87, Y+23 +Prize: X=9118, Y=4921 + +Button A: X+66, Y+23 +Button B: X+25, Y+59 +Prize: X=5093, Y=8931 + +Button A: X+31, Y+67 +Button B: X+54, Y+18 +Prize: X=887, Y=8879 + +Button A: X+24, Y+65 +Button B: X+59, Y+16 +Prize: X=11612, Y=7136 + +Button A: X+14, Y+34 +Button B: X+61, Y+26 +Prize: X=2508, Y=9448 + +Button A: X+74, Y+24 +Button B: X+32, Y+92 +Prize: X=8266, Y=5456 + +Button A: X+64, Y+32 +Button B: X+22, Y+64 +Prize: X=2656, Y=2176 + +Button A: X+33, Y+16 +Button B: X+13, Y+55 +Prize: X=1205, Y=10043 + +Button A: X+38, Y+92 +Button B: X+90, Y+51 +Prize: X=5226, Y=6978 + +Button A: X+68, Y+12 +Button B: X+14, Y+54 +Prize: X=10750, Y=16574 + +Button A: X+85, Y+31 +Button B: X+32, Y+42 +Prize: X=2260, Y=2644 + +Button A: X+14, Y+21 +Button B: X+42, Y+17 +Prize: X=4512, Y=13158 + +Button A: X+52, Y+31 +Button B: X+33, Y+91 +Prize: X=5410, Y=5365 + +Button A: X+42, Y+17 +Button B: X+30, Y+44 +Prize: X=2066, Y=19123 + +Button A: X+29, Y+68 +Button B: X+50, Y+13 +Prize: X=6340, Y=3327 + +Button A: X+54, Y+18 +Button B: X+12, Y+66 +Prize: X=1166, Y=19148 + +Button A: X+19, Y+64 +Button B: X+63, Y+27 +Prize: X=15262, Y=10600 + +Button A: X+65, Y+32 +Button B: X+32, Y+63 +Prize: X=1471, Y=11033 + +Button A: X+24, Y+96 +Button B: X+90, Y+12 +Prize: X=7812, Y=2712 + +Button A: X+33, Y+86 +Button B: X+47, Y+32 +Prize: X=7313, Y=10824 + +Button A: X+23, Y+82 +Button B: X+69, Y+65 +Prize: X=1472, Y=3981 + +Button A: X+26, Y+11 +Button B: X+20, Y+30 +Prize: X=12330, Y=10275 + +Button A: X+43, Y+62 +Button B: X+84, Y+20 +Prize: X=5698, Y=4980 + +Button A: X+23, Y+54 +Button B: X+33, Y+18 +Prize: X=634, Y=1340 + +Button A: X+45, Y+90 +Button B: X+41, Y+20 +Prize: X=5363, Y=5270 + +Button A: X+18, Y+24 +Button B: X+62, Y+12 +Prize: X=2552, Y=2484 + +Button A: X+17, Y+97 +Button B: X+75, Y+70 +Prize: X=6419, Y=6559 + +Button A: X+72, Y+22 +Button B: X+15, Y+53 +Prize: X=18326, Y=14100 + +Button A: X+12, Y+60 +Button B: X+35, Y+12 +Prize: X=3911, Y=7352 + +Button A: X+14, Y+86 +Button B: X+93, Y+97 +Prize: X=4709, Y=9481 + +Button A: X+24, Y+11 +Button B: X+55, Y+79 +Prize: X=8217, Y=17233 + +Button A: X+37, Y+69 +Button B: X+58, Y+24 +Prize: X=4059, Y=3263 + +Button A: X+31, Y+63 +Button B: X+60, Y+20 +Prize: X=5564, Y=17812 + +Button A: X+33, Y+62 +Button B: X+56, Y+19 +Prize: X=11107, Y=18688 + +Button A: X+28, Y+45 +Button B: X+44, Y+21 +Prize: X=3512, Y=13430 + +Button A: X+19, Y+45 +Button B: X+16, Y+11 +Prize: X=2571, Y=4099 + +Button A: X+29, Y+47 +Button B: X+86, Y+26 +Prize: X=7757, Y=4295 + +Button A: X+68, Y+31 +Button B: X+28, Y+61 +Prize: X=3664, Y=15428 + +Button A: X+44, Y+26 +Button B: X+21, Y+42 +Prize: X=17740, Y=15742 + +Button A: X+21, Y+42 +Button B: X+32, Y+13 +Prize: X=14497, Y=2196 + +Button A: X+83, Y+35 +Button B: X+52, Y+79 +Prize: X=6563, Y=5507 + +Button A: X+13, Y+66 +Button B: X+88, Y+45 +Prize: X=2307, Y=2070 + +Button A: X+18, Y+48 +Button B: X+40, Y+19 +Prize: X=11118, Y=10104 + +Button A: X+73, Y+20 +Button B: X+20, Y+64 +Prize: X=18771, Y=11932 + +Button A: X+38, Y+19 +Button B: X+22, Y+53 +Prize: X=13822, Y=16209 + +Button A: X+16, Y+97 +Button B: X+88, Y+77 +Prize: X=8120, Y=14077 + +Button A: X+16, Y+92 +Button B: X+66, Y+13 +Prize: X=906, Y=3377 + +Button A: X+31, Y+37 +Button B: X+88, Y+15 +Prize: X=3573, Y=2734 + +Button A: X+68, Y+40 +Button B: X+28, Y+55 +Prize: X=14044, Y=10510 + +Button A: X+33, Y+16 +Button B: X+35, Y+53 +Prize: X=5790, Y=17728 + +Button A: X+89, Y+53 +Button B: X+23, Y+66 +Prize: X=6582, Y=6744 + +Button A: X+17, Y+54 +Button B: X+75, Y+25 +Prize: X=5613, Y=7006 + +Button A: X+68, Y+35 +Button B: X+18, Y+54 +Prize: X=14040, Y=18168 + +Button A: X+18, Y+32 +Button B: X+57, Y+31 +Prize: X=10334, Y=18896 + +Button A: X+21, Y+81 +Button B: X+61, Y+19 +Prize: X=7301, Y=6965 + +Button A: X+54, Y+81 +Button B: X+36, Y+11 +Prize: X=4832, Y=18232 + +Button A: X+74, Y+47 +Button B: X+24, Y+84 +Prize: X=5298, Y=3915 + +Button A: X+90, Y+67 +Button B: X+19, Y+93 +Prize: X=2958, Y=5514 + +Button A: X+58, Y+13 +Button B: X+35, Y+84 +Prize: X=14200, Y=15376 + +Button A: X+14, Y+45 +Button B: X+82, Y+49 +Prize: X=7738, Y=11493 + +Button A: X+20, Y+55 +Button B: X+58, Y+21 +Prize: X=12648, Y=5381 + +Button A: X+41, Y+13 +Button B: X+24, Y+44 +Prize: X=15217, Y=5745 + +Button A: X+15, Y+63 +Button B: X+77, Y+27 +Prize: X=4945, Y=16433 + +Button A: X+37, Y+15 +Button B: X+69, Y+94 +Prize: X=5003, Y=3877 + +Button A: X+78, Y+39 +Button B: X+12, Y+23 +Prize: X=4164, Y=2235 + +Button A: X+46, Y+24 +Button B: X+15, Y+52 +Prize: X=17440, Y=4000 + +Button A: X+27, Y+42 +Button B: X+36, Y+11 +Prize: X=16244, Y=1574 + +Button A: X+38, Y+83 +Button B: X+26, Y+15 +Prize: X=4202, Y=5417 + +Button A: X+56, Y+24 +Button B: X+14, Y+62 +Prize: X=11848, Y=8520 + +Button A: X+26, Y+49 +Button B: X+45, Y+16 +Prize: X=8092, Y=15415 + +Button A: X+27, Y+97 +Button B: X+36, Y+17 +Prize: X=3870, Y=8062 + +Button A: X+87, Y+14 +Button B: X+34, Y+97 +Prize: X=4995, Y=4648 + +Button A: X+43, Y+50 +Button B: X+84, Y+29 +Prize: X=4671, Y=1929 + +Button A: X+14, Y+86 +Button B: X+75, Y+81 +Prize: X=4528, Y=10348 + +Button A: X+12, Y+42 +Button B: X+70, Y+39 +Prize: X=4322, Y=11825 + +Button A: X+15, Y+36 +Button B: X+83, Y+60 +Prize: X=10436, Y=16928 + +Button A: X+44, Y+30 +Button B: X+15, Y+32 +Prize: X=14252, Y=15196 + +Button A: X+58, Y+28 +Button B: X+30, Y+63 +Prize: X=13178, Y=16097 + +Button A: X+45, Y+88 +Button B: X+19, Y+12 +Prize: X=4846, Y=7112 + +Button A: X+29, Y+67 +Button B: X+29, Y+13 +Prize: X=16098, Y=14404 + +Button A: X+72, Y+28 +Button B: X+27, Y+70 +Prize: X=17648, Y=19800 + +Button A: X+74, Y+41 +Button B: X+18, Y+51 +Prize: X=9140, Y=4124 + +Button A: X+36, Y+55 +Button B: X+43, Y+17 +Prize: X=12083, Y=466 + +Button A: X+18, Y+46 +Button B: X+65, Y+42 +Prize: X=11629, Y=16984 + +Button A: X+85, Y+25 +Button B: X+12, Y+68 +Prize: X=14728, Y=3952 + +Button A: X+35, Y+12 +Button B: X+11, Y+40 +Prize: X=14414, Y=19640 + +Button A: X+46, Y+17 +Button B: X+31, Y+71 +Prize: X=16584, Y=8434 + +Button A: X+25, Y+57 +Button B: X+31, Y+17 +Prize: X=18272, Y=16358 + +Button A: X+64, Y+84 +Button B: X+28, Y+11 +Prize: X=9016, Y=17678 + +Button A: X+28, Y+61 +Button B: X+44, Y+13 +Prize: X=2496, Y=3312 + +Button A: X+79, Y+23 +Button B: X+15, Y+58 +Prize: X=578, Y=4290 + +Button A: X+25, Y+46 +Button B: X+47, Y+13 +Prize: X=12001, Y=1555 + +Button A: X+56, Y+40 +Button B: X+14, Y+38 +Prize: X=5058, Y=12362 + +Button A: X+41, Y+11 +Button B: X+35, Y+58 +Prize: X=8948, Y=13686 + +Button A: X+86, Y+42 +Button B: X+11, Y+47 +Prize: X=16277, Y=2789 + +Button A: X+12, Y+22 +Button B: X+37, Y+11 +Prize: X=1429, Y=12475 + +Button A: X+90, Y+11 +Button B: X+25, Y+44 +Prize: X=7035, Y=4422 + +Button A: X+19, Y+75 +Button B: X+57, Y+54 +Prize: X=5320, Y=10056 + +Button A: X+37, Y+51 +Button B: X+63, Y+20 +Prize: X=7556, Y=5068 + +Button A: X+39, Y+68 +Button B: X+37, Y+19 +Prize: X=7035, Y=12045 + +Button A: X+29, Y+29 +Button B: X+13, Y+70 +Prize: X=3772, Y=8104 + +Button A: X+50, Y+31 +Button B: X+15, Y+82 +Prize: X=4410, Y=5933 + +Button A: X+46, Y+72 +Button B: X+73, Y+16 +Prize: X=9982, Y=6584 + +Button A: X+27, Y+11 +Button B: X+11, Y+42 +Prize: X=10715, Y=6312 + +Button A: X+17, Y+51 +Button B: X+69, Y+28 +Prize: X=683, Y=1512 + +Button A: X+98, Y+24 +Button B: X+19, Y+92 +Prize: X=1516, Y=5088 + +Button A: X+46, Y+12 +Button B: X+24, Y+66 +Prize: X=18682, Y=13430 + +Button A: X+11, Y+96 +Button B: X+66, Y+66 +Prize: X=5225, Y=7860 + +Button A: X+50, Y+24 +Button B: X+28, Y+64 +Prize: X=1812, Y=4064 + +Button A: X+67, Y+23 +Button B: X+13, Y+54 +Prize: X=14168, Y=18920 + +Button A: X+14, Y+39 +Button B: X+78, Y+48 +Prize: X=7952, Y=15467 + +Button A: X+79, Y+14 +Button B: X+48, Y+56 +Prize: X=7932, Y=2688 + +Button A: X+73, Y+79 +Button B: X+13, Y+62 +Prize: X=1221, Y=3670 + +Button A: X+61, Y+23 +Button B: X+16, Y+43 +Prize: X=3243, Y=12799 + +Button A: X+61, Y+12 +Button B: X+68, Y+78 +Prize: X=4009, Y=1758 + +Button A: X+14, Y+50 +Button B: X+44, Y+24 +Prize: X=3054, Y=18270 + +Button A: X+18, Y+57 +Button B: X+67, Y+39 +Prize: X=5984, Y=6135 + +Button A: X+80, Y+14 +Button B: X+75, Y+65 +Prize: X=9290, Y=5672 + +Button A: X+67, Y+85 +Button B: X+50, Y+18 +Prize: X=10781, Y=9543 + +Button A: X+71, Y+11 +Button B: X+11, Y+80 +Prize: X=3535, Y=1957 + +Button A: X+78, Y+29 +Button B: X+18, Y+69 +Prize: X=9980, Y=16640 + +Button A: X+39, Y+14 +Button B: X+32, Y+46 +Prize: X=313, Y=15332 + +Button A: X+41, Y+65 +Button B: X+45, Y+14 +Prize: X=8488, Y=8472 + +Button A: X+59, Y+68 +Button B: X+75, Y+20 +Prize: X=3566, Y=3512 + +Button A: X+72, Y+39 +Button B: X+14, Y+64 +Prize: X=5062, Y=3701 + +Button A: X+13, Y+61 +Button B: X+85, Y+34 +Prize: X=3401, Y=15956 + +Button A: X+58, Y+12 +Button B: X+65, Y+60 +Prize: X=4858, Y=3612 + +Button A: X+95, Y+33 +Button B: X+18, Y+47 +Prize: X=10791, Y=6886 + +Button A: X+55, Y+18 +Button B: X+37, Y+76 +Prize: X=16581, Y=11928 + +Button A: X+22, Y+45 +Button B: X+56, Y+18 +Prize: X=15402, Y=4283 + +Button A: X+28, Y+56 +Button B: X+69, Y+41 +Prize: X=5994, Y=4034 + +Button A: X+69, Y+14 +Button B: X+54, Y+98 +Prize: X=8256, Y=9422 + +Button A: X+39, Y+28 +Button B: X+11, Y+35 +Prize: X=2911, Y=8726 + +Button A: X+77, Y+58 +Button B: X+30, Y+79 +Prize: X=3187, Y=6800 + +Button A: X+14, Y+80 +Button B: X+52, Y+19 +Prize: X=2330, Y=6917 + +Button A: X+45, Y+72 +Button B: X+49, Y+24 +Prize: X=5962, Y=2144 + +Button A: X+48, Y+25 +Button B: X+17, Y+49 +Prize: X=7915, Y=306 + +Button A: X+46, Y+41 +Button B: X+13, Y+99 +Prize: X=3216, Y=5314 + +Button A: X+17, Y+44 +Button B: X+74, Y+40 +Prize: X=7652, Y=19392 + +Button A: X+20, Y+62 +Button B: X+73, Y+31 +Prize: X=3276, Y=19614 + +Button A: X+44, Y+20 +Button B: X+22, Y+44 +Prize: X=1046, Y=7492 + +Button A: X+11, Y+60 +Button B: X+45, Y+16 +Prize: X=12024, Y=9744 + +Button A: X+23, Y+80 +Button B: X+37, Y+30 +Prize: X=2204, Y=2830 + +Button A: X+31, Y+35 +Button B: X+88, Y+28 +Prize: X=8517, Y=4193 + +Button A: X+22, Y+27 +Button B: X+12, Y+93 +Prize: X=2646, Y=9744 + +Button A: X+26, Y+23 +Button B: X+13, Y+79 +Prize: X=2743, Y=7219 + +Button A: X+16, Y+33 +Button B: X+66, Y+22 +Prize: X=1132, Y=737 + +Button A: X+25, Y+47 +Button B: X+70, Y+24 +Prize: X=2105, Y=2451 + +Button A: X+51, Y+23 +Button B: X+44, Y+71 +Prize: X=9510, Y=7672 + +Button A: X+89, Y+91 +Button B: X+85, Y+20 +Prize: X=2582, Y=1168 + +Button A: X+40, Y+16 +Button B: X+55, Y+78 +Prize: X=18585, Y=17746 + +Button A: X+28, Y+16 +Button B: X+17, Y+36 +Prize: X=18462, Y=5112 + +Button A: X+86, Y+74 +Button B: X+74, Y+13 +Prize: X=4240, Y=1216 + +Button A: X+14, Y+33 +Button B: X+61, Y+26 +Prize: X=12231, Y=10864 + +Button A: X+61, Y+13 +Button B: X+12, Y+46 +Prize: X=5406, Y=16848 + +Button A: X+55, Y+74 +Button B: X+94, Y+26 +Prize: X=6194, Y=3712 + +Button A: X+98, Y+56 +Button B: X+47, Y+85 +Prize: X=3996, Y=5772 + +Button A: X+11, Y+53 +Button B: X+60, Y+13 +Prize: X=10218, Y=8517 + +Button A: X+51, Y+76 +Button B: X+40, Y+19 +Prize: X=15746, Y=16327 + +Button A: X+62, Y+14 +Button B: X+18, Y+43 +Prize: X=2328, Y=2782 + +Button A: X+18, Y+63 +Button B: X+73, Y+29 +Prize: X=8416, Y=5943 + +Button A: X+13, Y+63 +Button B: X+82, Y+19 +Prize: X=18796, Y=5456 + +Button A: X+72, Y+50 +Button B: X+14, Y+30 +Prize: X=6010, Y=8800 + +Button A: X+75, Y+14 +Button B: X+11, Y+82 +Prize: X=3895, Y=17534 + +Button A: X+55, Y+19 +Button B: X+26, Y+58 +Prize: X=8573, Y=5313 + +Button A: X+13, Y+26 +Button B: X+34, Y+22 +Prize: X=7071, Y=11926 + +Button A: X+44, Y+19 +Button B: X+37, Y+57 +Prize: X=6935, Y=6865 + +Button A: X+87, Y+26 +Button B: X+35, Y+47 +Prize: X=3574, Y=2347 + +Button A: X+49, Y+13 +Button B: X+37, Y+73 +Prize: X=5461, Y=3913 + +Button A: X+34, Y+59 +Button B: X+48, Y+19 +Prize: X=17358, Y=12642 + +Button A: X+12, Y+46 +Button B: X+82, Y+45 +Prize: X=15766, Y=1447 + +Button A: X+71, Y+69 +Button B: X+18, Y+78 +Prize: X=2110, Y=5802 + +Button A: X+96, Y+46 +Button B: X+49, Y+92 +Prize: X=3459, Y=5152 + +Button A: X+97, Y+34 +Button B: X+72, Y+88 +Prize: X=5403, Y=6350 + +Button A: X+68, Y+39 +Button B: X+11, Y+25 +Prize: X=8517, Y=5221 + +Button A: X+12, Y+53 +Button B: X+14, Y+13 +Prize: X=920, Y=3868 + +Button A: X+43, Y+14 +Button B: X+69, Y+87 +Prize: X=5314, Y=4247 + +Button A: X+12, Y+66 +Button B: X+66, Y+42 +Prize: X=4158, Y=8424 + +Button A: X+22, Y+40 +Button B: X+26, Y+12 +Prize: X=8306, Y=10996 + +Button A: X+15, Y+82 +Button B: X+57, Y+56 +Prize: X=2472, Y=6868 + +Button A: X+56, Y+13 +Button B: X+12, Y+43 +Prize: X=4176, Y=12665 + +Button A: X+28, Y+69 +Button B: X+64, Y+22 +Prize: X=16480, Y=17690 + +Button A: X+26, Y+76 +Button B: X+78, Y+46 +Prize: X=6682, Y=9704 + +Button A: X+14, Y+53 +Button B: X+46, Y+21 +Prize: X=6756, Y=3926 + +Button A: X+36, Y+67 +Button B: X+61, Y+31 +Prize: X=13029, Y=12931 + +Button A: X+98, Y+43 +Button B: X+41, Y+67 +Prize: X=5798, Y=7249 + +Button A: X+28, Y+14 +Button B: X+38, Y+65 +Prize: X=11386, Y=5835 + +Button A: X+68, Y+42 +Button B: X+13, Y+37 +Prize: X=14360, Y=15490 + +Button A: X+76, Y+15 +Button B: X+12, Y+77 +Prize: X=3904, Y=8446 + +Button A: X+52, Y+12 +Button B: X+24, Y+70 +Prize: X=5608, Y=4618 + +Button A: X+77, Y+42 +Button B: X+11, Y+35 +Prize: X=16303, Y=12569 + +Button A: X+34, Y+59 +Button B: X+43, Y+14 +Prize: X=5895, Y=10954 + +Button A: X+44, Y+84 +Button B: X+88, Y+37 +Prize: X=5368, Y=4615 + +Button A: X+11, Y+56 +Button B: X+80, Y+22 +Prize: X=4559, Y=1590 + +Button A: X+25, Y+77 +Button B: X+28, Y+22 +Prize: X=2537, Y=2739 + +Button A: X+28, Y+73 +Button B: X+46, Y+11 +Prize: X=18498, Y=9618 + +Button A: X+43, Y+66 +Button B: X+84, Y+29 +Prize: X=3382, Y=2293 + +Button A: X+29, Y+93 +Button B: X+43, Y+18 +Prize: X=3537, Y=4149 + +Button A: X+57, Y+17 +Button B: X+23, Y+28 +Prize: X=3542, Y=1902 + +Button A: X+19, Y+95 +Button B: X+22, Y+14 +Prize: X=2983, Y=7619 + +Button A: X+14, Y+57 +Button B: X+64, Y+23 +Prize: X=10580, Y=14477 diff --git a/advent_of_code/2024/13/src/main.rs b/advent_of_code/2024/13/src/main.rs new file mode 100644 index 0000000..bb4c7d9 --- /dev/null +++ b/advent_of_code/2024/13/src/main.rs @@ -0,0 +1,163 @@ +use nom::{ + bytes::complete::tag, + character::complete::{i64, multispace1}, + multi::many1, + sequence::{delimited, separated_pair, tuple}, + IResult, +}; + +fn parse(input: &str) -> IResult<&str, Vec<((i64, i64), (i64, i64), (i64, i64))>> { + let (_input, result) = many1(tuple(( + delimited( + tag("Button A: X+"), + separated_pair(i64, tag(", Y+"), i64), + multispace1, + ), + delimited( + tag("Button B: X+"), + separated_pair(i64, tag(", Y+"), i64), + multispace1, + ), + delimited( + tag("Prize: X="), + separated_pair(i64, tag(", Y="), i64), + multispace1, + ), + )))(input)?; + + Ok((input, result)) +} + +// For a / b +fn divisible(a: f64, b: f64, epsilon: f64) -> bool { + let div = a / b; + + (div - div.round()).abs() < epsilon +} + +fn equal(a: f64, b: f64, epsilon: f64) -> bool { + (a - b).abs() < epsilon +} + +fn linear_solve_1(a: (i64, i64), b: (i64, i64), prize: (i64, i64)) -> Option { + const EPS: f64 = 0.000001; + + let (fa1, fb1) = (a.0 as f64, a.1 as f64); + let (fa2, fb2) = (b.0 as f64, b.1 as f64); + let (p1, p2) = (prize.0 as f64, prize.1 as f64); + + let y_denominator = fb2 - fb1 * fa2 / fa1; + if equal(y_denominator, 0.0, EPS) { + return None; + } + + let y_nominator = p2 - fb1 * p1 / fa1; + if !divisible(y_nominator, y_denominator, EPS) { + return None; + } + + let x_nominator = p1 - fa2 * (p2 - fb1 * p1 / fa1) / (fb2 - fb1 * fa2 / fa1); + if !divisible(x_nominator, fa1, EPS) { + return None; + } + + let y = (y_nominator / y_denominator).round() as i64; + let x = (x_nominator / fa1).round() as i64; + + if x < 0 || y < 0 || x > 100 || y > 100 { + return None; + } else { + return Some(x * 3 + y); + } +} + +fn linear_solve_2(a: (i64, i64), b: (i64, i64), prize: (i64, i64)) -> Option { + const EPS: f64 = 0.001; + const BONUS: i64 = 10000000000000; + + let (fa1, fb1) = (a.0 as f64, a.1 as f64); + let (fa2, fb2) = (b.0 as f64, b.1 as f64); + let (p1, p2) = ((prize.0 + BONUS) as f64, (prize.1 + BONUS) as f64); + + let y_denominator = fb2 - fb1 * fa2 / fa1; + if equal(y_denominator, 0.0, EPS) { + return None; + } + + let y_nominator = p2 - fb1 * p1 / fa1; + if !divisible(y_nominator, y_denominator, EPS) { + return None; + } + + let x_nominator = p1 - fa2 * (p2 - fb1 * p1 / fa1) / (fb2 - fb1 * fa2 / fa1); + if !divisible(x_nominator, fa1, EPS) { + return None; + } + + let y = (y_nominator / y_denominator).round() as i64; + let x = (x_nominator / fa1).round() as i64; + + if x < 0 || y < 0 { + return None; + } else { + return Some(x * 3 + y); + } +} + +fn solve_1(input: &str) -> i64 { + let (_, result) = parse(input).unwrap(); + + result + .into_iter() + .filter_map(|(a, b, prize)| linear_solve_1(a, b, prize)) + .sum() +} + +fn solve_2(input: &str) -> i64 { + let (_, result) = parse(input).unwrap(); + + result + .into_iter() + .filter_map(|(a, b, prize)| linear_solve_2(a, b, prize)) + .sum() +} + +fn main() { + println!("Hello, this is Patrick!"); + + let input = include_str!("../input.txt"); + + let result_1 = solve_1(input); + println!("The fewest tokens spent to get all prizes is {}", result_1); + + let result_2 = solve_2(input); + println!( + "With the huge positions, the fewest tokens to get all prizes is now {}", + result_2 + ); +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_1() { + let test_input = include_str!("../test.txt"); + assert_eq!(solve_1(test_input), 480); + } + + #[test] + fn test_2() { + let test_input = include_str!("../test.txt"); + let ts = parse(test_input).unwrap().1; + + for (i, t) in ts.into_iter().enumerate() { + if i % 2 == 0 { + assert!(linear_solve_2(t.0, t.1, t.2).is_none()); + } else { + assert!(linear_solve_2(t.0, t.1, t.2).is_some()); + } + } + } +} diff --git a/advent_of_code/2024/13/test.txt b/advent_of_code/2024/13/test.txt new file mode 100644 index 0000000..912f482 --- /dev/null +++ b/advent_of_code/2024/13/test.txt @@ -0,0 +1,15 @@ +Button A: X+94, Y+34 +Button B: X+22, Y+67 +Prize: X=8400, Y=5400 + +Button A: X+26, Y+66 +Button B: X+67, Y+21 +Prize: X=12748, Y=12176 + +Button A: X+17, Y+86 +Button B: X+84, Y+37 +Prize: X=7870, Y=6450 + +Button A: X+69, Y+23 +Button B: X+27, Y+71 +Prize: X=18641, Y=10279