d10
This commit is contained in:
		
							
								
								
									
										46
									
								
								day10/d10p2.swift
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										46
									
								
								day10/d10p2.swift
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,46 @@ | ||||
| import Foundation | ||||
|  | ||||
| struct Coord : Hashable, CustomStringConvertible { | ||||
|     let x: Int | ||||
|     let y: Int | ||||
|     var description: String { return "(\(x), \(y))" } | ||||
|     func neighbors() -> [Coord] { | ||||
|         return [ | ||||
|             Coord(x: x-1, y: y), Coord(x: x+1, y: y), | ||||
|             Coord(x: x, y: y-1), Coord(x: x, y: y+1) | ||||
|         ] | ||||
|     } | ||||
| } | ||||
|  | ||||
| func readInput(_ filePath: String) throws -> ([Int:Set<Coord>], Int, Int) { | ||||
|     let content = try String(contentsOfFile: filePath, encoding: .ascii) | ||||
|     let lines = content.split(separator: "\n").map(Array.init) | ||||
|     let map = lines.map { $0.map(String.init).map { Int($0)! } } | ||||
|     var topo: [Int:Set<Coord>] = [:] | ||||
|     map.enumerated().forEach { i, row in | ||||
|         row.enumerated().forEach { j, h in | ||||
|             topo[h] = (topo[h] ?? []).union([Coord(x: i, y: j)]) | ||||
|         } | ||||
|     } | ||||
|     return (topo, lines.count, lines[0].count) | ||||
| } | ||||
|  | ||||
| let (topo, height, width) = try readInput(CommandLine.arguments[1]) | ||||
| topo.forEach { k, v in print("\(k): \(v)") } | ||||
|  | ||||
| var currentLayer: [Coord:Int] = Dictionary( | ||||
|     uniqueKeysWithValues: topo[0]!.map { coord in (coord, 1) } | ||||
| ) | ||||
| print("\n0: \(currentLayer)") | ||||
| for alt in 1...9 { | ||||
|     var nextLayer: [Coord:Int] = [:] | ||||
|     for (from, score) in currentLayer { | ||||
|         from.neighbors() | ||||
|             .filter { c in c.x >= 0 && c.y >= 0 && c.x < height && c.y < width } | ||||
|             .filter { c in topo[alt]!.contains(c) } | ||||
|             .forEach { c in nextLayer[c] = (nextLayer[c] ?? 0) + score } | ||||
|     } | ||||
|     currentLayer = nextLayer | ||||
|     print("\(alt): \(currentLayer)") | ||||
| } | ||||
| print(currentLayer.values.reduce(0) { s, score in s + score }) | ||||
		Reference in New Issue
	
	Block a user