d06
This commit is contained in:
80
day06/d06p1.swift
Normal file
80
day06/d06p1.swift
Normal file
@@ -0,0 +1,80 @@
|
||||
import Foundation
|
||||
|
||||
enum Direction {
|
||||
case n, s, e, w
|
||||
mutating func turnRight() {
|
||||
switch self {
|
||||
case .n:
|
||||
self = .e
|
||||
case .s:
|
||||
self = .w
|
||||
case .e:
|
||||
self = .s
|
||||
case .w:
|
||||
self = .n
|
||||
}
|
||||
}
|
||||
func move(x: Int, y: Int) -> (Int, Int) {
|
||||
switch self {
|
||||
case .n:
|
||||
return (x-1, y)
|
||||
case .s:
|
||||
return (x+1, y)
|
||||
case .e:
|
||||
return (x, y+1)
|
||||
case .w:
|
||||
return (x, y-1)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
struct Map {
|
||||
var floor: [[Character]]
|
||||
var guardX: Int
|
||||
var guardY: Int
|
||||
var guardDir = Direction.n
|
||||
var done = false
|
||||
|
||||
func print() {
|
||||
for (i, row) in floor.enumerated() {
|
||||
Swift.print(String(row.enumerated().map {
|
||||
($0 == self.guardY && i == self.guardX) ? "G" : $1
|
||||
}))
|
||||
}
|
||||
}
|
||||
|
||||
func countSteps() -> Int {
|
||||
return floor
|
||||
.map { $0.map { $0 == "^" ? 1 : 0 }.reduce(0, +) }
|
||||
.reduce(0, +)
|
||||
}
|
||||
|
||||
mutating func step() {
|
||||
let (nextX, nextY) = guardDir.move(x: guardX, y: guardY)
|
||||
if nextX < 0 || nextX >= floor.count
|
||||
|| nextY < 0 || nextY >= floor[0].count {
|
||||
done = true
|
||||
} else if floor[nextX][nextY] == "#" {
|
||||
guardDir.turnRight()
|
||||
} else {
|
||||
floor[nextX][nextY] = "^"
|
||||
(guardX, guardY) = (nextX, nextY)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func readInput(_ filePath: String) throws -> Map {
|
||||
let content = try String(contentsOfFile: filePath, encoding: .ascii)
|
||||
let rows = content.split(separator: "\n").map(Array.init)
|
||||
let (guardX, guardY) = rows.map {
|
||||
$0.enumerated().compactMap { j, cell in cell == "^" ? j : nil }
|
||||
}.enumerated().compactMap { $1.count > 0 ? ($0, $1[0]) : nil }[0]
|
||||
return Map(floor: rows, guardX: guardX, guardY: guardY)
|
||||
}
|
||||
|
||||
var map = try readInput(CommandLine.arguments[1])
|
||||
while !map.done {
|
||||
map.step()
|
||||
}
|
||||
map.print()
|
||||
print(map.countSteps())
|
112
day06/d06p2.swift
Normal file
112
day06/d06p2.swift
Normal file
@@ -0,0 +1,112 @@
|
||||
import Foundation
|
||||
|
||||
enum Direction : Hashable {
|
||||
case n, s, e, w
|
||||
func turnRight() -> Direction {
|
||||
let map: [Direction: Direction] = [.n: .e, .s: .w, .e: .s, .w: .n]
|
||||
return map[self]!
|
||||
}
|
||||
func asChar() -> Character {
|
||||
let map: [Direction: Character] = [.n: "^", .s: "v", .e: ">", .w: "<"]
|
||||
return map[self] ?? "?"
|
||||
}
|
||||
}
|
||||
|
||||
struct GuardPos : Hashable {
|
||||
let x: Int
|
||||
let y: Int
|
||||
let dir: Direction
|
||||
func turnRight() -> GuardPos {
|
||||
return GuardPos(x: x, y: y, dir: dir.turnRight())
|
||||
}
|
||||
func move() -> GuardPos {
|
||||
switch dir {
|
||||
case Direction.n:
|
||||
return GuardPos(x: x-1, y: y, dir: dir)
|
||||
case Direction.s:
|
||||
return GuardPos(x: x+1, y: y, dir: dir)
|
||||
case Direction.e:
|
||||
return GuardPos(x: x, y: y+1, dir: dir)
|
||||
case Direction.w:
|
||||
return GuardPos(x: x, y: y-1, dir: dir)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
struct Map {
|
||||
var obst: [[Bool]]
|
||||
var patrol: GuardPos
|
||||
var visited: Set<GuardPos>
|
||||
var done = false
|
||||
var looped = false
|
||||
|
||||
func print() {
|
||||
for (i, row) in obst.enumerated() {
|
||||
Swift.print(String(row.enumerated().map { j, c in
|
||||
(i == patrol.x && j == patrol.y) ?
|
||||
patrol.dir.asChar() : (c ? "#" : ".")
|
||||
}))
|
||||
}
|
||||
}
|
||||
|
||||
mutating func step() {
|
||||
let next = patrol.move()
|
||||
if next.x < 0 || next.x >= obst.count
|
||||
|| next.y < 0 || next.y >= obst[0].count {
|
||||
done = true
|
||||
} else if obst[next.x][next.y] {
|
||||
patrol = patrol.turnRight()
|
||||
} else if visited.contains(next) {
|
||||
looped = true
|
||||
done = true
|
||||
} else {
|
||||
visited.insert(next)
|
||||
patrol = next
|
||||
}
|
||||
}
|
||||
|
||||
func addObst(x: Int, y: Int) -> Map? {
|
||||
if obst[x][y] {
|
||||
return nil
|
||||
}
|
||||
var newObst = obst
|
||||
newObst[x][y] = true
|
||||
return Map(
|
||||
obst: newObst, patrol: patrol,
|
||||
visited: visited, done: done, looped: looped
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
func readInput(_ filePath: String) throws -> Map {
|
||||
let content = try String(contentsOfFile: filePath, encoding: .ascii)
|
||||
let rows = content.split(separator: "\n").map(Array.init)
|
||||
let (patrolX, patrolY) = rows.map {
|
||||
$0.enumerated().compactMap { j, cell in cell == "^" ? j : nil }
|
||||
}.enumerated().compactMap { $1.count > 0 ? ($0, $1[0]) : nil }[0]
|
||||
let initPatrol = GuardPos(x: patrolX, y: patrolY, dir: Direction.n)
|
||||
return Map(
|
||||
obst: rows.map { $0.map { $0 == "#" } },
|
||||
patrol: initPatrol,
|
||||
visited: [initPatrol]
|
||||
)
|
||||
}
|
||||
|
||||
var map = try readInput(CommandLine.arguments[1])
|
||||
var count = 0
|
||||
for x in 0..<map.obst.count {
|
||||
for y in 0..<map.obst[x].count {
|
||||
print("Trying \(x), \(y)...")
|
||||
if var newMap = map.addObst(x: x, y: y) {
|
||||
while !newMap.done {
|
||||
newMap.step()
|
||||
}
|
||||
if newMap.looped {
|
||||
count += 1
|
||||
print("!!!!!!!!")
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
print(count)
|
||||
|
130
day06/input.txt
Normal file
130
day06/input.txt
Normal file
@@ -0,0 +1,130 @@
|
||||
.......................#....#....................#....#..##.##.........................................#...........#...........#..
|
||||
.............#........................................#....................#............#.......................#............#....
|
||||
.........#.............#..#....#..........................#.......#.#.......#...............................................##....
|
||||
..........#....#....................................................#....................#...........#....#.......................
|
||||
.............#...#....................#...........#.........#...........................#............#............................
|
||||
..........................................................................................#.....#.......#...................##....
|
||||
...............................................#.#......#..............#...#...................##...........#....#..#...#.........
|
||||
..#.................#......#........#......................#.......#...............................#..............................
|
||||
.........................#...............#.....................................#....#..#..#............................#..........
|
||||
......................#.................................................................#..........#..............#...#......#....
|
||||
............................#.....##..........#.....................#..........#..#.......#.......................................
|
||||
......#...###...........#.................................................................#.......................................
|
||||
......................#.#..#................#..........#................#...........#............#..............#...#.........#...
|
||||
....#.........................#..#...............................................#....#.............#.............................
|
||||
..#............#...#............#..........#...............#.....#....##.........................#........#.......................
|
||||
..................#............#..............#..........................................................#..#..#........#.........
|
||||
.......#...#............#..........................................................#..............................#.............#.
|
||||
..#................#....................#.#...#.................................#.........#....................#.........#........
|
||||
...................................#..#..........................#........#.....#.........................................#.......
|
||||
...........##.................##............#................#...#..................................##...#........................
|
||||
..............#..................#....................................................................#...........................
|
||||
.#...#....#..........##..................................#.............................................................#......#...
|
||||
......#.....#................................#...............................................................#......#.............
|
||||
..........#.............................................#............................##....#.........................#............
|
||||
..........#......#.................#...#........#...........#.#..........#........#....................................#..........
|
||||
.#..................#.#............................#.......................#.........#.......#....................................
|
||||
.....................#....#..................#..................................................##..#................#............
|
||||
......#......................#..#..............##.......#..................................................#..............#.......
|
||||
..........................................................................#........#...#..............#.................#.........
|
||||
....................##....#.......................#........#...................#.............##.......#...........................
|
||||
.........#............#..................................................................................#........................
|
||||
........................................................................#................#........................#.............#.
|
||||
............#.......#.................................#............#..............................................................
|
||||
.#.............#...............................................#....#.........#....#..................................#.#.........
|
||||
.......................................#.....................................................................................#....
|
||||
........#........................................#...............#........................................................#.......
|
||||
...............................#.........#........#...........#.......................................................#.........#.
|
||||
.....................##...#....................................................#............#..................#..#..........##...
|
||||
................#..........#...#............................................................#...##................................
|
||||
...................#........#...............................#.................#.........#.........................................
|
||||
.................................................................................................................#................
|
||||
............................#......................................................#.....................................#......#.
|
||||
......#................#............................#.............................................................................
|
||||
..#...........#.....#.........#....#................#............................................#................................
|
||||
..................................#.......#.......#...........#.........#................#.....................................#.#
|
||||
...............................................#............................................#.#.....................#.......##....
|
||||
..............................#...............#..............................#...#...#.............................#...........#..
|
||||
.......#...........#..........................................................#........#..#.........#.....#.....#...#.............
|
||||
......................................................#.#............#.........#.#...........#........##.....#....................
|
||||
...........................................................................#..........#.........................#.........#.......
|
||||
....#.........................#.....................................................................................#...#......#..
|
||||
...#.......#............................................................#...............................#....................##.#.
|
||||
.................................#.....#................................................................#.........................
|
||||
.....................................#........................#....................................#..............................
|
||||
..............#.......................................................................#.......#....................#..........#...
|
||||
................................#..........................................#.................................#.....#..............
|
||||
...........#.......................................................#...............#.....................#..............#......#..
|
||||
..................................#..........................#.................................................................#..
|
||||
.............##......#....................................................#......#...............................................#
|
||||
#.......#...................#..........#...................#.................#..................................................#.
|
||||
.......#..........#.....##...........#.......................#............#..............................#.............#..........
|
||||
.............#...................##......................................................................................#........
|
||||
#.............................#...................................................................#...............................
|
||||
.#...................................#....##..................................................................................#...
|
||||
.................................#.#..................#..#..#..........................#.......#..................................
|
||||
..................#....#....#....................................................#....................................#........#..
|
||||
..........................................#...#.....#...........#.........#............#............#..........................#..
|
||||
...............................................................................#..............................................#...
|
||||
.............................#......#....................#....#....................................................#.#.#..........
|
||||
................##......#........#........#...........#..........................#......................#..............#..........
|
||||
.....................#.....#..#.............................................................................................#.....
|
||||
.......#..#...........#................................................................#..........................................
|
||||
#.......................................................................................................#...#.....................
|
||||
.#..........................................................#.....................................................#...............
|
||||
#.....#...#...............#..#......#........#..#...................#...................#.................#.......................
|
||||
..#.................................................................................#.#......................#....................
|
||||
.......................#.............#..........#.......................#...................................#.....................
|
||||
.................#......#......#...#.#.#.............................#.......................................................#....
|
||||
..#...........................................................................................................#...................
|
||||
.................................#..................#.....#........#.........................................................#....
|
||||
.............#......................#...............................................#...#.............................#...#....#..
|
||||
.#............................#..........................#.#...........................#..........................#.#.............
|
||||
.............................#.........#.................##............................#...................#......................
|
||||
.........#......#....#.........#..............................................................................................#..#
|
||||
.....................#......#.................#..#..........................#..................#..............................#.#.
|
||||
........................................................#......................#............#.......#......#......................
|
||||
........................................#....##.#........#......#..............................#..........#..........#.##.........
|
||||
.............#.......#.......#......................#..........................................#.........#............#...#...#.#.
|
||||
..................#........................................................#...............................#.....#.....#..........
|
||||
.........#.................#........#..............^..............#.................##......#...................................#.
|
||||
....#...................#.#.................................#...#.................................................#...............
|
||||
.................#.............................................#................#.....#......#.......#...................#........
|
||||
...............#...............................................................................#..#...............#...............
|
||||
........................................##..........................................................................##............
|
||||
............................................#...................#........#...#...#....#.........#...................#.............
|
||||
.....#...#...................#....................................#......#...........#...............#............................
|
||||
........................#..................#.....................#.................................................#......##......
|
||||
...#.................#....................#..................................#.#.........................#.......#................
|
||||
....................#............#..................................#...#......#....................#...............#.............
|
||||
.....#...............#.......###........#............#......................#.......#....#........................................
|
||||
....................#........#...........#..................................#..#................#.............#...................
|
||||
.....#..................#...................#.#..................................#.......#..#.....................................
|
||||
..#..#.......#........................................#.................................................................#.........
|
||||
.......#............#...#....#.......................#.#...................................#.........................#..#.#.......
|
||||
..............#......................................................................................................#............
|
||||
............#....................#........................#.........#...#.........................................................
|
||||
...................................#..............................#.........................................................#.....
|
||||
......##...........#.#........................#.........................................................................#.........
|
||||
..........................#.....................................................#..............................#..............#...
|
||||
.........................#...#.....................#..#................#................................................#....#....
|
||||
...#.................................#...#.......#...............................................................#................
|
||||
..................................#....................................#...........................##..#.#.....................#..
|
||||
.#.............#.....#...............................................................#...............#...............#..#.........
|
||||
.........#.............................#........................#.............#......................#........#............#......
|
||||
...................................#..#...#.....................................#.................................................
|
||||
........................................##..........#..............................................#.....................#........
|
||||
......#...........................................#....#.....................#...................#..#.........#...................
|
||||
.#....#.....#........##..................................#......#................................................#....#..##.......
|
||||
..........#....................................................................##.........................#...........#...........
|
||||
...........#.#......#.......#..................#............#...............................................#...#..............#..
|
||||
.................................................................#.......#.........#.....#........#....##....#..........#.........
|
||||
.............................#......................................................#.....#...#...#....#...........#..........#.#.
|
||||
.....................#........#.........................#......................................#................#...............#.
|
||||
.........................................................................#...................................................#....
|
||||
..............#...#..#................#....................................#.......#....#.#...............#.........#.............
|
||||
.......#......#.#............................................#.......#............................................................
|
||||
##......................................................#..#.................................##...................#..#...........#
|
||||
...........#.#...#........#............#..............................#........................#.........................#..#.....
|
||||
................................................##.........................................#.................#....................
|
||||
............................#....................................................#...#........................#.#......#........#.
|
10
day06/test.txt
Normal file
10
day06/test.txt
Normal file
@@ -0,0 +1,10 @@
|
||||
....#.....
|
||||
.........#
|
||||
..........
|
||||
..#.......
|
||||
.......#..
|
||||
..........
|
||||
.#..^.....
|
||||
........#.
|
||||
#.........
|
||||
......#...
|
Reference in New Issue
Block a user