import Foundation struct Plot : Hashable, CustomStringConvertible { let x: Int let y: Int var description: String { return "Plot(\(x), \(y))" } } struct Map : CustomStringConvertible { let map: [[Character]] let (w, h): (Int, Int) var visited: [[Bool]] var description: String { var ret: String = "\(w)x\(h):\n" for i in 0.. (Int, [Plot]) { let (x, y) = (plot.x, plot.y) visited[x][y] = true let all_nbs = [(x-1, y), (x+1, y), (x, y-1), (x, y+1)] let peri = all_nbs.filter { i, j in i < 0 || j < 0 || i >= h || j >= w || map[i][j] != map[x][y] }.count let nbs = all_nbs.filter { i, j in i >= 0 && j >= 0 && i < h && j < w && map[i][j] == map[x][y] && !visited[i][j] }.map { i, j in Plot(x: i, y: j) } return (peri, nbs) } mutating func visitAll(from plot: Plot) -> Int { var q: Set = [plot] var region: Set = [] var peri = 0 var area = 0 while !q.isEmpty { let currentPlot = q.removeFirst() let (newPeri, newNBs) = visit(currentPlot) region.insert(currentPlot) peri += newPeri area += 1 q.formUnion(newNBs) } for i in -1.. Map { let content = try String(contentsOfFile: filePath, encoding: .ascii) return Map(content.split(separator: "\n").map(Array.init)) } var map = try readInput(CommandLine.arguments[1]) print(map) var answer = 0 for i in 0..