d08
This commit is contained in:
42
day08/d08p1.swift
Normal file
42
day08/d08p1.swift
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
import Foundation
|
||||||
|
|
||||||
|
struct Point : Hashable {
|
||||||
|
let x: Int
|
||||||
|
let y: Int
|
||||||
|
}
|
||||||
|
|
||||||
|
func readInput(_ filePath: String) throws -> (Int, Int, [Character: [Point]]) {
|
||||||
|
let content = try String(contentsOfFile: filePath, encoding: .ascii)
|
||||||
|
let lines = content.split(separator: "\n").map(Array.init)
|
||||||
|
let antennas = lines.enumerated().flatMap { i, line in
|
||||||
|
line.enumerated().compactMap { j, cell in
|
||||||
|
cell == "." ? nil : (cell, i, j)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
var map: [Character: [Point]] = [:]
|
||||||
|
for (type, i, j) in antennas {
|
||||||
|
let current = map[type, default: []]
|
||||||
|
map[type] = current + [Point(x: i, y: j)]
|
||||||
|
}
|
||||||
|
return (lines.count, lines[0].count, map)
|
||||||
|
}
|
||||||
|
|
||||||
|
func nodes(_ antennas: [Point]) -> Set<Point> {
|
||||||
|
var nodes: Set<Point> = []
|
||||||
|
for i in 0..<antennas.count {
|
||||||
|
for j in i+1..<antennas.count {
|
||||||
|
let (a, b) = (antennas[i], antennas[j])
|
||||||
|
nodes.insert(Point(x: 2*a.x - b.x, y: 2*a.y - b.y))
|
||||||
|
nodes.insert(Point(x: 2*b.x - a.x, y: 2*b.y - a.y))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nodes
|
||||||
|
}
|
||||||
|
|
||||||
|
let (height, width, antennas) = try readInput(CommandLine.arguments[1])
|
||||||
|
let answer = antennas
|
||||||
|
.map { c, points in nodes(points) }
|
||||||
|
.reduce(Set([]), { acc, x in acc.union(x) })
|
||||||
|
.filter { p in p.x >= 0 && p.y >= 0 && p.x < height && p.y < width }
|
||||||
|
.count
|
||||||
|
print(answer)
|
55
day08/d08p2.swift
Normal file
55
day08/d08p2.swift
Normal file
@@ -0,0 +1,55 @@
|
|||||||
|
import Foundation
|
||||||
|
|
||||||
|
struct Point : Hashable {
|
||||||
|
let x: Int
|
||||||
|
let y: Int
|
||||||
|
}
|
||||||
|
|
||||||
|
func readInput(_ filePath: String) throws -> (Int, Int, [Character: [Point]]) {
|
||||||
|
let content = try String(contentsOfFile: filePath, encoding: .ascii)
|
||||||
|
let lines = content.split(separator: "\n").map(Array.init)
|
||||||
|
let antennas = lines.enumerated().flatMap { i, line in
|
||||||
|
line.enumerated().compactMap { j, cell in
|
||||||
|
cell == "." ? nil : (cell, i, j)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
var map: [Character: [Point]] = [:]
|
||||||
|
for (type, i, j) in antennas {
|
||||||
|
let current = map[type, default: []]
|
||||||
|
map[type] = current + [Point(x: i, y: j)]
|
||||||
|
}
|
||||||
|
return (lines.count, lines[0].count, map)
|
||||||
|
}
|
||||||
|
|
||||||
|
func nodes(_ antennas: [Point], h: Int, w: Int) -> Set<Point> {
|
||||||
|
var nodes: Set<Point> = []
|
||||||
|
for i in 0..<antennas.count {
|
||||||
|
for j in i+1..<antennas.count {
|
||||||
|
let (a, b) = (antennas[i], antennas[j])
|
||||||
|
// (k+1)a - kb going one way
|
||||||
|
var k = 0
|
||||||
|
var next = Point(x: (k+1)*a.x - k*b.x, y: (k+1)*a.y - k*b.y)
|
||||||
|
while next.x >= 0 && next.x < h && next.y >= 0 && next.y < w {
|
||||||
|
nodes.insert(next)
|
||||||
|
k += 1
|
||||||
|
next = Point(x: (k+1)*a.x - k*b.x, y: (k+1)*a.y - k*b.y)
|
||||||
|
}
|
||||||
|
// going the other way
|
||||||
|
k = -1
|
||||||
|
next = Point(x: (k+1)*a.x - k*b.x, y: (k+1)*a.y - k*b.y)
|
||||||
|
while next.x >= 0 && next.x < h && next.y >= 0 && next.y < w {
|
||||||
|
nodes.insert(next)
|
||||||
|
k -= 1
|
||||||
|
next = Point(x: (k+1)*a.x - k*b.x, y: (k+1)*a.y - k*b.y)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nodes
|
||||||
|
}
|
||||||
|
|
||||||
|
let (height, width, antennas) = try readInput(CommandLine.arguments[1])
|
||||||
|
let answer = antennas
|
||||||
|
.map { c, points in nodes(points, h: height, w: width) }
|
||||||
|
.reduce(Set([]), { acc, x in acc.union(x) })
|
||||||
|
.count
|
||||||
|
print(answer)
|
50
day08/input.txt
Normal file
50
day08/input.txt
Normal file
@@ -0,0 +1,50 @@
|
|||||||
|
...d............................J.................
|
||||||
|
......e.............................J.............
|
||||||
|
..........6............7..........................
|
||||||
|
........................P7........................
|
||||||
|
..................................................
|
||||||
|
.........6........................................
|
||||||
|
e..........................x.................E....
|
||||||
|
...G...A.......d...........................o......
|
||||||
|
.....A.e...........................J......8.......
|
||||||
|
................6....9.....J.............E.8......
|
||||||
|
..........d.9.........7..K....E...................
|
||||||
|
...e.....U....9................x..K...............
|
||||||
|
......A......O...........P................o.......
|
||||||
|
......................x..................M..E.....
|
||||||
|
........................x........p................
|
||||||
|
........A..................O......................
|
||||||
|
.......r.f....O.......P9..G.........m.............
|
||||||
|
u...df..r...............7.........................
|
||||||
|
.....g.............nXu......N.........K...........
|
||||||
|
..............l..........0..............p.........
|
||||||
|
.......lu...................p......o..............
|
||||||
|
....g..........l........0p..G.....F...............
|
||||||
|
.....................................8......F.....
|
||||||
|
...................................C..............
|
||||||
|
....3................G0......................M....
|
||||||
|
2...f....g..........3........P......O......F......
|
||||||
|
g......3.....0....H......................F..M.....
|
||||||
|
.............c................m...h.....M.........
|
||||||
|
...........2....l.................................
|
||||||
|
..U...c......2...........................K........
|
||||||
|
.D....................r.....f.....................
|
||||||
|
....................N.............................
|
||||||
|
.U..............h.................................
|
||||||
|
...a.............u..............C.................
|
||||||
|
c...Uj....a..6...H...................R............
|
||||||
|
...3....j................H...............m........
|
||||||
|
.......................5.......C..........4....m..
|
||||||
|
......................H.........R......N....X.....
|
||||||
|
.........h..2.................R................N..
|
||||||
|
.......................r...........q...n..........
|
||||||
|
.....c..............5.............................
|
||||||
|
..a..h....D.................................n.....
|
||||||
|
......qk..................D............1.....X....
|
||||||
|
.k..................................q.............
|
||||||
|
..k..........a.............L................1....4
|
||||||
|
......k..........RQ..5.L.j..1..................4..
|
||||||
|
..................................................
|
||||||
|
..............L.....................oX............
|
||||||
|
........Q.............L.........n.................
|
||||||
|
...........Q.D........5..........1............4...
|
12
day08/test.txt
Normal file
12
day08/test.txt
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
............
|
||||||
|
........0...
|
||||||
|
.....0......
|
||||||
|
.......0....
|
||||||
|
....0.......
|
||||||
|
......A.....
|
||||||
|
............
|
||||||
|
............
|
||||||
|
........A...
|
||||||
|
.........A..
|
||||||
|
............
|
||||||
|
............
|
Reference in New Issue
Block a user