// // File.swift // // // Created by Max Nuding on 05.12.21. // import Foundation import Runner import Collections struct Coord { let row: Int let col: Int func getLeft() -> Coord? { guard col > 0 else { return nil } return Coord(row: row, col: col - 1) } func getRight() -> Coord { Coord(row: row, col: col + 1) } func getAbove() -> Coord? { guard row > 0 else { return nil } return Coord(row: row - 1, col: col) } func getBelow() -> Coord { Coord(row: row + 1, col: col) } } struct Field { let numbers: [[Int]] let numCols: Int let numRows: Int init(numbers: [[Int]]) { self.numbers = numbers numCols = numbers.first!.count numRows = numbers.count } func getNeighborsCoordsFor(coord: Coord) -> [Coord] { return [coord.getAbove(), coord.getRight(), coord.getBelow(), coord.getLeft()] .compactMap { $0 } .filter { $0.row < numRows && $0.col < numCols } } func lowPointValueAt(coord: Coord) -> Int? { let value = numbers[coord.row][coord.col] return getNeighborsCoordsFor(coord: coord) .map { numbers[$0.row][$0.col] } .allSatisfy { $0 > value } ? value : nil } } struct Day09: Runnable { let inputPath: String func run() { let input = try! String(contentsOfFile: inputPath) let entries = input .trimmingCharacters(in: .newlines) .components(separatedBy: .newlines) .map { line in line.map { $0.wholeNumberValue! } } let field = Field(numbers: entries) var sum = 0 for row in 0..