part one works, part two... eh.
This commit is contained in:
parent
6ed45d319b
commit
559d91b9a6
89
13/main.go
Normal file
89
13/main.go
Normal file
@ -0,0 +1,89 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"bufio"
|
||||
"fmt"
|
||||
"math"
|
||||
"os"
|
||||
"strconv"
|
||||
"strings"
|
||||
"time"
|
||||
)
|
||||
|
||||
func main() {
|
||||
start := time.Now()
|
||||
partOne()
|
||||
duration := time.Since(start)
|
||||
partTwo()
|
||||
duration2 := time.Since(start)
|
||||
fmt.Printf("p1: %s, p2: %s\n", duration, duration2-duration)
|
||||
}
|
||||
|
||||
func partOne() {
|
||||
f, _ := os.Open("input")
|
||||
reader := bufio.NewReader(f)
|
||||
scanner := bufio.NewScanner(reader)
|
||||
|
||||
busWaitTimes := map[int]int{}
|
||||
shortestWait := -1
|
||||
|
||||
// don't actually need loop logic for a two-line input
|
||||
scanner.Scan()
|
||||
ts := scanner.Text()
|
||||
currentTimestamp, _ := strconv.Atoi(ts)
|
||||
|
||||
scanner.Scan()
|
||||
buses := strings.Split(scanner.Text(), ",")
|
||||
for _, b := range buses {
|
||||
if b != "x" {
|
||||
j, _ := strconv.Atoi(b)
|
||||
busWaitTimes[j] = (((currentTimestamp / j) + 1) * j) - currentTimestamp
|
||||
if shortestWait == -1 || busWaitTimes[shortestWait] > busWaitTimes[j] {
|
||||
shortestWait = j
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fmt.Println(busWaitTimes[shortestWait] * shortestWait)
|
||||
}
|
||||
|
||||
type bus struct {
|
||||
route float64
|
||||
offset float64
|
||||
}
|
||||
|
||||
func partTwo() {
|
||||
f, _ := os.Open("input")
|
||||
reader := bufio.NewReader(f)
|
||||
scanner := bufio.NewScanner(reader)
|
||||
|
||||
buses := []bus{}
|
||||
|
||||
scanner.Scan() // discard first line
|
||||
scanner.Scan()
|
||||
line := strings.Split(scanner.Text(), ",")
|
||||
for i, b := range line {
|
||||
if b != "x" {
|
||||
j, _ := strconv.Atoi(b)
|
||||
buses = append(buses, bus{
|
||||
route: float64(j),
|
||||
offset: float64(i),
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
// walking the list works fine for the small test inputs but takes far too long on the real schedule
|
||||
t := float64(0)
|
||||
for {
|
||||
loop:
|
||||
t = t + buses[0].route
|
||||
for i := range buses {
|
||||
if math.Remainder(t+buses[i].offset, buses[i].route) != 0 {
|
||||
goto loop
|
||||
}
|
||||
}
|
||||
break
|
||||
}
|
||||
|
||||
fmt.Println(int(t))
|
||||
}
|
Loading…
Reference in New Issue
Block a user