import Foundation

let input = loadData(day: 13)


let scanner = Scanner(string: input)

let startTime = scanner.scanInt()!

var busLines: [(Int, position: Int)] = []

var position = 0
repeat {
    if let line = scanner.scanInt() {
        busLines.append((line, position))
    } else if scanner.string("x") {
        // Ignore
    }
    position += 1
} while scanner.string(",")

let min = busLines
    .map { $0.0 }
    .map { ((startTime / $0) * $0 + $0, $0) }
    .print()
    .min(by: { $0.0 < $1.0 })!


print((min.0 - startTime) * min.1)

let max = busLines.max(by: { $0.0 < $1.0 })!
print(max)

/*
 brute force - takes too long

var s = sequence(first: 0, next: { $0 + max.0 })
    .lazy
    .filter { t in busLines.allSatisfy { (t - max.position + $0.position).isMultiple(of: $0.0 )} }
    .makeIterator()

print(s.next())

*/

var step = 0
var time = 0

outer: while true {
    time += step

    step = 1
    for (bus, position) in busLines {
        guard (time + position).isMultiple(of: bus) else { continue outer }
        step *= bus
    }

    break
}

print("part2", time)