diff --git a/aoc/aoc.c b/aoc/aoc.c index 2161e64..dd2acb4 100644 --- a/aoc/aoc.c +++ b/aoc/aoc.c @@ -28,7 +28,7 @@ Tokens str_tokenize(Arena *arena, str s, str delim) { str stuff = s; isize token_count = 0; - while (str_next_token(&stuff, delim).len > 0) { + for (; stuff.len > 0; str_next_token(&stuff, delim)) { token_count++; } diff --git a/aoc/common.h b/aoc/common.h index 552bf6f..1e4becd 100644 --- a/aoc/common.h +++ b/aoc/common.h @@ -98,76 +98,3 @@ typedef double f64; #define MAX(a, b) ((a) > (b) ? (a) : (b)) #define MIN(a, b) ((a) < (b) ? (a) : (b)) #define CLAMP(x, lo, hi) ((x) < (lo) ? (lo) : (x) > (hi) ? (hi) : (x)) - -typedef union Vec2 { - struct { f32 x, y; }; - struct { f32 u, v; }; -} Vec2; - -typedef union Vec2i { - struct { i32 x, y; }; - struct { i32 u, v; }; -} Vec2i ; - -typedef struct Mat4 { - float e[4][4]; -} Mat4; - - -static inline Vec2 -vec2_add(Vec2 a, Vec2 b) { - Vec2 result = { - .x = a.x + b.x, - .y = a.y + b.y, - }; - return result; -} - -static inline Vec2 -vec2_sub(Vec2 a, Vec2 b) { - Vec2 result = { - .x = a.x - b.x, - .y = a.y - b.y, - }; - return result; -} - -static inline Vec2 -vec2(f32 x, f32 y) { - Vec2 result = {{ x, y }}; - return result; -} - -static inline f32 -vec2_dot(Vec2 a, Vec2 b) { - return a.x * b.x + a.y * b.y; -} - -static inline f32 -vec2_norm2(Vec2 v) { - return vec2_dot(v, v); -} - -static inline f32 -vec2_norm(Vec2 v) { - return sqrtf(vec2_norm2(v)); -} - -static inline f32 -vec2_dist(Vec2 a, Vec2 b) { - return vec2_norm(vec2_sub(a, b)); -} - -typedef struct Rect2i { - int x, y, w, h; -} Rect2i; - -typedef struct Rect2f { - f32 x, y, w, h; -} Rect2f; - -static inline Rect2f -rect2f(f32 x, f32 y, f32 w, f32 h) { - Rect2f result = { x, y, w, h }; - return result; -} diff --git a/day-13/input.txt b/day-13/input.txt new file mode 100644 index 0000000..201bbd5 --- /dev/null +++ b/day-13/input.txt @@ -0,0 +1,1279 @@ +Button A: X+92, Y+17 +Button B: X+27, Y+61 +Prize: X=9152, Y=6172 + +Button A: X+12, Y+61 +Button B: X+41, Y+12 +Prize: X=8771, Y=12729 + +Button A: X+71, Y+11 +Button B: X+14, Y+54 +Prize: X=7189, Y=5889 + +Button A: X+22, Y+36 +Button B: X+49, Y+21 +Prize: X=8122, Y=6806 + +Button A: X+44, Y+88 +Button B: X+72, Y+36 +Prize: X=4972, Y=4004 + +Button A: X+11, Y+57 +Button B: X+50, Y+18 +Prize: X=3024, Y=17456 + +Button A: X+88, Y+91 +Button B: X+80, Y+13 +Prize: X=12096, Y=8255 + +Button A: X+22, Y+50 +Button B: X+48, Y+28 +Prize: X=17238, Y=1530 + +Button A: X+67, Y+19 +Button B: X+25, Y+70 +Prize: X=15607, Y=12559 + +Button A: X+20, Y+58 +Button B: X+67, Y+22 +Prize: X=13571, Y=12102 + +Button A: X+36, Y+74 +Button B: X+82, Y+39 +Prize: X=6484, Y=8146 + +Button A: X+15, Y+73 +Button B: X+89, Y+17 +Prize: X=9054, Y=4114 + +Button A: X+40, Y+23 +Button B: X+12, Y+41 +Prize: X=10476, Y=1521 + +Button A: X+61, Y+30 +Button B: X+43, Y+71 +Prize: X=5659, Y=5525 + +Button A: X+56, Y+20 +Button B: X+36, Y+75 +Prize: X=15692, Y=11255 + +Button A: X+12, Y+54 +Button B: X+28, Y+27 +Prize: X=540, Y=945 + +Button A: X+62, Y+18 +Button B: X+47, Y+71 +Prize: X=8201, Y=6109 + +Button A: X+55, Y+90 +Button B: X+95, Y+35 +Prize: X=7345, Y=9610 + +Button A: X+92, Y+77 +Button B: X+26, Y+76 +Prize: X=9400, Y=9820 + +Button A: X+76, Y+75 +Button B: X+12, Y+66 +Prize: X=2440, Y=5874 + +Button A: X+82, Y+12 +Button B: X+56, Y+95 +Prize: X=2336, Y=2946 + +Button A: X+63, Y+82 +Button B: X+72, Y+14 +Prize: X=5661, Y=3542 + +Button A: X+35, Y+72 +Button B: X+57, Y+14 +Prize: X=17617, Y=5546 + +Button A: X+80, Y+24 +Button B: X+33, Y+89 +Prize: X=8581, Y=5501 + +Button A: X+68, Y+37 +Button B: X+42, Y+88 +Prize: X=7270, Y=5845 + +Button A: X+12, Y+52 +Button B: X+34, Y+12 +Prize: X=7922, Y=17576 + +Button A: X+61, Y+74 +Button B: X+76, Y+23 +Prize: X=7511, Y=2884 + +Button A: X+84, Y+33 +Button B: X+12, Y+18 +Prize: X=3372, Y=2268 + +Button A: X+32, Y+68 +Button B: X+52, Y+19 +Prize: X=3288, Y=3522 + +Button A: X+18, Y+57 +Button B: X+71, Y+15 +Prize: X=3948, Y=6983 + +Button A: X+80, Y+40 +Button B: X+23, Y+67 +Prize: X=5874, Y=7266 + +Button A: X+81, Y+53 +Button B: X+19, Y+79 +Prize: X=3362, Y=4330 + +Button A: X+37, Y+79 +Button B: X+95, Y+26 +Prize: X=4045, Y=3862 + +Button A: X+89, Y+36 +Button B: X+58, Y+91 +Prize: X=7323, Y=6204 + +Button A: X+28, Y+23 +Button B: X+11, Y+91 +Prize: X=1531, Y=7241 + +Button A: X+28, Y+60 +Button B: X+62, Y+20 +Prize: X=16504, Y=6340 + +Button A: X+23, Y+71 +Button B: X+94, Y+75 +Prize: X=1711, Y=1839 + +Button A: X+18, Y+54 +Button B: X+60, Y+13 +Prize: X=6068, Y=16687 + +Button A: X+11, Y+44 +Button B: X+69, Y+23 +Prize: X=770, Y=1009 + +Button A: X+83, Y+60 +Button B: X+13, Y+45 +Prize: X=3334, Y=3585 + +Button A: X+30, Y+60 +Button B: X+50, Y+13 +Prize: X=19290, Y=15493 + +Button A: X+26, Y+79 +Button B: X+94, Y+35 +Prize: X=7188, Y=7806 + +Button A: X+29, Y+60 +Button B: X+53, Y+13 +Prize: X=11472, Y=418 + +Button A: X+97, Y+86 +Button B: X+13, Y+99 +Prize: X=2527, Y=8801 + +Button A: X+67, Y+99 +Button B: X+98, Y+27 +Prize: X=3521, Y=3789 + +Button A: X+55, Y+77 +Button B: X+37, Y+15 +Prize: X=14225, Y=12883 + +Button A: X+13, Y+20 +Button B: X+41, Y+18 +Prize: X=1233, Y=770 + +Button A: X+97, Y+48 +Button B: X+14, Y+57 +Prize: X=8380, Y=7752 + +Button A: X+12, Y+61 +Button B: X+69, Y+17 +Prize: X=3305, Y=1545 + +Button A: X+15, Y+56 +Button B: X+64, Y+31 +Prize: X=3453, Y=3344 + +Button A: X+45, Y+62 +Button B: X+33, Y+12 +Prize: X=3635, Y=16852 + +Button A: X+36, Y+12 +Button B: X+12, Y+33 +Prize: X=10856, Y=4394 + +Button A: X+55, Y+89 +Button B: X+82, Y+24 +Prize: X=3886, Y=2158 + +Button A: X+26, Y+73 +Button B: X+97, Y+68 +Prize: X=9733, Y=7097 + +Button A: X+87, Y+46 +Button B: X+11, Y+52 +Prize: X=1369, Y=15432 + +Button A: X+48, Y+20 +Button B: X+37, Y+68 +Prize: X=12376, Y=4116 + +Button A: X+34, Y+75 +Button B: X+77, Y+31 +Prize: X=3397, Y=5966 + +Button A: X+26, Y+59 +Button B: X+35, Y+18 +Prize: X=12833, Y=3002 + +Button A: X+16, Y+65 +Button B: X+92, Y+19 +Prize: X=4248, Y=3777 + +Button A: X+65, Y+21 +Button B: X+29, Y+68 +Prize: X=3813, Y=14170 + +Button A: X+37, Y+12 +Button B: X+28, Y+43 +Prize: X=3647, Y=5762 + +Button A: X+66, Y+28 +Button B: X+31, Y+84 +Prize: X=2952, Y=4228 + +Button A: X+48, Y+86 +Button B: X+73, Y+31 +Prize: X=7120, Y=6370 + +Button A: X+81, Y+34 +Button B: X+50, Y+93 +Prize: X=8280, Y=6068 + +Button A: X+26, Y+50 +Button B: X+87, Y+32 +Prize: X=4167, Y=1654 + +Button A: X+19, Y+98 +Button B: X+33, Y+19 +Prize: X=3742, Y=4331 + +Button A: X+17, Y+52 +Button B: X+61, Y+22 +Prize: X=3176, Y=9284 + +Button A: X+18, Y+41 +Button B: X+71, Y+43 +Prize: X=8552, Y=2649 + +Button A: X+51, Y+14 +Button B: X+66, Y+89 +Prize: X=6510, Y=8450 + +Button A: X+11, Y+38 +Button B: X+58, Y+13 +Prize: X=13236, Y=9231 + +Button A: X+26, Y+15 +Button B: X+32, Y+56 +Prize: X=13378, Y=1307 + +Button A: X+48, Y+12 +Button B: X+43, Y+77 +Prize: X=8151, Y=4369 + +Button A: X+83, Y+28 +Button B: X+19, Y+24 +Prize: X=6854, Y=2664 + +Button A: X+45, Y+53 +Button B: X+56, Y+17 +Prize: X=8035, Y=5547 + +Button A: X+57, Y+26 +Button B: X+13, Y+24 +Prize: X=5477, Y=3456 + +Button A: X+64, Y+34 +Button B: X+20, Y+48 +Prize: X=14540, Y=13044 + +Button A: X+63, Y+39 +Button B: X+41, Y+78 +Prize: X=5827, Y=6396 + +Button A: X+75, Y+15 +Button B: X+15, Y+71 +Prize: X=18125, Y=11885 + +Button A: X+67, Y+25 +Button B: X+57, Y+82 +Prize: X=4467, Y=3428 + +Button A: X+67, Y+19 +Button B: X+18, Y+47 +Prize: X=11739, Y=7909 + +Button A: X+11, Y+66 +Button B: X+76, Y+13 +Prize: X=18011, Y=14042 + +Button A: X+71, Y+82 +Button B: X+78, Y+18 +Prize: X=6875, Y=4408 + +Button A: X+39, Y+52 +Button B: X+53, Y+14 +Prize: X=4891, Y=2668 + +Button A: X+44, Y+25 +Button B: X+14, Y+44 +Prize: X=17914, Y=12221 + +Button A: X+82, Y+38 +Button B: X+46, Y+94 +Prize: X=8364, Y=6856 + +Button A: X+18, Y+59 +Button B: X+64, Y+27 +Prize: X=16262, Y=18991 + +Button A: X+55, Y+70 +Button B: X+91, Y+11 +Prize: X=7510, Y=2745 + +Button A: X+31, Y+13 +Button B: X+11, Y+92 +Prize: X=943, Y=6163 + +Button A: X+42, Y+70 +Button B: X+67, Y+26 +Prize: X=6861, Y=7066 + +Button A: X+49, Y+20 +Button B: X+14, Y+39 +Prize: X=2065, Y=4005 + +Button A: X+69, Y+11 +Button B: X+54, Y+56 +Prize: X=5592, Y=1318 + +Button A: X+69, Y+35 +Button B: X+12, Y+44 +Prize: X=4697, Y=2487 + +Button A: X+85, Y+19 +Button B: X+41, Y+51 +Prize: X=2901, Y=1527 + +Button A: X+52, Y+14 +Button B: X+23, Y+67 +Prize: X=16545, Y=3463 + +Button A: X+43, Y+14 +Button B: X+13, Y+61 +Prize: X=19114, Y=16830 + +Button A: X+42, Y+71 +Button B: X+93, Y+21 +Prize: X=4809, Y=3362 + +Button A: X+79, Y+34 +Button B: X+45, Y+99 +Prize: X=8849, Y=9542 + +Button A: X+62, Y+22 +Button B: X+38, Y+57 +Prize: X=6450, Y=5770 + +Button A: X+31, Y+67 +Button B: X+83, Y+56 +Prize: X=5663, Y=8291 + +Button A: X+15, Y+50 +Button B: X+38, Y+19 +Prize: X=3628, Y=7019 + +Button A: X+83, Y+31 +Button B: X+46, Y+56 +Prize: X=470, Y=292 + +Button A: X+19, Y+95 +Button B: X+67, Y+15 +Prize: X=6784, Y=8960 + +Button A: X+20, Y+83 +Button B: X+29, Y+15 +Prize: X=1607, Y=2139 + +Button A: X+28, Y+52 +Button B: X+91, Y+22 +Prize: X=1141, Y=502 + +Button A: X+75, Y+27 +Button B: X+45, Y+72 +Prize: X=6960, Y=3231 + +Button A: X+56, Y+76 +Button B: X+93, Y+13 +Prize: X=12274, Y=7374 + +Button A: X+86, Y+34 +Button B: X+50, Y+65 +Prize: X=8286, Y=6804 + +Button A: X+65, Y+24 +Button B: X+14, Y+33 +Prize: X=14442, Y=3530 + +Button A: X+98, Y+33 +Button B: X+68, Y+78 +Prize: X=9486, Y=4131 + +Button A: X+37, Y+87 +Button B: X+97, Y+39 +Prize: X=5839, Y=3141 + +Button A: X+77, Y+32 +Button B: X+30, Y+61 +Prize: X=3936, Y=2024 + +Button A: X+36, Y+18 +Button B: X+11, Y+35 +Prize: X=8099, Y=8099 + +Button A: X+96, Y+43 +Button B: X+41, Y+83 +Prize: X=5305, Y=3475 + +Button A: X+79, Y+11 +Button B: X+32, Y+35 +Prize: X=2181, Y=1556 + +Button A: X+26, Y+60 +Button B: X+64, Y+23 +Prize: X=3188, Y=11974 + +Button A: X+42, Y+16 +Button B: X+18, Y+61 +Prize: X=14534, Y=8311 + +Button A: X+12, Y+48 +Button B: X+79, Y+29 +Prize: X=11975, Y=9941 + +Button A: X+17, Y+54 +Button B: X+63, Y+30 +Prize: X=2089, Y=10202 + +Button A: X+62, Y+24 +Button B: X+11, Y+35 +Prize: X=4439, Y=13677 + +Button A: X+46, Y+57 +Button B: X+55, Y+15 +Prize: X=5256, Y=4812 + +Button A: X+34, Y+17 +Button B: X+25, Y+56 +Prize: X=10318, Y=7437 + +Button A: X+19, Y+82 +Button B: X+67, Y+47 +Prize: X=1736, Y=4102 + +Button A: X+46, Y+19 +Button B: X+35, Y+66 +Prize: X=11211, Y=10607 + +Button A: X+47, Y+64 +Button B: X+93, Y+40 +Prize: X=11287, Y=7832 + +Button A: X+70, Y+40 +Button B: X+14, Y+81 +Prize: X=3332, Y=6868 + +Button A: X+81, Y+11 +Button B: X+11, Y+72 +Prize: X=4578, Y=8951 + +Button A: X+24, Y+52 +Button B: X+57, Y+15 +Prize: X=18755, Y=16053 + +Button A: X+95, Y+41 +Button B: X+32, Y+83 +Prize: X=7637, Y=4403 + +Button A: X+25, Y+52 +Button B: X+59, Y+21 +Prize: X=4618, Y=15514 + +Button A: X+62, Y+24 +Button B: X+30, Y+68 +Prize: X=5346, Y=1736 + +Button A: X+14, Y+37 +Button B: X+66, Y+37 +Prize: X=17488, Y=17306 + +Button A: X+68, Y+24 +Button B: X+69, Y+95 +Prize: X=5094, Y=6178 + +Button A: X+19, Y+29 +Button B: X+99, Y+19 +Prize: X=1926, Y=826 + +Button A: X+15, Y+33 +Button B: X+63, Y+23 +Prize: X=13331, Y=11029 + +Button A: X+90, Y+12 +Button B: X+12, Y+65 +Prize: X=6102, Y=5949 + +Button A: X+31, Y+68 +Button B: X+56, Y+12 +Prize: X=16228, Y=8080 + +Button A: X+28, Y+73 +Button B: X+57, Y+17 +Prize: X=14247, Y=3172 + +Button A: X+11, Y+26 +Button B: X+37, Y+23 +Prize: X=13427, Y=7273 + +Button A: X+41, Y+19 +Button B: X+15, Y+73 +Prize: X=3548, Y=4088 + +Button A: X+86, Y+82 +Button B: X+24, Y+86 +Prize: X=7332, Y=11346 + +Button A: X+89, Y+24 +Button B: X+39, Y+78 +Prize: X=6928, Y=4770 + +Button A: X+31, Y+45 +Button B: X+40, Y+14 +Prize: X=15091, Y=14401 + +Button A: X+48, Y+26 +Button B: X+16, Y+51 +Prize: X=10016, Y=4137 + +Button A: X+16, Y+45 +Button B: X+58, Y+20 +Prize: X=14050, Y=5760 + +Button A: X+15, Y+38 +Button B: X+83, Y+26 +Prize: X=8740, Y=4636 + +Button A: X+31, Y+52 +Button B: X+36, Y+18 +Prize: X=10505, Y=1352 + +Button A: X+11, Y+29 +Button B: X+56, Y+31 +Prize: X=3071, Y=15583 + +Button A: X+41, Y+13 +Button B: X+51, Y+84 +Prize: X=18140, Y=4034 + +Button A: X+31, Y+20 +Button B: X+11, Y+43 +Prize: X=393, Y=828 + +Button A: X+54, Y+33 +Button B: X+20, Y+38 +Prize: X=7204, Y=6838 + +Button A: X+43, Y+65 +Button B: X+41, Y+12 +Prize: X=12942, Y=5307 + +Button A: X+45, Y+19 +Button B: X+34, Y+69 +Prize: X=16741, Y=19477 + +Button A: X+35, Y+99 +Button B: X+95, Y+13 +Prize: X=4455, Y=5697 + +Button A: X+83, Y+88 +Button B: X+68, Y+13 +Prize: X=8324, Y=7939 + +Button A: X+60, Y+30 +Button B: X+28, Y+47 +Prize: X=4808, Y=3262 + +Button A: X+65, Y+24 +Button B: X+23, Y+33 +Prize: X=4552, Y=2514 + +Button A: X+70, Y+11 +Button B: X+96, Y+93 +Prize: X=9974, Y=7333 + +Button A: X+69, Y+11 +Button B: X+40, Y+95 +Prize: X=4751, Y=2264 + +Button A: X+12, Y+38 +Button B: X+41, Y+22 +Prize: X=10631, Y=18294 + +Button A: X+17, Y+46 +Button B: X+77, Y+50 +Prize: X=4969, Y=842 + +Button A: X+29, Y+72 +Button B: X+37, Y+14 +Prize: X=9755, Y=16850 + +Button A: X+24, Y+13 +Button B: X+12, Y+28 +Prize: X=416, Y=276 + +Button A: X+19, Y+46 +Button B: X+63, Y+29 +Prize: X=4385, Y=4440 + +Button A: X+31, Y+71 +Button B: X+45, Y+13 +Prize: X=12901, Y=16461 + +Button A: X+54, Y+12 +Button B: X+11, Y+30 +Prize: X=3603, Y=9422 + +Button A: X+75, Y+14 +Button B: X+75, Y+89 +Prize: X=8475, Y=4057 + +Button A: X+28, Y+57 +Button B: X+59, Y+26 +Prize: X=920, Y=7915 + +Button A: X+75, Y+67 +Button B: X+66, Y+11 +Prize: X=1692, Y=936 + +Button A: X+49, Y+30 +Button B: X+16, Y+39 +Prize: X=4870, Y=1706 + +Button A: X+99, Y+15 +Button B: X+68, Y+64 +Prize: X=6419, Y=4087 + +Button A: X+58, Y+33 +Button B: X+15, Y+31 +Prize: X=8796, Y=12658 + +Button A: X+31, Y+11 +Button B: X+11, Y+42 +Prize: X=3154, Y=3600 + +Button A: X+29, Y+75 +Button B: X+57, Y+27 +Prize: X=5986, Y=6450 + +Button A: X+14, Y+78 +Button B: X+82, Y+13 +Prize: X=4116, Y=1183 + +Button A: X+66, Y+27 +Button B: X+27, Y+69 +Prize: X=19682, Y=16529 + +Button A: X+53, Y+21 +Button B: X+35, Y+73 +Prize: X=8143, Y=1011 + +Button A: X+32, Y+75 +Button B: X+63, Y+17 +Prize: X=7327, Y=6707 + +Button A: X+14, Y+30 +Button B: X+48, Y+24 +Prize: X=5018, Y=8378 + +Button A: X+18, Y+43 +Button B: X+51, Y+20 +Prize: X=434, Y=12521 + +Button A: X+99, Y+34 +Button B: X+18, Y+27 +Prize: X=1998, Y=936 + +Button A: X+68, Y+93 +Button B: X+83, Y+30 +Prize: X=1759, Y=1320 + +Button A: X+28, Y+94 +Button B: X+62, Y+26 +Prize: X=1226, Y=1748 + +Button A: X+91, Y+97 +Button B: X+62, Y+15 +Prize: X=5863, Y=3593 + +Button A: X+23, Y+98 +Button B: X+51, Y+53 +Prize: X=5031, Y=8785 + +Button A: X+21, Y+58 +Button B: X+33, Y+17 +Prize: X=12344, Y=6367 + +Button A: X+34, Y+45 +Button B: X+92, Y+32 +Prize: X=11180, Y=6808 + +Button A: X+35, Y+61 +Button B: X+33, Y+19 +Prize: X=15940, Y=2128 + +Button A: X+38, Y+84 +Button B: X+96, Y+64 +Prize: X=5812, Y=4696 + +Button A: X+12, Y+25 +Button B: X+65, Y+42 +Prize: X=2461, Y=8045 + +Button A: X+12, Y+40 +Button B: X+88, Y+14 +Prize: X=3308, Y=2926 + +Button A: X+12, Y+54 +Button B: X+51, Y+23 +Prize: X=14201, Y=8713 + +Button A: X+65, Y+18 +Button B: X+68, Y+78 +Prize: X=7951, Y=6462 + +Button A: X+24, Y+70 +Button B: X+44, Y+20 +Prize: X=1548, Y=2890 + +Button A: X+48, Y+16 +Button B: X+18, Y+44 +Prize: X=2616, Y=1936 + +Button A: X+15, Y+59 +Button B: X+35, Y+16 +Prize: X=19690, Y=12959 + +Button A: X+69, Y+35 +Button B: X+30, Y+60 +Prize: X=7314, Y=6800 + +Button A: X+21, Y+47 +Button B: X+42, Y+20 +Prize: X=1323, Y=2369 + +Button A: X+73, Y+22 +Button B: X+18, Y+75 +Prize: X=5427, Y=4836 + +Button A: X+28, Y+47 +Button B: X+54, Y+26 +Prize: X=10854, Y=13281 + +Button A: X+58, Y+26 +Button B: X+34, Y+56 +Prize: X=2032, Y=1400 + +Button A: X+61, Y+25 +Button B: X+16, Y+63 +Prize: X=10391, Y=11345 + +Button A: X+16, Y+60 +Button B: X+59, Y+12 +Prize: X=2329, Y=3084 + +Button A: X+55, Y+95 +Button B: X+89, Y+40 +Prize: X=11067, Y=10245 + +Button A: X+97, Y+78 +Button B: X+12, Y+71 +Prize: X=4529, Y=6464 + +Button A: X+55, Y+30 +Button B: X+24, Y+42 +Prize: X=3198, Y=2814 + +Button A: X+35, Y+16 +Button B: X+32, Y+59 +Prize: X=15670, Y=4203 + +Button A: X+11, Y+70 +Button B: X+28, Y+23 +Prize: X=1317, Y=5898 + +Button A: X+22, Y+70 +Button B: X+57, Y+16 +Prize: X=9258, Y=6964 + +Button A: X+83, Y+24 +Button B: X+11, Y+50 +Prize: X=4268, Y=6110 + +Button A: X+70, Y+31 +Button B: X+19, Y+44 +Prize: X=6967, Y=3548 + +Button A: X+35, Y+19 +Button B: X+18, Y+40 +Prize: X=9813, Y=3563 + +Button A: X+74, Y+27 +Button B: X+11, Y+41 +Prize: X=13301, Y=7703 + +Button A: X+39, Y+63 +Button B: X+94, Y+48 +Prize: X=2328, Y=2826 + +Button A: X+80, Y+41 +Button B: X+37, Y+58 +Prize: X=5670, Y=4077 + +Button A: X+18, Y+61 +Button B: X+43, Y+20 +Prize: X=8795, Y=2378 + +Button A: X+66, Y+15 +Button B: X+30, Y+77 +Prize: X=3692, Y=10594 + +Button A: X+95, Y+32 +Button B: X+29, Y+97 +Prize: X=7282, Y=6640 + +Button A: X+59, Y+16 +Button B: X+20, Y+78 +Prize: X=13817, Y=10588 + +Button A: X+13, Y+37 +Button B: X+68, Y+34 +Prize: X=13597, Y=13005 + +Button A: X+52, Y+69 +Button B: X+31, Y+11 +Prize: X=13920, Y=5428 + +Button A: X+69, Y+24 +Button B: X+21, Y+95 +Prize: X=6510, Y=3229 + +Button A: X+78, Y+11 +Button B: X+25, Y+29 +Prize: X=4786, Y=2611 + +Button A: X+61, Y+31 +Button B: X+11, Y+24 +Prize: X=6224, Y=17190 + +Button A: X+83, Y+45 +Button B: X+11, Y+45 +Prize: X=1841, Y=12815 + +Button A: X+15, Y+60 +Button B: X+70, Y+26 +Prize: X=4740, Y=2196 + +Button A: X+43, Y+56 +Button B: X+12, Y+97 +Prize: X=612, Y=1448 + +Button A: X+61, Y+24 +Button B: X+17, Y+45 +Prize: X=16094, Y=7139 + +Button A: X+18, Y+97 +Button B: X+86, Y+99 +Prize: X=6182, Y=11083 + +Button A: X+72, Y+43 +Button B: X+24, Y+51 +Prize: X=13880, Y=13295 + +Button A: X+11, Y+26 +Button B: X+39, Y+11 +Prize: X=13186, Y=8851 + +Button A: X+54, Y+23 +Button B: X+30, Y+86 +Prize: X=3120, Y=8285 + +Button A: X+57, Y+12 +Button B: X+23, Y+72 +Prize: X=4104, Y=8240 + +Button A: X+26, Y+57 +Button B: X+69, Y+34 +Prize: X=2787, Y=1771 + +Button A: X+14, Y+46 +Button B: X+65, Y+15 +Prize: X=9516, Y=14004 + +Button A: X+60, Y+34 +Button B: X+12, Y+34 +Prize: X=2324, Y=5446 + +Button A: X+61, Y+14 +Button B: X+87, Y+95 +Prize: X=7400, Y=5450 + +Button A: X+21, Y+81 +Button B: X+87, Y+77 +Prize: X=2283, Y=7513 + +Button A: X+26, Y+19 +Button B: X+14, Y+74 +Prize: X=2304, Y=6020 + +Button A: X+35, Y+95 +Button B: X+85, Y+28 +Prize: X=6855, Y=8268 + +Button A: X+80, Y+21 +Button B: X+15, Y+65 +Prize: X=4410, Y=4455 + +Button A: X+63, Y+35 +Button B: X+11, Y+49 +Prize: X=18924, Y=298 + +Button A: X+33, Y+59 +Button B: X+32, Y+13 +Prize: X=1592, Y=12836 + +Button A: X+49, Y+12 +Button B: X+21, Y+65 +Prize: X=8831, Y=10539 + +Button A: X+48, Y+66 +Button B: X+52, Y+15 +Prize: X=5732, Y=3531 + +Button A: X+41, Y+11 +Button B: X+13, Y+59 +Prize: X=9307, Y=17229 + +Button A: X+14, Y+68 +Button B: X+78, Y+28 +Prize: X=17738, Y=1668 + +Button A: X+49, Y+24 +Button B: X+31, Y+53 +Prize: X=10437, Y=11055 + +Button A: X+36, Y+84 +Button B: X+35, Y+13 +Prize: X=5863, Y=8393 + +Button A: X+12, Y+88 +Button B: X+83, Y+17 +Prize: X=9010, Y=8090 + +Button A: X+13, Y+56 +Button B: X+26, Y+26 +Prize: X=2002, Y=3894 + +Button A: X+65, Y+32 +Button B: X+32, Y+57 +Prize: X=1261, Y=1157 + +Button A: X+30, Y+64 +Button B: X+50, Y+17 +Prize: X=12250, Y=9241 + +Button A: X+66, Y+16 +Button B: X+18, Y+65 +Prize: X=5264, Y=9075 + +Button A: X+21, Y+35 +Button B: X+35, Y+17 +Prize: X=2349, Y=12167 + +Button A: X+60, Y+13 +Button B: X+26, Y+81 +Prize: X=12004, Y=15967 + +Button A: X+69, Y+11 +Button B: X+20, Y+72 +Prize: X=9957, Y=11299 + +Button A: X+85, Y+36 +Button B: X+54, Y+95 +Prize: X=6123, Y=6344 + +Button A: X+68, Y+18 +Button B: X+24, Y+83 +Prize: X=2252, Y=2359 + +Button A: X+26, Y+82 +Button B: X+89, Y+55 +Prize: X=3463, Y=7085 + +Button A: X+47, Y+18 +Button B: X+14, Y+25 +Prize: X=17934, Y=10126 + +Button A: X+11, Y+35 +Button B: X+48, Y+22 +Prize: X=13363, Y=15897 + +Button A: X+15, Y+48 +Button B: X+53, Y+41 +Prize: X=1982, Y=1970 + +Button A: X+44, Y+95 +Button B: X+87, Y+42 +Prize: X=6296, Y=7760 + +Button A: X+48, Y+78 +Button B: X+36, Y+12 +Prize: X=2960, Y=11996 + +Button A: X+61, Y+25 +Button B: X+20, Y+59 +Prize: X=3205, Y=7852 + +Button A: X+70, Y+14 +Button B: X+40, Y+63 +Prize: X=5280, Y=5621 + +Button A: X+36, Y+89 +Button B: X+78, Y+14 +Prize: X=7998, Y=3499 + +Button A: X+44, Y+13 +Button B: X+36, Y+62 +Prize: X=12436, Y=18317 + +Button A: X+94, Y+32 +Button B: X+38, Y+84 +Prize: X=7058, Y=7164 + +Button A: X+11, Y+51 +Button B: X+76, Y+29 +Prize: X=1478, Y=4057 + +Button A: X+12, Y+86 +Button B: X+27, Y+18 +Prize: X=2028, Y=6110 + +Button A: X+46, Y+76 +Button B: X+78, Y+25 +Prize: X=5320, Y=5258 + +Button A: X+11, Y+49 +Button B: X+83, Y+46 +Prize: X=14490, Y=697 + +Button A: X+43, Y+12 +Button B: X+15, Y+31 +Prize: X=3726, Y=5789 + +Button A: X+19, Y+73 +Button B: X+74, Y+11 +Prize: X=4904, Y=14462 + +Button A: X+42, Y+79 +Button B: X+49, Y+15 +Prize: X=6437, Y=10779 + +Button A: X+48, Y+73 +Button B: X+68, Y+11 +Prize: X=5900, Y=4999 + +Button A: X+39, Y+33 +Button B: X+21, Y+75 +Prize: X=1467, Y=2901 + +Button A: X+14, Y+47 +Button B: X+74, Y+22 +Prize: X=8702, Y=7531 + +Button A: X+69, Y+33 +Button B: X+17, Y+43 +Prize: X=12146, Y=18812 + +Button A: X+34, Y+57 +Button B: X+80, Y+44 +Prize: X=5908, Y=6390 + +Button A: X+15, Y+38 +Button B: X+64, Y+44 +Prize: X=5357, Y=17838 + +Button A: X+22, Y+51 +Button B: X+68, Y+43 +Prize: X=626, Y=878 + +Button A: X+80, Y+25 +Button B: X+69, Y+75 +Prize: X=4683, Y=3975 + +Button A: X+19, Y+94 +Button B: X+95, Y+33 +Prize: X=6574, Y=10674 + +Button A: X+81, Y+59 +Button B: X+34, Y+90 +Prize: X=4542, Y=4874 + +Button A: X+86, Y+29 +Button B: X+11, Y+92 +Prize: X=8108, Y=11210 + +Button A: X+41, Y+24 +Button B: X+19, Y+40 +Prize: X=13789, Y=19736 + +Button A: X+57, Y+28 +Button B: X+15, Y+41 +Prize: X=6077, Y=6618 + +Button A: X+28, Y+21 +Button B: X+23, Y+74 +Prize: X=2806, Y=5850 + +Button A: X+55, Y+24 +Button B: X+16, Y+35 +Prize: X=14348, Y=15869 + +Button A: X+70, Y+42 +Button B: X+42, Y+85 +Prize: X=6426, Y=6726 + +Button A: X+77, Y+93 +Button B: X+74, Y+17 +Prize: X=5480, Y=3217 + +Button A: X+74, Y+74 +Button B: X+25, Y+97 +Prize: X=6236, Y=10556 + +Button A: X+69, Y+35 +Button B: X+13, Y+33 +Prize: X=10810, Y=12644 + +Button A: X+36, Y+17 +Button B: X+19, Y+28 +Prize: X=4740, Y=11415 + +Button A: X+30, Y+72 +Button B: X+63, Y+15 +Prize: X=14639, Y=16241 + +Button A: X+15, Y+60 +Button B: X+53, Y+25 +Prize: X=4397, Y=2815 + +Button A: X+16, Y+69 +Button B: X+54, Y+13 +Prize: X=12510, Y=11763 + +Button A: X+41, Y+27 +Button B: X+13, Y+31 +Prize: X=7962, Y=11134 + +Button A: X+11, Y+46 +Button B: X+38, Y+22 +Prize: X=1778, Y=4834 + +Button A: X+40, Y+85 +Button B: X+27, Y+18 +Prize: X=3222, Y=4248 + +Button A: X+51, Y+17 +Button B: X+37, Y+77 +Prize: X=14542, Y=17706 + +Button A: X+71, Y+11 +Button B: X+41, Y+95 +Prize: X=6029, Y=5987 + +Button A: X+24, Y+14 +Button B: X+23, Y+42 +Prize: X=1959, Y=1400 + +Button A: X+51, Y+21 +Button B: X+14, Y+80 +Prize: X=3361, Y=8659 + +Button A: X+70, Y+33 +Button B: X+16, Y+64 +Prize: X=6666, Y=5175 + +Button A: X+17, Y+43 +Button B: X+84, Y+14 +Prize: X=1396, Y=554 + +Button A: X+76, Y+35 +Button B: X+22, Y+88 +Prize: X=9428, Y=11350 + +Button A: X+54, Y+13 +Button B: X+14, Y+62 +Prize: X=6876, Y=18546 + +Button A: X+55, Y+29 +Button B: X+24, Y+40 +Prize: X=6663, Y=6029 + +Button A: X+55, Y+49 +Button B: X+11, Y+52 +Prize: X=2167, Y=5813 + +Button A: X+27, Y+13 +Button B: X+26, Y+42 +Prize: X=16846, Y=4546 + +Button A: X+60, Y+16 +Button B: X+32, Y+75 +Prize: X=2660, Y=5362 + +Button A: X+36, Y+69 +Button B: X+64, Y+39 +Prize: X=4668, Y=4680 + +Button A: X+38, Y+12 +Button B: X+28, Y+56 +Prize: X=2180, Y=1160 + +Button A: X+31, Y+21 +Button B: X+30, Y+65 +Prize: X=4857, Y=6507 + +Button A: X+38, Y+56 +Button B: X+38, Y+15 +Prize: X=13686, Y=14581 + +Button A: X+25, Y+57 +Button B: X+40, Y+17 +Prize: X=11305, Y=8893 + +Button A: X+13, Y+45 +Button B: X+52, Y+46 +Prize: X=5395, Y=5811 diff --git a/day-13/main.c b/day-13/main.c new file mode 100644 index 0000000..59514ff --- /dev/null +++ b/day-13/main.c @@ -0,0 +1,94 @@ +#include "aoc.h" +#include +#include + +typedef struct Vec2i { + i64 x; + i64 y; +} Vec2i; + +static Vec2i +parse_numbers(str line, Arena *arena) { + bool x_set = false; + Vec2i result = {0}; + for (isize i = 0; i < line.len; i++) { + if (isdigit(line.data[i])) { + isize end = i + 1; + while (end < line.len && isdigit(line.data[end])) { + end++; + } + str num_str = str_sub(line, i, end); + if (!x_set) { + result.x = (i32) parse_i64(num_str, *arena); + x_set = true; + } + else { + result.y = (i32) parse_i64(num_str, *arena); + return result; + } + i = end; + } + } + NOT_REACHABLE(); +} + +static bool +solve(Vec2i a, Vec2i b, Vec2i p, Vec2i *solution) { + i64 det = a.x * b.y - a.y * b.x; + ASSERT(det != 0); + + i64 numerator_a = p.x * b.y - p.y * b.x; + i64 numerator_b = p.y * a.x - p.x * a.y; + bool solved = false; + if ((numerator_a % det == 0) && (numerator_b % det == 0)) { + i64 n_a = numerator_a / det; + i64 n_b = numerator_b / det; + if (n_a >= 0 && n_b >= 0) { + solution->x = n_a; + solution->y = n_b; + solved = true; + } + } + else { + // no integer solution + } + return solved; +} + +int main(int argc, char **argv) { + Arena *arena = make_arena(Megabytes(1)); + str input = read_file(arena, argv[1]); + + str line; + i64 part_1 = 0; + i64 part_2 = 0; + while (input.len > 0) { + str a_line = str_next_token(&input, STR("\n")); + str b_line = str_next_token(&input, STR("\n")); + str prize_line = str_next_token(&input, STR("\n")); + str empty_line = str_next_token(&input, STR("\n")); + ASSERT(str_trim(empty_line).len == 0); + + Vec2i a = parse_numbers(a_line, arena); + Vec2i b = parse_numbers(b_line, arena); + Vec2i p = parse_numbers(prize_line, arena); + Vec2i p_ = { p.x + 10000000000000ull, p.y + 10000000000000ull }; + +#if 0 + printf("a: %ld %ld\n", a.x, a.y); + printf("b: %ld %ld\n", b.x, b.y); + printf("p: %ld %ld\n", p.x, p.y); + printf("\n"); +#endif + Vec2i n; + if (solve(a, b, p, &n)) { + part_1 += n.x * 3 + n.y; + } + + if (solve(a, b, p_, &n)) { + part_2 += n.x * 3 + n.y; + } + } + printf("%ld\n", part_1); + printf("%ld\n", part_2); +} diff --git a/day-13/test.txt b/day-13/test.txt new file mode 100644 index 0000000..444a287 --- /dev/null +++ b/day-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 \ No newline at end of file