solve part 2, thanks nytpu
This commit is contained in:
parent
e94f26233d
commit
4d18082447
|
@ -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
|
||||
}
|
Loading…
Reference in New Issue