package main
import (
"bufio"
"fmt"
"math"
"os"
"strconv"
"strings"
)
// Bus ...
type Bus int
// NextDeparture ...
func (b Bus) NextDeparture(now int) int {
return int(now) - (now % int(b)) + int(b)
}
// Task1 ...
func Task1(now int, input []Bus) int {
soonestDeparture := math.MaxInt32
var soonestBusID int
for _, bus := range input {
if bus == -1 {
continue
}
next := bus.NextDeparture(now)
if next < soonestDeparture {
soonestDeparture = next
soonestBusID = int(bus)
}
}
return (soonestDeparture - now) * soonestBusID
}
// Task2 ...
func Task2(input []Bus) int {
timestamp := 1
increment := 1
for i, bus := range input {
if bus == -1 {
continue
}
for {
if (timestamp+i)%int(bus) == 0 {
increment *= int(bus)
break
}
timestamp += increment
}
}
return timestamp
}
func main() {
file, _ := os.Open("input.txt")
scanner := bufio.NewScanner(file)
input := make([]Bus, 0, 100)
scanner.Scan()
now, _ := strconv.Atoi(scanner.Text())
scanner.Scan()
buses := strings.Split(scanner.Text(), ",")
for _, bus := range buses {
var val int
if bus == "x" {
val = -1
} else {
val, _ = strconv.Atoi(bus)
}
input = append(input, Bus(val))
}
file.Close()
result := Task1(now, input)
fmt.Printf("Task 1: %d\n", result)
result = Task2(input)
fmt.Printf("Task 2: %d\n", result)
}