From 26a517c7a3b994123dd5b647cc07b0f79f057ebf Mon Sep 17 00:00:00 2001 From: MrBounty Date: Sun, 15 Dec 2024 10:56:23 +0100 Subject: [PATCH] Added shitty day 13 --- benchmark.zig | 4 + day13/input | 1279 +++++++++++++++++++++++++++++++++++++++++++++++ day13/part1.zig | 89 ++++ day13/part2.zig | 135 +++++ 4 files changed, 1507 insertions(+) create mode 100644 day13/input create mode 100644 day13/part1.zig create mode 100644 day13/part2.zig diff --git a/benchmark.zig b/benchmark.zig index 8429892..71a13ea 100644 --- a/benchmark.zig +++ b/benchmark.zig @@ -24,6 +24,7 @@ const d111 = @import("day11/part1.zig"); const d112 = @import("day11/part2.zig"); const d121 = @import("day12/part1.zig"); const d122 = @import("day12/part2.zig"); +const d131 = @import("day13/part1.zig"); const NUMBER_OF_RUN = 50; @@ -72,6 +73,9 @@ pub fn main() !void { try benchmark(d121.main, 12, 1); try benchmark(d122.main, 12, 2); separator(); + try benchmark(d131.main, 13, 1); + print("| 13 | 2 | Too long ~6h | 0 | 0 |\n", .{}); + separator(); print("| Total | {d: >8} ± {d: <6.2} | {d:>8} | {d:>8} |\n", .{ total_mean, total_std_dev, total_min, total_max }); separator(); } diff --git a/day13/input b/day13/input new file mode 100644 index 0000000..039e83d --- /dev/null +++ b/day13/input @@ -0,0 +1,1279 @@ +Button A: X+38, Y+33 +Button B: X+11, Y+47 +Prize: X=1461, Y=2879 + +Button A: X+77, Y+14 +Button B: X+15, Y+80 +Prize: X=11953, Y=16146 + +Button A: X+74, Y+90 +Button B: X+52, Y+13 +Prize: X=3526, Y=3384 + +Button A: X+30, Y+13 +Button B: X+46, Y+70 +Prize: X=11420, Y=16443 + +Button A: X+12, Y+46 +Button B: X+21, Y+11 +Prize: X=8099, Y=12717 + +Button A: X+36, Y+13 +Button B: X+41, Y+66 +Prize: X=6419, Y=13070 + +Button A: X+27, Y+53 +Button B: X+37, Y+15 +Prize: X=5668, Y=1112 + +Button A: X+53, Y+21 +Button B: X+38, Y+74 +Prize: X=17062, Y=6282 + +Button A: X+18, Y+70 +Button B: X+38, Y+12 +Prize: X=17222, Y=7342 + +Button A: X+80, Y+19 +Button B: X+54, Y+66 +Prize: X=6378, Y=4014 + +Button A: X+77, Y+71 +Button B: X+88, Y+15 +Prize: X=8569, Y=6380 + +Button A: X+27, Y+57 +Button B: X+55, Y+23 +Prize: X=3315, Y=12067 + +Button A: X+87, Y+89 +Button B: X+11, Y+77 +Prize: X=6983, Y=13521 + +Button A: X+12, Y+54 +Button B: X+67, Y+15 +Prize: X=15107, Y=12005 + +Button A: X+29, Y+72 +Button B: X+91, Y+37 +Prize: X=9614, Y=5354 + +Button A: X+56, Y+69 +Button B: X+68, Y+22 +Prize: X=9480, Y=6120 + +Button A: X+46, Y+32 +Button B: X+17, Y+40 +Prize: X=2109, Y=2904 + +Button A: X+53, Y+12 +Button B: X+27, Y+78 +Prize: X=13205, Y=6050 + +Button A: X+26, Y+58 +Button B: X+66, Y+28 +Prize: X=8892, Y=1786 + +Button A: X+53, Y+25 +Button B: X+24, Y+48 +Prize: X=6546, Y=14506 + +Button A: X+61, Y+90 +Button B: X+91, Y+33 +Prize: X=4751, Y=5592 + +Button A: X+69, Y+15 +Button B: X+15, Y+63 +Prize: X=8156, Y=7136 + +Button A: X+82, Y+87 +Button B: X+16, Y+86 +Prize: X=7330, Y=10745 + +Button A: X+54, Y+15 +Button B: X+20, Y+45 +Prize: X=17428, Y=6920 + +Button A: X+67, Y+70 +Button B: X+63, Y+14 +Prize: X=2989, Y=1050 + +Button A: X+20, Y+66 +Button B: X+57, Y+18 +Prize: X=10935, Y=9554 + +Button A: X+29, Y+51 +Button B: X+54, Y+29 +Prize: X=3771, Y=7210 + +Button A: X+50, Y+81 +Button B: X+71, Y+37 +Prize: X=8410, Y=8943 + +Button A: X+73, Y+18 +Button B: X+11, Y+37 +Prize: X=1239, Y=3827 + +Button A: X+58, Y+55 +Button B: X+28, Y+99 +Prize: X=3156, Y=7557 + +Button A: X+99, Y+34 +Button B: X+24, Y+36 +Prize: X=8631, Y=3214 + +Button A: X+48, Y+76 +Button B: X+85, Y+25 +Prize: X=6812, Y=5964 + +Button A: X+43, Y+74 +Button B: X+46, Y+19 +Prize: X=9606, Y=1424 + +Button A: X+47, Y+13 +Button B: X+14, Y+40 +Prize: X=13405, Y=11139 + +Button A: X+46, Y+54 +Button B: X+12, Y+91 +Prize: X=4886, Y=10812 + +Button A: X+17, Y+84 +Button B: X+34, Y+35 +Prize: X=2159, Y=6678 + +Button A: X+46, Y+15 +Button B: X+23, Y+58 +Prize: X=18454, Y=1703 + +Button A: X+18, Y+57 +Button B: X+99, Y+18 +Prize: X=10395, Y=6618 + +Button A: X+82, Y+32 +Button B: X+48, Y+95 +Prize: X=2784, Y=2383 + +Button A: X+65, Y+44 +Button B: X+11, Y+37 +Prize: X=19146, Y=4461 + +Button A: X+17, Y+33 +Button B: X+50, Y+11 +Prize: X=13534, Y=3521 + +Button A: X+29, Y+12 +Button B: X+11, Y+78 +Prize: X=1248, Y=7494 + +Button A: X+35, Y+62 +Button B: X+59, Y+34 +Prize: X=3162, Y=4332 + +Button A: X+24, Y+90 +Button B: X+80, Y+25 +Prize: X=7656, Y=9735 + +Button A: X+82, Y+14 +Button B: X+30, Y+61 +Prize: X=5742, Y=6177 + +Button A: X+11, Y+72 +Button B: X+88, Y+24 +Prize: X=3487, Y=4056 + +Button A: X+14, Y+65 +Button B: X+66, Y+48 +Prize: X=2988, Y=2502 + +Button A: X+84, Y+14 +Button B: X+28, Y+87 +Prize: X=6216, Y=5729 + +Button A: X+17, Y+70 +Button B: X+64, Y+12 +Prize: X=6571, Y=17770 + +Button A: X+42, Y+13 +Button B: X+28, Y+41 +Prize: X=2338, Y=3084 + +Button A: X+19, Y+38 +Button B: X+76, Y+14 +Prize: X=7771, Y=2156 + +Button A: X+47, Y+20 +Button B: X+14, Y+63 +Prize: X=4304, Y=18772 + +Button A: X+33, Y+58 +Button B: X+44, Y+14 +Prize: X=7657, Y=6452 + +Button A: X+54, Y+76 +Button B: X+98, Y+15 +Prize: X=8484, Y=2721 + +Button A: X+20, Y+40 +Button B: X+36, Y+15 +Prize: X=19800, Y=16585 + +Button A: X+13, Y+89 +Button B: X+66, Y+66 +Prize: X=2145, Y=9669 + +Button A: X+80, Y+15 +Button B: X+40, Y+49 +Prize: X=10680, Y=5198 + +Button A: X+74, Y+17 +Button B: X+15, Y+73 +Prize: X=12709, Y=10781 + +Button A: X+15, Y+59 +Button B: X+77, Y+17 +Prize: X=6280, Y=6120 + +Button A: X+50, Y+14 +Button B: X+30, Y+77 +Prize: X=3330, Y=10497 + +Button A: X+40, Y+80 +Button B: X+37, Y+13 +Prize: X=3609, Y=2521 + +Button A: X+48, Y+96 +Button B: X+48, Y+18 +Prize: X=2400, Y=1992 + +Button A: X+75, Y+22 +Button B: X+18, Y+72 +Prize: X=5442, Y=7868 + +Button A: X+13, Y+44 +Button B: X+58, Y+33 +Prize: X=17227, Y=9230 + +Button A: X+13, Y+66 +Button B: X+88, Y+76 +Prize: X=5659, Y=8338 + +Button A: X+59, Y+18 +Button B: X+18, Y+44 +Prize: X=3114, Y=1340 + +Button A: X+32, Y+11 +Button B: X+20, Y+49 +Prize: X=18756, Y=13214 + +Button A: X+61, Y+40 +Button B: X+11, Y+32 +Prize: X=4473, Y=3528 + +Button A: X+65, Y+13 +Button B: X+23, Y+78 +Prize: X=16396, Y=11274 + +Button A: X+13, Y+40 +Button B: X+33, Y+13 +Prize: X=2924, Y=2268 + +Button A: X+58, Y+34 +Button B: X+20, Y+41 +Prize: X=17404, Y=7897 + +Button A: X+86, Y+20 +Button B: X+12, Y+78 +Prize: X=18048, Y=9798 + +Button A: X+17, Y+79 +Button B: X+96, Y+30 +Prize: X=8430, Y=8382 + +Button A: X+98, Y+39 +Button B: X+34, Y+48 +Prize: X=6620, Y=4875 + +Button A: X+66, Y+67 +Button B: X+91, Y+19 +Prize: X=5961, Y=2309 + +Button A: X+65, Y+85 +Button B: X+82, Y+18 +Prize: X=4930, Y=3770 + +Button A: X+13, Y+24 +Button B: X+41, Y+22 +Prize: X=6060, Y=4002 + +Button A: X+34, Y+76 +Button B: X+44, Y+15 +Prize: X=9062, Y=6068 + +Button A: X+20, Y+57 +Button B: X+94, Y+62 +Prize: X=9522, Y=10048 + +Button A: X+37, Y+69 +Button B: X+80, Y+18 +Prize: X=7086, Y=3900 + +Button A: X+20, Y+30 +Button B: X+86, Y+30 +Prize: X=2786, Y=2100 + +Button A: X+36, Y+98 +Button B: X+53, Y+35 +Prize: X=5791, Y=9317 + +Button A: X+78, Y+19 +Button B: X+11, Y+65 +Prize: X=3481, Y=3777 + +Button A: X+16, Y+31 +Button B: X+65, Y+16 +Prize: X=7088, Y=3179 + +Button A: X+58, Y+64 +Button B: X+85, Y+17 +Prize: X=1283, Y=571 + +Button A: X+29, Y+17 +Button B: X+14, Y+40 +Prize: X=12201, Y=18541 + +Button A: X+38, Y+23 +Button B: X+13, Y+78 +Prize: X=4672, Y=7737 + +Button A: X+24, Y+99 +Button B: X+57, Y+19 +Prize: X=5892, Y=9608 + +Button A: X+24, Y+50 +Button B: X+60, Y+34 +Prize: X=3012, Y=4182 + +Button A: X+63, Y+65 +Button B: X+75, Y+19 +Prize: X=12123, Y=7779 + +Button A: X+58, Y+37 +Button B: X+14, Y+30 +Prize: X=9716, Y=18406 + +Button A: X+36, Y+97 +Button B: X+75, Y+21 +Prize: X=1224, Y=1125 + +Button A: X+73, Y+67 +Button B: X+63, Y+12 +Prize: X=9736, Y=6049 + +Button A: X+36, Y+76 +Button B: X+54, Y+19 +Prize: X=602, Y=11197 + +Button A: X+51, Y+19 +Button B: X+12, Y+67 +Prize: X=740, Y=1681 + +Button A: X+37, Y+19 +Button B: X+25, Y+98 +Prize: X=2987, Y=5281 + +Button A: X+15, Y+68 +Button B: X+62, Y+21 +Prize: X=13634, Y=1083 + +Button A: X+25, Y+92 +Button B: X+97, Y+76 +Prize: X=10483, Y=13572 + +Button A: X+40, Y+18 +Button B: X+17, Y+62 +Prize: X=17013, Y=13476 + +Button A: X+76, Y+28 +Button B: X+14, Y+43 +Prize: X=668, Y=4206 + +Button A: X+37, Y+12 +Button B: X+15, Y+66 +Prize: X=15383, Y=13010 + +Button A: X+52, Y+14 +Button B: X+25, Y+62 +Prize: X=4629, Y=14632 + +Button A: X+68, Y+34 +Button B: X+12, Y+55 +Prize: X=14908, Y=17865 + +Button A: X+83, Y+45 +Button B: X+23, Y+41 +Prize: X=5421, Y=3795 + +Button A: X+78, Y+27 +Button B: X+45, Y+68 +Prize: X=4311, Y=4061 + +Button A: X+16, Y+91 +Button B: X+82, Y+72 +Prize: X=5656, Y=5351 + +Button A: X+60, Y+20 +Button B: X+17, Y+55 +Prize: X=1561, Y=3135 + +Button A: X+15, Y+56 +Button B: X+71, Y+11 +Prize: X=12551, Y=16574 + +Button A: X+12, Y+35 +Button B: X+61, Y+14 +Prize: X=17527, Y=19023 + +Button A: X+39, Y+23 +Button B: X+23, Y+42 +Prize: X=4867, Y=9906 + +Button A: X+34, Y+51 +Button B: X+48, Y+23 +Prize: X=13054, Y=9219 + +Button A: X+81, Y+51 +Button B: X+22, Y+90 +Prize: X=4582, Y=7530 + +Button A: X+38, Y+36 +Button B: X+14, Y+68 +Prize: X=1822, Y=2164 + +Button A: X+23, Y+84 +Button B: X+67, Y+11 +Prize: X=15640, Y=15995 + +Button A: X+49, Y+79 +Button B: X+33, Y+13 +Prize: X=13515, Y=4035 + +Button A: X+12, Y+58 +Button B: X+89, Y+40 +Prize: X=4834, Y=3856 + +Button A: X+31, Y+50 +Button B: X+78, Y+18 +Prize: X=2445, Y=1464 + +Button A: X+66, Y+28 +Button B: X+43, Y+67 +Prize: X=4151, Y=3175 + +Button A: X+72, Y+30 +Button B: X+13, Y+40 +Prize: X=18183, Y=18360 + +Button A: X+64, Y+41 +Button B: X+17, Y+42 +Prize: X=17623, Y=1156 + +Button A: X+60, Y+12 +Button B: X+22, Y+60 +Prize: X=5656, Y=4004 + +Button A: X+35, Y+11 +Button B: X+47, Y+67 +Prize: X=4904, Y=3996 + +Button A: X+16, Y+43 +Button B: X+51, Y+20 +Prize: X=10743, Y=15989 + +Button A: X+18, Y+24 +Button B: X+91, Y+22 +Prize: X=3473, Y=1154 + +Button A: X+24, Y+69 +Button B: X+64, Y+25 +Prize: X=8232, Y=3297 + +Button A: X+82, Y+20 +Button B: X+71, Y+86 +Prize: X=8175, Y=5222 + +Button A: X+80, Y+17 +Button B: X+17, Y+79 +Prize: X=1834, Y=1342 + +Button A: X+83, Y+22 +Button B: X+43, Y+92 +Prize: X=3748, Y=6152 + +Button A: X+25, Y+45 +Button B: X+58, Y+25 +Prize: X=17894, Y=15400 + +Button A: X+81, Y+17 +Button B: X+15, Y+76 +Prize: X=842, Y=8595 + +Button A: X+69, Y+31 +Button B: X+15, Y+61 +Prize: X=14162, Y=6486 + +Button A: X+54, Y+16 +Button B: X+23, Y+38 +Prize: X=5410, Y=2788 + +Button A: X+13, Y+58 +Button B: X+69, Y+12 +Prize: X=12856, Y=13042 + +Button A: X+17, Y+53 +Button B: X+42, Y+17 +Prize: X=8799, Y=8442 + +Button A: X+16, Y+39 +Button B: X+47, Y+25 +Prize: X=4182, Y=16147 + +Button A: X+15, Y+39 +Button B: X+48, Y+21 +Prize: X=16817, Y=6797 + +Button A: X+32, Y+48 +Button B: X+34, Y+16 +Prize: X=15440, Y=14240 + +Button A: X+19, Y+47 +Button B: X+70, Y+32 +Prize: X=14083, Y=16647 + +Button A: X+42, Y+86 +Button B: X+53, Y+30 +Prize: X=1133, Y=828 + +Button A: X+20, Y+71 +Button B: X+37, Y+13 +Prize: X=14666, Y=212 + +Button A: X+25, Y+85 +Button B: X+87, Y+81 +Prize: X=7639, Y=10507 + +Button A: X+26, Y+77 +Button B: X+58, Y+11 +Prize: X=13070, Y=11375 + +Button A: X+14, Y+70 +Button B: X+65, Y+21 +Prize: X=7324, Y=3308 + +Button A: X+12, Y+52 +Button B: X+70, Y+24 +Prize: X=2306, Y=9556 + +Button A: X+58, Y+76 +Button B: X+72, Y+26 +Prize: X=2134, Y=1156 + +Button A: X+60, Y+34 +Button B: X+42, Y+86 +Prize: X=3150, Y=5828 + +Button A: X+62, Y+31 +Button B: X+48, Y+97 +Prize: X=7814, Y=10039 + +Button A: X+29, Y+82 +Button B: X+89, Y+21 +Prize: X=9618, Y=8282 + +Button A: X+73, Y+39 +Button B: X+17, Y+46 +Prize: X=7127, Y=6761 + +Button A: X+39, Y+11 +Button B: X+17, Y+62 +Prize: X=15705, Y=1673 + +Button A: X+45, Y+60 +Button B: X+77, Y+12 +Prize: X=4738, Y=2328 + +Button A: X+59, Y+28 +Button B: X+36, Y+69 +Prize: X=4378, Y=11871 + +Button A: X+19, Y+42 +Button B: X+59, Y+34 +Prize: X=1337, Y=582 + +Button A: X+14, Y+41 +Button B: X+62, Y+39 +Prize: X=19064, Y=3530 + +Button A: X+12, Y+36 +Button B: X+63, Y+28 +Prize: X=5414, Y=15996 + +Button A: X+94, Y+21 +Button B: X+40, Y+43 +Prize: X=8480, Y=4313 + +Button A: X+11, Y+83 +Button B: X+52, Y+55 +Prize: X=5475, Y=11286 + +Button A: X+38, Y+18 +Button B: X+33, Y+59 +Prize: X=2195, Y=3425 + +Button A: X+86, Y+13 +Button B: X+27, Y+50 +Prize: X=2572, Y=1399 + +Button A: X+93, Y+18 +Button B: X+48, Y+47 +Prize: X=5703, Y=3027 + +Button A: X+25, Y+92 +Button B: X+23, Y+13 +Prize: X=1716, Y=3306 + +Button A: X+96, Y+44 +Button B: X+21, Y+54 +Prize: X=7977, Y=3878 + +Button A: X+95, Y+12 +Button B: X+77, Y+87 +Prize: X=11121, Y=6273 + +Button A: X+19, Y+76 +Button B: X+37, Y+15 +Prize: X=3389, Y=1852 + +Button A: X+12, Y+54 +Button B: X+77, Y+27 +Prize: X=6017, Y=8927 + +Button A: X+38, Y+20 +Button B: X+41, Y+83 +Prize: X=1846, Y=2200 + +Button A: X+82, Y+22 +Button B: X+11, Y+24 +Prize: X=2171, Y=2540 + +Button A: X+50, Y+11 +Button B: X+14, Y+25 +Prize: X=3144, Y=968 + +Button A: X+60, Y+23 +Button B: X+64, Y+97 +Prize: X=8996, Y=9898 + +Button A: X+16, Y+55 +Button B: X+71, Y+31 +Prize: X=19013, Y=12735 + +Button A: X+50, Y+23 +Button B: X+13, Y+23 +Prize: X=15100, Y=9760 + +Button A: X+40, Y+58 +Button B: X+67, Y+16 +Prize: X=5613, Y=1728 + +Button A: X+18, Y+63 +Button B: X+73, Y+12 +Prize: X=18494, Y=14435 + +Button A: X+41, Y+22 +Button B: X+22, Y+38 +Prize: X=10405, Y=13134 + +Button A: X+67, Y+87 +Button B: X+47, Y+17 +Prize: X=8357, Y=6977 + +Button A: X+24, Y+49 +Button B: X+47, Y+18 +Prize: X=9158, Y=4969 + +Button A: X+74, Y+55 +Button B: X+19, Y+74 +Prize: X=3926, Y=7828 + +Button A: X+29, Y+75 +Button B: X+88, Y+62 +Prize: X=7887, Y=6157 + +Button A: X+72, Y+35 +Button B: X+11, Y+53 +Prize: X=12009, Y=3226 + +Button A: X+68, Y+14 +Button B: X+24, Y+78 +Prize: X=9796, Y=4288 + +Button A: X+64, Y+19 +Button B: X+38, Y+49 +Prize: X=1654, Y=1434 + +Button A: X+92, Y+40 +Button B: X+19, Y+68 +Prize: X=8857, Y=4508 + +Button A: X+18, Y+36 +Button B: X+58, Y+33 +Prize: X=2710, Y=1851 + +Button A: X+58, Y+14 +Button B: X+18, Y+64 +Prize: X=3912, Y=2686 + +Button A: X+53, Y+20 +Button B: X+21, Y+36 +Prize: X=16294, Y=12904 + +Button A: X+23, Y+96 +Button B: X+84, Y+40 +Prize: X=4255, Y=3472 + +Button A: X+23, Y+48 +Button B: X+56, Y+28 +Prize: X=14775, Y=16408 + +Button A: X+11, Y+79 +Button B: X+30, Y+31 +Prize: X=2925, Y=8095 + +Button A: X+56, Y+83 +Button B: X+36, Y+13 +Prize: X=4976, Y=17088 + +Button A: X+20, Y+86 +Button B: X+94, Y+11 +Prize: X=6622, Y=3703 + +Button A: X+51, Y+16 +Button B: X+53, Y+80 +Prize: X=7012, Y=4608 + +Button A: X+45, Y+62 +Button B: X+58, Y+21 +Prize: X=4237, Y=2951 + +Button A: X+27, Y+50 +Button B: X+26, Y+16 +Prize: X=15183, Y=15590 + +Button A: X+98, Y+27 +Button B: X+31, Y+53 +Prize: X=4669, Y=2220 + +Button A: X+15, Y+67 +Button B: X+58, Y+22 +Prize: X=14390, Y=4978 + +Button A: X+96, Y+41 +Button B: X+13, Y+49 +Prize: X=4275, Y=4563 + +Button A: X+45, Y+76 +Button B: X+53, Y+27 +Prize: X=5037, Y=6069 + +Button A: X+23, Y+12 +Button B: X+32, Y+85 +Prize: X=4539, Y=9062 + +Button A: X+23, Y+55 +Button B: X+63, Y+31 +Prize: X=2492, Y=8764 + +Button A: X+17, Y+34 +Button B: X+74, Y+34 +Prize: X=5054, Y=2584 + +Button A: X+22, Y+20 +Button B: X+69, Y+14 +Prize: X=5162, Y=1964 + +Button A: X+73, Y+43 +Button B: X+14, Y+30 +Prize: X=4519, Y=14141 + +Button A: X+20, Y+41 +Button B: X+52, Y+34 +Prize: X=15084, Y=12885 + +Button A: X+48, Y+16 +Button B: X+16, Y+26 +Prize: X=12208, Y=5510 + +Button A: X+15, Y+68 +Button B: X+59, Y+20 +Prize: X=14017, Y=4348 + +Button A: X+33, Y+43 +Button B: X+88, Y+29 +Prize: X=5863, Y=2157 + +Button A: X+90, Y+59 +Button B: X+20, Y+63 +Prize: X=8390, Y=10040 + +Button A: X+16, Y+40 +Button B: X+38, Y+27 +Prize: X=1930, Y=1629 + +Button A: X+51, Y+59 +Button B: X+93, Y+13 +Prize: X=7260, Y=5372 + +Button A: X+26, Y+54 +Button B: X+60, Y+39 +Prize: X=7640, Y=7563 + +Button A: X+24, Y+60 +Button B: X+55, Y+18 +Prize: X=13404, Y=10124 + +Button A: X+71, Y+12 +Button B: X+20, Y+69 +Prize: X=7325, Y=16931 + +Button A: X+31, Y+62 +Button B: X+91, Y+46 +Prize: X=3619, Y=2478 + +Button A: X+30, Y+81 +Button B: X+91, Y+64 +Prize: X=6973, Y=5563 + +Button A: X+57, Y+20 +Button B: X+24, Y+56 +Prize: X=6896, Y=6032 + +Button A: X+94, Y+48 +Button B: X+40, Y+66 +Prize: X=10026, Y=5940 + +Button A: X+38, Y+95 +Button B: X+61, Y+29 +Prize: X=7490, Y=6869 + +Button A: X+66, Y+91 +Button B: X+76, Y+25 +Prize: X=8304, Y=7859 + +Button A: X+39, Y+19 +Button B: X+12, Y+18 +Prize: X=7967, Y=11793 + +Button A: X+96, Y+31 +Button B: X+20, Y+67 +Prize: X=2600, Y=2898 + +Button A: X+67, Y+16 +Button B: X+23, Y+67 +Prize: X=19653, Y=13787 + +Button A: X+17, Y+37 +Button B: X+56, Y+34 +Prize: X=266, Y=8102 + +Button A: X+74, Y+17 +Button B: X+23, Y+74 +Prize: X=17764, Y=14647 + +Button A: X+95, Y+38 +Button B: X+50, Y+73 +Prize: X=11310, Y=6644 + +Button A: X+82, Y+13 +Button B: X+13, Y+66 +Prize: X=11485, Y=3256 + +Button A: X+98, Y+37 +Button B: X+32, Y+88 +Prize: X=8598, Y=6207 + +Button A: X+30, Y+45 +Button B: X+40, Y+13 +Prize: X=19780, Y=3463 + +Button A: X+22, Y+49 +Button B: X+95, Y+28 +Prize: X=9489, Y=4795 + +Button A: X+52, Y+16 +Button B: X+13, Y+71 +Prize: X=11274, Y=11738 + +Button A: X+39, Y+74 +Button B: X+95, Y+47 +Prize: X=10423, Y=9916 + +Button A: X+55, Y+85 +Button B: X+96, Y+35 +Prize: X=5253, Y=2110 + +Button A: X+37, Y+33 +Button B: X+29, Y+90 +Prize: X=1699, Y=4209 + +Button A: X+19, Y+75 +Button B: X+90, Y+67 +Prize: X=8877, Y=12268 + +Button A: X+13, Y+31 +Button B: X+40, Y+27 +Prize: X=15606, Y=17360 + +Button A: X+14, Y+83 +Button B: X+84, Y+25 +Prize: X=5446, Y=9110 + +Button A: X+31, Y+58 +Button B: X+45, Y+13 +Prize: X=13589, Y=2965 + +Button A: X+56, Y+12 +Button B: X+40, Y+61 +Prize: X=7600, Y=5351 + +Button A: X+50, Y+30 +Button B: X+16, Y+34 +Prize: X=14194, Y=18386 + +Button A: X+12, Y+34 +Button B: X+35, Y+13 +Prize: X=18026, Y=5992 + +Button A: X+26, Y+83 +Button B: X+73, Y+15 +Prize: X=3330, Y=8173 + +Button A: X+69, Y+29 +Button B: X+11, Y+45 +Prize: X=1131, Y=4841 + +Button A: X+40, Y+74 +Button B: X+51, Y+13 +Prize: X=3375, Y=2583 + +Button A: X+51, Y+27 +Button B: X+11, Y+24 +Prize: X=18338, Y=431 + +Button A: X+14, Y+94 +Button B: X+78, Y+72 +Prize: X=2114, Y=4708 + +Button A: X+79, Y+72 +Button B: X+90, Y+19 +Prize: X=2094, Y=774 + +Button A: X+73, Y+79 +Button B: X+58, Y+13 +Prize: X=4001, Y=2588 + +Button A: X+16, Y+38 +Button B: X+57, Y+41 +Prize: X=1614, Y=2512 + +Button A: X+15, Y+48 +Button B: X+70, Y+34 +Prize: X=7570, Y=9634 + +Button A: X+46, Y+48 +Button B: X+67, Y+19 +Prize: X=7208, Y=3652 + +Button A: X+41, Y+70 +Button B: X+43, Y+17 +Prize: X=11708, Y=7946 + +Button A: X+12, Y+45 +Button B: X+58, Y+39 +Prize: X=1830, Y=3114 + +Button A: X+44, Y+16 +Button B: X+12, Y+43 +Prize: X=4220, Y=10655 + +Button A: X+35, Y+21 +Button B: X+13, Y+47 +Prize: X=10931, Y=10889 + +Button A: X+72, Y+12 +Button B: X+16, Y+67 +Prize: X=10608, Y=4182 + +Button A: X+20, Y+46 +Button B: X+26, Y+16 +Prize: X=11452, Y=2952 + +Button A: X+45, Y+20 +Button B: X+24, Y+39 +Prize: X=13166, Y=12551 + +Button A: X+65, Y+23 +Button B: X+11, Y+33 +Prize: X=19578, Y=5834 + +Button A: X+78, Y+31 +Button B: X+12, Y+55 +Prize: X=2456, Y=19050 + +Button A: X+39, Y+99 +Button B: X+98, Y+35 +Prize: X=5176, Y=9505 + +Button A: X+12, Y+25 +Button B: X+33, Y+22 +Prize: X=19454, Y=10070 + +Button A: X+48, Y+15 +Button B: X+15, Y+29 +Prize: X=9644, Y=17154 + +Button A: X+88, Y+81 +Button B: X+74, Y+11 +Prize: X=8202, Y=2238 + +Button A: X+24, Y+85 +Button B: X+41, Y+25 +Prize: X=4286, Y=3880 + +Button A: X+25, Y+99 +Button B: X+88, Y+37 +Prize: X=7066, Y=10227 + +Button A: X+21, Y+12 +Button B: X+15, Y+65 +Prize: X=1236, Y=1722 + +Button A: X+80, Y+33 +Button B: X+14, Y+96 +Prize: X=6680, Y=4560 + +Button A: X+39, Y+91 +Button B: X+42, Y+31 +Prize: X=2343, Y=1916 + +Button A: X+37, Y+11 +Button B: X+17, Y+47 +Prize: X=1729, Y=4415 + +Button A: X+50, Y+11 +Button B: X+65, Y+92 +Prize: X=9450, Y=9072 + +Button A: X+11, Y+99 +Button B: X+78, Y+12 +Prize: X=6466, Y=6444 + +Button A: X+69, Y+38 +Button B: X+34, Y+79 +Prize: X=5916, Y=5428 + +Button A: X+13, Y+49 +Button B: X+60, Y+22 +Prize: X=6187, Y=13675 + +Button A: X+11, Y+42 +Button B: X+88, Y+42 +Prize: X=1298, Y=3780 + +Button A: X+63, Y+12 +Button B: X+11, Y+82 +Prize: X=13411, Y=14496 + +Button A: X+46, Y+50 +Button B: X+68, Y+14 +Prize: X=6064, Y=1978 + +Button A: X+20, Y+47 +Button B: X+61, Y+16 +Prize: X=8092, Y=12115 + +Button A: X+25, Y+91 +Button B: X+47, Y+18 +Prize: X=2736, Y=4142 + +Button A: X+43, Y+12 +Button B: X+20, Y+34 +Prize: X=15175, Y=16880 + +Button A: X+48, Y+69 +Button B: X+40, Y+14 +Prize: X=14520, Y=8113 + +Button A: X+47, Y+11 +Button B: X+38, Y+66 +Prize: X=18819, Y=10055 + +Button A: X+61, Y+23 +Button B: X+49, Y+80 +Prize: X=4792, Y=4760 + +Button A: X+67, Y+94 +Button B: X+73, Y+12 +Prize: X=5898, Y=4206 + +Button A: X+78, Y+12 +Button B: X+55, Y+45 +Prize: X=2723, Y=1917 + +Button A: X+91, Y+99 +Button B: X+95, Y+21 +Prize: X=14793, Y=9423 + +Button A: X+83, Y+29 +Button B: X+37, Y+47 +Prize: X=4954, Y=5070 + +Button A: X+21, Y+50 +Button B: X+23, Y+11 +Prize: X=5354, Y=15292 + +Button A: X+45, Y+17 +Button B: X+16, Y+53 +Prize: X=1626, Y=8358 + +Button A: X+57, Y+20 +Button B: X+20, Y+51 +Prize: X=17486, Y=17959 + +Button A: X+11, Y+51 +Button B: X+95, Y+13 +Prize: X=9572, Y=4626 + +Button A: X+46, Y+23 +Button B: X+29, Y+56 +Prize: X=11764, Y=7258 + +Button A: X+13, Y+38 +Button B: X+46, Y+15 +Prize: X=13792, Y=16649 + +Button A: X+32, Y+54 +Button B: X+45, Y+19 +Prize: X=1729, Y=6947 + +Button A: X+79, Y+16 +Button B: X+86, Y+83 +Prize: X=5312, Y=1994 + +Button A: X+15, Y+94 +Button B: X+54, Y+23 +Prize: X=5319, Y=10939 + +Button A: X+18, Y+96 +Button B: X+22, Y+21 +Prize: X=2150, Y=2604 + +Button A: X+92, Y+32 +Button B: X+12, Y+42 +Prize: X=6928, Y=4528 + +Button A: X+53, Y+17 +Button B: X+12, Y+61 +Prize: X=6202, Y=9615 + +Button A: X+15, Y+74 +Button B: X+81, Y+11 +Prize: X=13811, Y=18227 + +Button A: X+60, Y+20 +Button B: X+11, Y+65 +Prize: X=15686, Y=2290 + +Button A: X+12, Y+42 +Button B: X+88, Y+35 +Prize: X=6908, Y=5614 + +Button A: X+98, Y+29 +Button B: X+77, Y+90 +Prize: X=9429, Y=6487 + +Button A: X+23, Y+42 +Button B: X+46, Y+27 +Prize: X=14199, Y=9962 + +Button A: X+75, Y+50 +Button B: X+19, Y+44 +Prize: X=17671, Y=17596 + +Button A: X+12, Y+90 +Button B: X+35, Y+41 +Prize: X=2357, Y=8153 + +Button A: X+65, Y+33 +Button B: X+16, Y+57 +Prize: X=2125, Y=11579 + +Button A: X+39, Y+61 +Button B: X+91, Y+36 +Prize: X=10426, Y=5993 + +Button A: X+98, Y+32 +Button B: X+29, Y+43 +Prize: X=4099, Y=3585 + +Button A: X+11, Y+28 +Button B: X+51, Y+24 +Prize: X=10410, Y=7624 + +Button A: X+33, Y+78 +Button B: X+90, Y+29 +Prize: X=8046, Y=5422 + +Button A: X+28, Y+93 +Button B: X+98, Y+26 +Prize: X=2044, Y=3794 + +Button A: X+69, Y+19 +Button B: X+15, Y+59 +Prize: X=1679, Y=14277 + +Button A: X+94, Y+12 +Button B: X+12, Y+16 +Prize: X=6464, Y=912 + +Button A: X+20, Y+57 +Button B: X+37, Y+15 +Prize: X=1017, Y=6431 + +Button A: X+77, Y+22 +Button B: X+25, Y+48 +Prize: X=1378, Y=884 + +Button A: X+44, Y+17 +Button B: X+36, Y+67 +Prize: X=11320, Y=11922 + +Button A: X+31, Y+79 +Button B: X+89, Y+44 +Prize: X=6326, Y=7712 + +Button A: X+71, Y+23 +Button B: X+24, Y+62 +Prize: X=4287, Y=1931 + +Button A: X+65, Y+59 +Button B: X+18, Y+89 +Prize: X=3241, Y=5267 + +Button A: X+62, Y+20 +Button B: X+27, Y+64 +Prize: X=14578, Y=5476 + +Button A: X+19, Y+77 +Button B: X+44, Y+19 +Prize: X=3144, Y=1908 diff --git a/day13/part1.zig b/day13/part1.zig new file mode 100644 index 0000000..69870d0 --- /dev/null +++ b/day13/part1.zig @@ -0,0 +1,89 @@ +const std = @import("std"); +const print = std.debug.print; +const input = @embedFile("input"); +const vec2 = @Vector(2, usize); + +// So I need to find out ax + by = c +// With x and y the number of time I click on a and b respectivly +// a and b as how much I advance per click +// And c as total +// And I have 2 equation, one for prize position x and one for y +// Which you can easely do, for float, not int =( +// So how do I approach this ? +// 1. Brute force: I can do all combinaison of x and y. For like 200 max click. 320 prize, 200 * 200 * 320 = 12_800_000 +// 2. Pretty sure I can do something with a modulo, because the end pos can only be reach by few combinaison + +const State = enum { + ReadButtonA, + ReadButtonB, + ReadPrize, + ReadJump, +}; + +pub fn main() !void { + var iter = std.mem.splitAny(u8, input, "\n"); + var state = State.ReadButtonA; + var buttonA: vec2 = undefined; + var buttonB: vec2 = undefined; + var prize: vec2 = undefined; + var total: usize = 0; + + while (iter.next()) |line| switch (state) { + .ReadButtonA => { + var iterLine = std.mem.splitAny(u8, line, " "); + _ = iterLine.next(); // Skip Button + _ = iterLine.next(); // Skip A + const buf = iterLine.next().?; + buttonA[0] = try std.fmt.parseInt(usize, buf[2 .. buf.len - 1], 10); + buttonA[1] = try std.fmt.parseInt(usize, iterLine.next().?[2..], 10); + state = .ReadButtonB; + }, + .ReadButtonB => { + var iterLine = std.mem.splitAny(u8, line, " "); + _ = iterLine.next(); // Skip Button + _ = iterLine.next(); // Skip B + const buf = iterLine.next().?; + buttonB[0] = try std.fmt.parseInt(usize, buf[2 .. buf.len - 1], 10); + buttonB[1] = try std.fmt.parseInt(usize, iterLine.next().?[2..], 10); + state = .ReadPrize; + }, + .ReadPrize => { + var iterLine = std.mem.splitAny(u8, line, " "); + _ = iterLine.next(); // Skip Price + const buf = iterLine.next().?; + prize[0] = try std.fmt.parseInt(usize, buf[2 .. buf.len - 1], 10); + prize[1] = try std.fmt.parseInt(usize, iterLine.next().?[2..], 10); + state = .ReadJump; + }, + .ReadJump => { + state = .ReadButtonA; + const result = bruteforce(buttonA, buttonB, prize, vec2{ 0, 100 }); + if (result.cost != 99999) total += result.cost; + }, + }; + + try std.testing.expectEqual(33921, total); +} + +const Result = struct { + clickA: usize = 0, + clickB: usize = 0, + cost: usize = 999999, +}; + +fn bruteforce(buttonA: vec2, buttonB: vec2, prize: vec2, range: vec2) Result { + var minA: usize = 99999; + var minB: usize = 99999; + var min_cost: usize = 99999; + for (range[0]..range[1]) |clickA| for (range[0]..range[1]) |clickB| { + const end_pos = buttonA * @as(vec2, @splat(clickA)) + buttonB * @as(vec2, @splat(clickB)); + if (!@reduce(.And, end_pos == prize)) continue; + const cost = clickA * 3 + clickB; + if (cost < min_cost) { + minA = clickA; + minB = clickB; + min_cost = cost; + } + }; + return Result{ .clickA = minA, .clickB = minB, .cost = min_cost }; +} diff --git a/day13/part2.zig b/day13/part2.zig new file mode 100644 index 0000000..f7c0441 --- /dev/null +++ b/day13/part2.zig @@ -0,0 +1,135 @@ +const std = @import("std"); +const print = std.debug.print; +const input = @embedFile("input"); +const Usize = std.atomic.Value(usize); +const vec2 = @Vector(2, usize); + +// I am not proud of this solution, it take like 6h to run on 16 thread :/ +// I am sure I can change the bruteForce function to use modulo to reduce the number of clickA +// But it was late, I was tired so I juste started this version and the next morning it was complete soooo +// I will no go futher, I am already 2 days behind :/ + +const State = enum { + ReadButtonA, + ReadButtonB, + ReadPrize, + ReadJump, +}; + +pub fn main() !void { + var iter = std.mem.splitAny(u8, input, "\n"); + var state = State.ReadButtonA; + var buttonA: vec2 = undefined; + var buttonB: vec2 = undefined; + var prize: vec2 = undefined; + var total = Usize.init(0); + var finished = Usize.init(0); + var to_wait: usize = 0; + + var arena = std.heap.ArenaAllocator.init(std.heap.page_allocator); + defer arena.deinit(); + const allocator = arena.allocator(); + + var thread_arena = std.heap.ThreadSafeAllocator{ + .child_allocator = allocator, + }; + + var thread_pool: std.Thread.Pool = undefined; + thread_pool.init(std.Thread.Pool.Options{ + .allocator = thread_arena.allocator(), + .n_jobs = 16, + }) catch @panic("=("); + + while (iter.next()) |line| switch (state) { + .ReadButtonA => { + var iterLine = std.mem.splitAny(u8, line, " "); + _ = iterLine.next(); // Skip Button + _ = iterLine.next(); // Skip A + const buf = iterLine.next().?; + buttonA[0] = try std.fmt.parseInt(usize, buf[2 .. buf.len - 1], 10); + buttonA[1] = try std.fmt.parseInt(usize, iterLine.next().?[2..], 10); + state = .ReadButtonB; + }, + .ReadButtonB => { + var iterLine = std.mem.splitAny(u8, line, " "); + _ = iterLine.next(); // Skip Button + _ = iterLine.next(); // Skip B + const buf = iterLine.next().?; + buttonB[0] = try std.fmt.parseInt(usize, buf[2 .. buf.len - 1], 10); + buttonB[1] = try std.fmt.parseInt(usize, iterLine.next().?[2..], 10); + state = .ReadPrize; + }, + .ReadPrize => { + var iterLine = std.mem.splitAny(u8, line, " "); + _ = iterLine.next(); // Skip Price + const buf = iterLine.next().?; + prize[0] = try std.fmt.parseInt(usize, buf[2 .. buf.len - 1], 10) + 10000000000000; + prize[1] = try std.fmt.parseInt(usize, iterLine.next().?[2..], 10) + 10000000000000; + state = .ReadJump; + }, + .ReadJump => { + state = .ReadButtonA; + try thread_pool.spawn(bruteforce, .{ buttonA, buttonB, prize, &total, &finished, to_wait }); + to_wait += 1; + }, + }; + + while (to_wait > finished.load(.monotonic)) { + std.time.sleep(1000000); + printProgressOverall(finished.load(.monotonic), to_wait); + } + + print("Total: {d}\n", .{total.load(.monotonic)}); +} + +const Result = struct { + clickA: usize = 0, + clickB: usize = 0, + cost: usize = 999999, +}; + +fn bruteforce(buttonA: vec2, buttonB: vec2, prize: vec2, total: *Usize, finished: *Usize, id: usize) void { + var min_cost: usize = std.math.maxInt(usize); + const max_clickA = @min(@divFloor(prize[0], buttonA[0]), @divFloor(prize[1], buttonA[1])) + 10; + + var clickA: usize = 0; + while (clickA <= max_clickA) : (clickA += 1) { + if (clickA % 1000000000 == 0) printProgress(clickA, max_clickA, id); + + const remaining = prize - buttonA * @as(vec2, @splat(clickA)); + if (@reduce(.Or, remaining < @as(vec2, @splat(0)))) continue; + + const clickB = @divFloor(remaining, buttonB); + if (clickB[0] != clickB[1]) continue; + + if (@reduce(.Or, remaining % buttonB != @as(vec2, @splat(0)))) continue; + + const cost = clickA * 3 + clickB[0]; + if (cost < min_cost) min_cost = cost; + } + + if (min_cost != std.math.maxInt(usize)) { + _ = total.fetchAdd(min_cost, .monotonic); + } + _ = finished.fetchAdd(1, .monotonic); +} + +fn printProgress(value: usize, max: usize, id: usize) void { + print("Thread {d}: {d}% | {d}/{d}\n", .{ id, @divFloor(value * 100, max), value, max }); +} + +fn printProgressOverall(finished: usize, total: usize) void { + std.debug.print("Overall: {d}/{d} ({d}%) \r", .{ finished, total, @divFloor(finished * 100, total) }); +} + +fn gcd(a: u64, b: u64) u64 { + if (b == 0) { + return a; + } else { + return gcd(b, a % b); + } +} + +fn isPossible(a: u64, b: u64, c: u64) bool { + return c % gcd(a, b) == 0; +}