59 lines
1.2 KiB
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
|
|
} |