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