From: Brendan Hansen Date: Sun, 13 Dec 2020 15:27:12 +0000 (-0600) Subject: added day 13 X-Git-Url: https://git.brendanfh.com/?a=commitdiff_plain;h=1cff4d90ddcb91c6554e29c307ac88defca67a21;p=onyx-aoc-2020.git added day 13 --- diff --git a/day13.onyx b/day13.onyx new file mode 100644 index 0000000..5d0a181 --- /dev/null +++ b/day13.onyx @@ -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 index 0000000..266f220 --- /dev/null +++ b/input/day13.txt @@ -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