adventofcode/day13/main.go

59 lines
1.2 KiB
Go

package main
import (
"fmt"
"io/ioutil"
"strings"
"strconv"
)
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 []Bus
for i, b := range busstrings {
if b != "x" {
n, _ := strconv.Atoi(b)
busses = append(busses, Bus{Num: n, Minute: i})
}
}
for index, b := range busses {
i := b.Num
for i < departure {
i += b.Num
}
busses[index].Arrival = i
}
earliestBus := Bus{}
for _, bus := range busses {
if earliestBus.Num == 0 { // If we have the first real bus
earliestBus = bus
} else if earliestBus.Arrival > bus.Arrival {
earliestBus = bus
}
}
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
}