diff --git a/day12/d12p1.swift b/day12/d12p1.swift new file mode 100644 index 0000000..2c9ba9c --- /dev/null +++ b/day12/d12p1.swift @@ -0,0 +1,78 @@ +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 peri = 0 + var area = 0 + while !q.isEmpty { + let currentPlot = q.removeFirst() + let (newPeri, newNBs) = visit(currentPlot) + peri += newPeri + area += 1 + q.formUnion(newNBs) + } + return peri * area + } +} + +func readInput(_ filePath: String) throws -> 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.. (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..