added day 13
authorBrendan Hansen <brendan.f.hansen@gmail.com>
Sun, 13 Dec 2020 15:27:12 +0000 (09:27 -0600)
committerBrendan Hansen <brendan.f.hansen@gmail.com>
Sun, 13 Dec 2020 15:27:12 +0000 (09:27 -0600)
day13.onyx [new file with mode: 0644]
input/day13.txt [new file with mode: 0644]

diff --git a/day13.onyx b/day13.onyx
new file mode 100644 (file)
index 0000000..5d0a181
--- /dev/null
@@ -0,0 +1,95 @@
+#include_file "core/std/wasi"
+
+use package core
+use package core.string.reader as reader
+
+inv_mod :: proc (a_: i64, m_: i64) -> i64 {
+    if m_ <= 1 do return 0;
+
+    a := a_; m := m_;
+    x: i64 = 0; y: i64 = 1;
+
+    while a > 1 {
+        quot  := a / m;
+        temp1 := m;
+        m      = a % m;
+        a      = temp1;
+        temp2 := x;
+        x      = y - quot * x;
+        y      = temp2;
+    }
+
+    if y < 0 do y += m_;
+    return y;
+}
+
+chinese_remainder_theorem :: proc (mods: [..] i64, rems: [..] i64) -> i64 {
+    N: i64 = 1;
+    for n: mods do N *= n;
+    
+    res: i64 = 0;
+    for i: 0 .. mods.count {
+        n := N / mods[i];
+        res += rems[i] * inv_mod(n, mods[i]) * n;
+    }
+
+    return res % N;
+}
+
+main :: proc (args: [] cstr) {
+    contents := file.get_contents("input/day13.txt");
+    defer cfree(contents.data);
+
+    file := reader.make(contents);
+
+    est := reader.read_u32(^file);
+    reader.advance_line(^file);
+
+    buses: [..] i64;
+    array.init(^buses);
+    defer array.free(^buses);
+
+    rems: [..] i64;
+    array.init(^rems);
+    defer array.free(^rems);
+
+    offset: i64 = 0;
+    while !reader.empty(^file) {
+        if *file.data == #char "x" {
+            reader.skip_bytes(^file, 2);
+        } else {
+            bus := reader.read_u64(^file);
+            array.push(^buses, ~~bus);
+            array.push(^rems, bus - offset);
+
+            reader.skip_bytes(^file, 1);
+        }
+
+        offset += 1;
+    }
+
+    // Part 1
+    // min := array.fold(^buses, 0xffffffff, math.min);
+
+    // take_bus := 0;
+    // depart   := 0;
+
+    // for i: 0 .. min {
+    //     for bus: buses {
+    //         if (i + est) % bus == 0 {
+    //             take_bus = bus;
+    //             depart = i + est;
+    //             break break;
+    //         }
+    //     }
+    // }
+
+    // result := take_bus * (depart - est);
+    // printf("Bus: %i\n", take_bus);
+    // printf("Depart at: %i\n", depart);
+    // printf("Result: %i\n", result);
+
+    // Part 2
+    result := chinese_remainder_theorem(buses, rems); 
+    printf("Result: %l\n", result);
+}
diff --git a/input/day13.txt b/input/day13.txt
new file mode 100644 (file)
index 0000000..266f220
--- /dev/null
@@ -0,0 +1,2 @@
+1006697
+13,x,x,41,x,x,x,x,x,x,x,x,x,641,x,x,x,x,x,x,x,x,x,x,x,19,x,x,x,x,17,x,x,x,x,x,x,x,x,x,x,x,29,x,661,x,x,x,x,x,37,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,23