From 4d18082447de888bc4914eab598ac993e5128f5e Mon Sep 17 00:00:00 2001 From: Nihilazo Date: Sun, 13 Dec 2020 18:32:33 +0000 Subject: [PATCH] solve part 2, thanks nytpu --- day13/main.go | 34 +++++++++++++++++++++++++--------- 1 file changed, 25 insertions(+), 9 deletions(-) diff --git a/day13/main.go b/day13/main.go index 7fd14dd..4dcd34c 100644 --- a/day13/main.go +++ b/day13/main.go @@ -10,29 +10,30 @@ import ( type Bus struct { Num int Arrival int + Minute int } + func main() { d, _ := ioutil.ReadFile("input") lines := strings.Split(string(d),"\n") departure, _ := strconv.Atoi(lines[0]) // Earliest departure time busstrings := strings.Split(lines[1],",") - var busses []int - for _, b := range busstrings { + var busses []Bus + for i, b := range busstrings { if b != "x" { n, _ := strconv.Atoi(b) - busses = append(busses, n) + busses = append(busses, Bus{Num: n, Minute: i}) } } - var bustimes []Bus - for _, b := range busses { - i := b + for index, b := range busses { + i := b.Num for i < departure { - i += b + i += b.Num } - bustimes = append(bustimes, Bus{Num: b, Arrival: i}) + busses[index].Arrival = i } earliestBus := Bus{} - for _, bus := range bustimes { + for _, bus := range busses { if earliestBus.Num == 0 { // If we have the first real bus earliestBus = bus } else if earliestBus.Arrival > bus.Arrival { @@ -40,4 +41,19 @@ func main() { } } fmt.Println("Part 1:", earliestBus.Num * (earliestBus.Arrival - departure)) + + fmt.Println("Part 2:", chineseRemainder(busses)) +} + +// translation of https://git.sr.ht/~nytpu/advent_of_code_2020/tree/master/day13/problem2.c +func chineseRemainder(b []Bus) int { + jmp := b[0].Num + ts := b[0].Num + for i := 1; i < len(b); i++ { + for (ts + b[i].Minute) % b[i].Num != 0 { + ts += jmp + } + jmp *= b[i].Num + } + return ts } \ No newline at end of file