-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathday3-2.ts
More file actions
51 lines (45 loc) · 1.45 KB
/
day3-2.ts
File metadata and controls
51 lines (45 loc) · 1.45 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
import * as fs from "fs"
const input = fs.readFileSync("input-day3.txt", "utf8")
//const input = "R75,D30,R83,U83,L12,D49,R71,U7,L72\nU62,R66,U55,R34,D71,R55,D58,R83\n"
const paths: [number, number][][] = input.split("\n")
.slice(0, -1)
.map(p =>
p.split(",")
.map(v => ([v[0], parseInt(v.slice(1))]))
.map((v: [string, number]): [number, number] => {
switch(v[0]) {
case "U": return [0, v[1]]; break
case "D": return [0, -v[1]]; break
case "R": return [v[1], 0]; break
case "L": return [-v[1], 0]; break
default: throw new Error(`unknown direction ${v[0]}`)
}
})
)
function add(v1: number[], v2: number[]): [number, number] {
return [v1[0] + v2[0], v1[1] + v2[1]]
}
function len(v: number[]) {
return Math.abs(v[0]) + Math.abs(v[1])
}
function norm(v: number[]) {
return [Math.sign(v[0]), Math.sign(v[1])]
}
function points(p: [number, number][]): [number, number, number][] {
let c = [0, 0]
let points = []
let length = 1
p.forEach(p => {
for(let l = 0; l < len(p); l++) {
c = add(c, norm(p))
points.push([...c, length])
length++
}
})
return points
}
const [points1, points2] = paths.map(p => points(p).map(p => ([`${p[0]};${p[1]}`, p[2]] as const)))
const pmap1 = new Map<string, number>(points1.reverse())
const pmap2 = new Map<string, number>(points2.reverse())
const overlap = Array.from(pmap1.keys()).filter(p => pmap2.has(p))
console.log(Math.min(...overlap.map(p => pmap1.get(p) + pmap2.get(p))))