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) }