Skip to content

Commit e588a83

Browse files
committed
Day 12
1 parent 2dadda0 commit e588a83

File tree

4 files changed

+152
-0
lines changed

4 files changed

+152
-0
lines changed

Makefile

+5
Original file line numberDiff line numberDiff line change
@@ -52,3 +52,8 @@ day11:
5252
npx ts-node day11.ts
5353
day11-2:
5454
npx ts-node day11-2.ts
55+
56+
day12:
57+
npx ts-node day12.ts
58+
day12-2:
59+
npx ts-node day12-2.ts

day12-2.ts

+83
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
import * as fs from "fs"
2+
const abs = Math.abs
3+
4+
const input = fs.readFileSync("input-day12.txt", "utf8")
5+
6+
function parse(input: string): Vector[] {
7+
const regEx = /\<x=(-?\d+), y=(-?\d+), z=(-?\d+)\>/g
8+
let m: RegExpExecArray
9+
const vs = []
10+
while ((m = regEx.exec(input)) !== null) {
11+
vs.push([m[1], m[2], m[3]].map(Number))
12+
}
13+
return vs
14+
}
15+
16+
type Vector = [number, number, number]
17+
18+
function add(v1: Vector, v2: Vector): Vector {
19+
return [v1[0] + v2[0], v1[1] + v2[1], v1[2] + v2[2]]
20+
}
21+
function sub(v1: Vector, v2: Vector): Vector {
22+
return [v1[0] - v2[0], v1[1] - v2[1], v1[2] - v2[2]]
23+
}
24+
function sign(v1: Vector): Vector {
25+
return [v1[0], v1[1], v1[2]].map(Math.sign) as Vector
26+
}
27+
function gcd(a: number, b: number) {
28+
if (a == 0) return abs(b)
29+
if (b == 0) return abs(a)
30+
31+
let h: number
32+
do {
33+
h = a % b
34+
a = b
35+
b = h
36+
} while (b != 0)
37+
return abs(a)
38+
}
39+
function lcm(a: number, b: number) {
40+
return abs(a * b) / gcd(a, b)
41+
}
42+
43+
const initialPs = parse(input)
44+
const initialVs = initialPs.map(_ => <Vector>[0, 0, 0])
45+
46+
function period(axis: number): number {
47+
let ps = initialPs.slice()
48+
let vs = initialVs.slice()
49+
50+
let s = 0
51+
while (true) {
52+
vs = gravity(ps, vs)
53+
ps = move(ps, vs)
54+
55+
if (ps.every((p, i) => p[axis] === initialPs[i][axis] && vs[i][axis] === initialVs[i][axis])) {
56+
console.log(`equality after step ${s + 1}`)
57+
return s + 1
58+
}
59+
s++
60+
}
61+
}
62+
63+
const periods = [0, 1, 2].map(period)
64+
console.log(lcm(lcm(periods[2], periods[1]), periods[0]))
65+
66+
67+
function gravity(ps: Vector[], vs: Vector[]): Vector[] {
68+
ps.forEach((p1, i) => {
69+
ps.forEach((p2, j) => {
70+
if (i == j) {
71+
return
72+
}
73+
74+
const v = vs[i]
75+
vs[i] = add(v, sign(sub(p2, p1)))
76+
})
77+
})
78+
return vs
79+
}
80+
81+
function move(ps: Vector[], vs: Vector[]): Vector[] {
82+
return ps.map((p, i) => add(p, vs[i]))
83+
}

day12.ts

+60
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
import * as fs from "fs"
2+
3+
const input = fs.readFileSync("input-day12.txt", "utf8")
4+
5+
function parse(input: string): Vector[] {
6+
const regEx = /\<x=(-?\d+), y=(-?\d+), z=(-?\d+)\>/g
7+
let m: RegExpExecArray
8+
const vs = []
9+
while ((m = regEx.exec(input)) !== null) {
10+
vs.push([m[1], m[2], m[3]].map(Number))
11+
}
12+
return vs
13+
}
14+
15+
type Vector = [number, number, number]
16+
17+
function add(v1: Vector, v2: Vector): Vector {
18+
return [v1[0] + v2[0], v1[1] + v2[1], v1[2] + v2[2]]
19+
}
20+
function sub(v1: Vector, v2: Vector): Vector {
21+
return [v1[0] - v2[0], v1[1] - v2[1], v1[2] - v2[2]]
22+
}
23+
function sign(v1: Vector): Vector {
24+
return [v1[0], v1[1], v1[2]].map(Math.sign) as Vector
25+
}
26+
function len(v1: Vector): number {
27+
return v1.map(Math.abs).reduce((a, v) => a + v, 0)
28+
}
29+
30+
let ps = parse(input)
31+
let vs = ps.map(_ => <Vector>[0, 0, 0])
32+
for (let i = 0; i < 1000; i++) {
33+
vs = gravity()
34+
ps = move()
35+
console.log(`after step ${i + 1}`)
36+
console.log(ps)
37+
console.log(vs)
38+
console.log()
39+
}
40+
41+
const energy = ps.map((p, i) => len(p) * len(vs[i])).reduce((a, v) => a + v, 0)
42+
console.log(energy)
43+
44+
function gravity(): Vector[] {
45+
ps.forEach((p1, i) => {
46+
ps.forEach((p2, j) => {
47+
if (i == j) {
48+
return
49+
}
50+
51+
const v = vs[i]
52+
vs[i] = add(v, sign(sub(p2, p1)))
53+
})
54+
})
55+
return vs
56+
}
57+
58+
function move() {
59+
return ps.map((p, i) => add(p, vs[i]))
60+
}

input-day12.txt

+4
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
<x=0, y=6, z=1>
2+
<x=4, y=4, z=19>
3+
<x=-11, y=1, z=8>
4+
<x=2, y=19, z=15>

0 commit comments

Comments
 (0)