From 0bf6ef82a7ca36e2c2b048b3155382b4e9bc9b1c Mon Sep 17 00:00:00 2001 From: Dory Date: Sat, 14 Dec 2024 14:39:07 -0800 Subject: [PATCH] d12 --- day12/d12p1.swift | 78 ++++++++++++++++++++++++++ day12/d12p2.swift | 93 ++++++++++++++++++++++++++++++ day12/input.txt | 140 ++++++++++++++++++++++++++++++++++++++++++++++ day12/test.txt | 10 ++++ day12/test0.txt | 4 ++ day12/test1.txt | 5 ++ day12/test2.txt | 6 ++ 7 files changed, 336 insertions(+) create mode 100644 day12/d12p1.swift create mode 100644 day12/d12p2.swift create mode 100644 day12/input.txt create mode 100644 day12/test.txt create mode 100644 day12/test0.txt create mode 100644 day12/test1.txt create mode 100644 day12/test2.txt 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..