import Foundation let input = [16,1,0,18,12,14,19] var memory: [Int: (Int, Int?)] = [:] var last = -1 for (round, num) in input.enumerated() { memory[num] = (round, nil) last = num } func lastRound(for num: Int) -> Int? { guard let (first, second) = memory[num] else { return nil } if let second = second { return second } return first } for round in input.count..<30000000 { let (first, second) = memory[last]! if let second = second { last = second - first } else { last = 0 } if let prev = lastRound(for: last) { memory[last] = (prev, round) } else { memory[last] = (round, nil) } } print(last)