d20p2
This commit is contained in:
		| @@ -20,21 +20,19 @@ struct Maze : CustomStringConvertible { | ||||
|         } | ||||
|         return s.map { $0.joined() + "\n" }.joined() + "\(start), \(end)" | ||||
|     } | ||||
|     let adjacents = [(-1, 0), (1, 0), (0, -1), (0, 1)] | ||||
|  | ||||
|     func valid(_ cell: Coord) -> Bool { | ||||
|         return cell.x >= 0 && cell.x < w && cell.y >= 0 && cell.y < h && | ||||
|             !walls.contains(cell) | ||||
|     } | ||||
|  | ||||
|     func neighbor(of cell: Coord, isNot excluded: Coord) -> Coord { | ||||
|         return adjacents | ||||
|     func neighbors(of cell: Coord) -> [Coord] { | ||||
|         return [(-1, 0), (1, 0), (0, -1), (0, 1)] | ||||
|             .map { dx, dy in Coord(x: cell.x + dx, y: cell.y + dy) } | ||||
|             .filter { newCell in valid(newCell) && newCell != excluded }[0] | ||||
|     } | ||||
|  | ||||
|     func cheats(of cell: Coord) -> [Coord] { | ||||
|         return adjacents | ||||
|         return [(-1, 0), (1, 0), (0, -1), (0, 1)] | ||||
|             .map { dx, dy in Coord(x: cell.x + dx*2, y: cell.y + dy*2) } | ||||
|             .filter(valid) | ||||
|     } | ||||
| @@ -43,18 +41,18 @@ struct Maze : CustomStringConvertible { | ||||
|         var cost: [Coord: Int] = [start: 0] | ||||
|         var jumps: [(Coord, Coord)] = [] | ||||
|         var cell = start | ||||
|         var prevCell = start | ||||
|         var prev = start | ||||
|         var currentCost = 0 | ||||
|         while cell != end { | ||||
|             // list potential cheats from current cell | ||||
|             let newCheats = cheats(of: cell).filter { !cost.keys.contains($0) } | ||||
|             jumps.append(contentsOf: newCheats.map { dest in (cell, dest)} ) | ||||
|             // add cost to table | ||||
|             let nextCell = neighbor(of: cell, isNot: prevCell) | ||||
|             let next = neighbors(of: cell).filter(valid).filter { $0 != prev }[0] | ||||
|             currentCost += 1 | ||||
|             cost[nextCell] = currentCost  | ||||
|             prevCell = cell | ||||
|             cell = nextCell | ||||
|             cost[next] = currentCost | ||||
|             prev = cell | ||||
|             cell = next | ||||
|         } | ||||
|         return jumps.map { from, to in cost[to]! - cost[from]! - 2 } | ||||
|     } | ||||
| @@ -84,6 +82,7 @@ func readInput(_ filePath: String) throws -> Maze { | ||||
| let maze = try readInput(CommandLine.arguments[1]) | ||||
| print(maze) | ||||
| let cheats = maze.cheats() | ||||
| print(cheats.reduce(into: [:]) { counts, t in counts[t, default: 0] += 1 }) | ||||
| let hist = cheats.reduce(into: [:]) { counts, t in counts[t, default: 0] += 1 } | ||||
| hist.keys.sorted().forEach { print("\($0) -> \(hist[$0]!)") } | ||||
| print(cheats.filter { $0 >= 100 }.count) | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user