d10
This commit is contained in:
49
day10/d10p1.swift
Normal file
49
day10/d10p1.swift
Normal file
@@ -0,0 +1,49 @@
|
|||||||
|
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 valid(xLimit: Int, yLimit: Int) -> Bool {
|
||||||
|
return x >= 0 && y >= 0 && x < xLimit && y < yLimit
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
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])
|
||||||
|
var answer: Int = 0
|
||||||
|
//topo.forEach { k, v in print("\(k): \(v)") }
|
||||||
|
|
||||||
|
for start in topo[0]! {
|
||||||
|
var froms: Set<Coord> = [start]
|
||||||
|
for altitude in 1...9 {
|
||||||
|
var tos: Set<Coord> = []
|
||||||
|
for from in froms {
|
||||||
|
from.neighbors()
|
||||||
|
.filter { c in c.valid(xLimit: height, yLimit: width) }
|
||||||
|
.filter { c in topo[altitude]!.contains(c) }
|
||||||
|
.forEach { c in tos.insert(c) }
|
||||||
|
}
|
||||||
|
froms = tos
|
||||||
|
}
|
||||||
|
answer += froms.count
|
||||||
|
}
|
||||||
|
print(answer)
|
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 })
|
52
day10/input.txt
Normal file
52
day10/input.txt
Normal file
@@ -0,0 +1,52 @@
|
|||||||
|
0145677654325490845691012345621876560340100123012398
|
||||||
|
1238988998216781932782121234010983401259230034563387
|
||||||
|
4323589867205432801543210945125672378768341459654456
|
||||||
|
1014678454102301765456901876034561769897652368776301
|
||||||
|
6765521543201512350307872962120120850785677879789210
|
||||||
|
0896430439810487461217965871298438941454980968654321
|
||||||
|
1765012126723596543478014560167569032363211457256762
|
||||||
|
2872121035434654302569123441455678121071102340145895
|
||||||
|
3961230345985783211098710332334599432980098743232434
|
||||||
|
4550145456676890100167000146721087641001217650141325
|
||||||
|
9649056765489910651254121035890014550732309654210016
|
||||||
|
8738769894676328762343236124301123669845498763227807
|
||||||
|
7129787923565439651456347833210008778996787120156998
|
||||||
|
1013496014567010340987656944782119211087898031343210
|
||||||
|
1012345002198321232876501855693024302332196541034101
|
||||||
|
1234567123023450901965432761054435678445087670123256
|
||||||
|
0144898454910767845670301622169546589556764581214347
|
||||||
|
4343732367867893034981243213678696765698873294309838
|
||||||
|
1234351078754702121893214504589787894780987101456789
|
||||||
|
0943765469843213210721303698921009683211074560167678
|
||||||
|
7856874348765434785630410787652118701202983076298987
|
||||||
|
6765989219210125698540521236543025654343892189347567
|
||||||
|
5667867804321087582101638347432134509856782345456498
|
||||||
|
1054876965691296443492789858901213212790101276012387
|
||||||
|
2123965476780125356783498767654300103685230983401456
|
||||||
|
3278954587821034219870567658967876234576541092560845
|
||||||
|
2567543296930761006721498743478965987655612451076921
|
||||||
|
1056230145945852345012345412661234554567803367987830
|
||||||
|
2340167034876945123211296401780109693069954298756101
|
||||||
|
7887658123985231034500787345691218782178769110343232
|
||||||
|
6992349032100112985011216217885011071078978021232349
|
||||||
|
5801239844301101676720105606976522362567987876541458
|
||||||
|
4321023765432432369838234745983439453454376965430167
|
||||||
|
3087610321396565458949549836112378321043105302301298
|
||||||
|
2198565410187076327658678921001065439652234211017657
|
||||||
|
3233478903216189014547664567632104508701230322928943
|
||||||
|
4542369894103273223014523498549812012349821498834012
|
||||||
|
7651423765764784132123210210038763676256734567765423
|
||||||
|
8960314349845695041012396342121054985109875498656701
|
||||||
|
4871005256736786780169487653434873014018766787567892
|
||||||
|
5654196149821677893278565694565963223321051096450943
|
||||||
|
6743287032120563034567684787696954101438142345321056
|
||||||
|
7899180129061432125675893256787845698589233239885469
|
||||||
|
3458098938778743210986710143876034787670132178596378
|
||||||
|
2167347845609654331235430782932128236101056017687267
|
||||||
|
6056256741012103220543521691047659145692347012570167
|
||||||
|
7890165432343210110652434598798578036785498743456898
|
||||||
|
6784567876758701328701223123623457629876901234347107
|
||||||
|
5413218965869232499899810034510256510267892301298256
|
||||||
|
4303409954978149581234745218760105100126765410789340
|
||||||
|
3212567823019058670365634309451234981237898323870121
|
||||||
|
4321016012108767621256565678321015676546767654965432
|
8
day10/test.txt
Normal file
8
day10/test.txt
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
89010123
|
||||||
|
78121874
|
||||||
|
87430965
|
||||||
|
96549874
|
||||||
|
45678903
|
||||||
|
32019012
|
||||||
|
01329801
|
||||||
|
10456732
|
4
day10/test0.txt
Normal file
4
day10/test0.txt
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
0123
|
||||||
|
1234
|
||||||
|
8765
|
||||||
|
9876
|
Reference in New Issue
Block a user