Skip to content

Commit 61206dc

Browse files
committed
Initial commit
0 parents  commit 61206dc

22 files changed

+1891
-0
lines changed

Makefile

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
day1:
2+
npx ts-node day1.ts
3+
day1-2:
4+
npx ts-node day1-2.ts
5+
6+
day2:
7+
npx ts-node day2.ts
8+
day2-2:
9+
npx ts-node day2-2.ts
10+
11+
day3:
12+
npx ts-node day3.ts
13+
day3-2:
14+
npx ts-node day3-2.ts
15+
16+
day4:
17+
npx ts-node day4.ts
18+
day4-2:
19+
npx ts-node day4-2.ts
20+
21+
day5:
22+
npx ts-node day5.ts
23+
day5-2:
24+
npx ts-node day5-2.ts
25+
26+
day6:
27+
npx ts-node day6.ts
28+
day6-2:
29+
npx ts-node day6-2.ts

day1-2.ts

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import * as fs from "fs"
2+
3+
const file = fs.readFileSync("input-day1.txt", "utf8")
4+
.split("\n")
5+
.slice(0, -1)
6+
.map(l => parseInt(l))
7+
.map(i => fuel(i))
8+
.reduce((a, v) => a + v, 0)
9+
console.log(file)
10+
11+
function fuel(mass): number {
12+
if(mass <= 0) {
13+
return 0
14+
}
15+
const liters = Math.floor(mass / 3) - 2
16+
return fuel(liters) + Math.max(0, liters)
17+
}

day1.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
import * as fs from "fs"
2+
3+
const file = fs.readFileSync("input-day1.txt", "utf8")
4+
.split("\n")
5+
.slice(0, -1)
6+
.map(l => parseInt(l))
7+
.map(i => Math.floor(i / 3) -2)
8+
.reduce((a, v) => a + v, 0)
9+
console.log(file)

day2-2.ts

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
import * as fs from "fs"
2+
3+
const targetOutput = 19690720
4+
5+
function run(noun: number, verb: number) {
6+
const mem = fs.readFileSync("input-day2.txt", "utf8")
7+
.split(",")
8+
.map(l => parseInt(l))
9+
10+
mem[1] = noun
11+
mem[2] = verb
12+
13+
let instrPtr = 0
14+
15+
while(true) {
16+
const opCode = mem[instrPtr]
17+
switch(opCode) {
18+
case 1:
19+
add(mem, mem[instrPtr+1], mem[instrPtr+2], mem[instrPtr+3])
20+
break
21+
case 2:
22+
mul(mem, mem[instrPtr+1], mem[instrPtr+2], mem[instrPtr+3])
23+
break
24+
case 99:
25+
return mem[0]
26+
break
27+
default: throw new Error(`unknown instruction ${mem[instrPtr]}`)
28+
}
29+
instrPtr += 4
30+
}
31+
}
32+
33+
function add(mem: number[], src1: number, src2: number, dst: number) {
34+
mem[dst] = mem[src1] + mem[src2]
35+
}
36+
function mul(mem: number[], src1: number, src2: number, dst: number) {
37+
mem[dst] = mem[src1] * mem[src2]
38+
}
39+
40+
for(let noun = 0; noun < 100; noun++) {
41+
for(let verb = 0; verb < 100; verb++) {
42+
const output = run(noun, verb)
43+
if(output === targetOutput) {
44+
console.log(100*noun + verb)
45+
process.exit(0)
46+
}
47+
}
48+
}

day2.ts

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
import * as fs from "fs"
2+
3+
const mem = fs.readFileSync("input-day2.txt", "utf8")
4+
.split(",")
5+
.map(l => parseInt(l))
6+
7+
mem[1] = 12
8+
mem[2] = 2
9+
10+
let instrPtr = 0
11+
12+
function run() {
13+
while(true) {
14+
const opCode = mem[instrPtr]
15+
switch(opCode) {
16+
case 1:
17+
add(mem[instrPtr+1], mem[instrPtr+2], mem[instrPtr+3])
18+
break
19+
case 2:
20+
mul(mem[instrPtr+1], mem[instrPtr+2], mem[instrPtr+3])
21+
break
22+
case 99:
23+
halt()
24+
break
25+
default: throw new Error(`unknown instruction ${mem[instrPtr]}`)
26+
}
27+
instrPtr += 4
28+
}
29+
}
30+
31+
function add(src1: number, src2: number, dst: number) {
32+
mem[dst] = mem[src1] + mem[src2]
33+
}
34+
function mul(src1: number, src2: number, dst: number) {
35+
mem[dst] = mem[src1] * mem[src2]
36+
}
37+
function halt() {
38+
console.log(`halting with value ${mem[0]}`)
39+
process.exit(0)
40+
}
41+
42+
run()

day3-2.ts

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

day3.ts

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
import * as fs from "fs"
2+
3+
const input = fs.readFileSync("input-day3.txt", "utf8")
4+
const paths: [number, number][][] = input.split("\n")
5+
.slice(0, -1)
6+
.map(p =>
7+
p.split(",")
8+
.map(v => ([v[0], parseInt(v.slice(1))]))
9+
.map((v: [string, number]): [number, number] => {
10+
switch(v[0]) {
11+
case "U": return [0, v[1]]; break
12+
case "D": return [0, -v[1]]; break
13+
case "R": return [v[1], 0]; break
14+
case "L": return [-v[1], 0]; break
15+
default: throw new Error(`unknown direction ${v[0]}`)
16+
}
17+
})
18+
)
19+
20+
function add(v1: number[], v2: number[]): [number, number] {
21+
return [v1[0] + v2[0], v1[1] + v2[1]]
22+
}
23+
24+
function len(v: number[]) {
25+
return Math.abs(v[0]) + Math.abs(v[1])
26+
}
27+
28+
function norm(v: number[]) {
29+
return [Math.sign(v[0]), Math.sign(v[1])]
30+
}
31+
32+
function points(p: [number, number][]): [number, number][] {
33+
let c = [0, 0]
34+
let points = []
35+
p.forEach(p => {
36+
for(let l = 0; l < len(p); l++) {
37+
c = add(c, norm(p))
38+
points.push(c)
39+
}
40+
})
41+
return points
42+
}
43+
44+
const [points1, points2] = paths.map(p => points(p).map(p => `${p[0]};${p[1]}`))
45+
const pset = new Set(points2)
46+
const overlap = points1.filter(p => pset.has(p)).map(p => p.split(";").map(p => parseInt(p)))
47+
console.log(Math.min(...overlap.map(p => Math.abs(p[0]) + Math.abs(p[1]))))

day4-2.ts

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
const min = 153517
2+
const max = 630395
3+
//const min = 111120
4+
//const max = 111300
5+
6+
let count = 0
7+
for(let i = min; i <= max; i++) {
8+
if(valid(i)) {
9+
count++
10+
}
11+
}
12+
13+
function valid(code) {
14+
const s = code.toString()
15+
for(let i = 1; i < s.length; i++) {
16+
if(s.charAt(i) < s.charAt(i - 1)) {
17+
console.log(`F ${code}`)
18+
return false
19+
}
20+
}
21+
for(let i = 1; i < s.length; i++) {
22+
if(s.charAt(i) == s.charAt(i - 1)
23+
&& s.charAt(i) != s.charAt(i + 1)
24+
&& s.charAt(i) != s.charAt(i - 2)) {
25+
console.log(`T ${code}`)
26+
return true
27+
}
28+
}
29+
console.log(`F ${code}`)
30+
return false
31+
}
32+
33+
console.log(count)

day4.ts

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
const min = 153517
2+
const max = 630395
3+
//const min = 123455
4+
//const max = 123500
5+
6+
let count = 0
7+
for(let i = min; i <= max; i++) {
8+
if(valid(i)) {
9+
count++
10+
}
11+
}
12+
13+
function valid(code) {
14+
const s = code.toString()
15+
for(let i = 1; i < s.length; i++) {
16+
if(s.charAt(i) < s.charAt(i - 1)) {
17+
console.log(`F ${code}`)
18+
return false
19+
}
20+
}
21+
for(let i = 1; i < s.length; i++) {
22+
if(s.charAt(i) == s.charAt(i - 1)) {
23+
console.log(`T ${code}`)
24+
return true
25+
}
26+
}
27+
console.log(`F ${code}`)
28+
return false
29+
}
30+
31+
console.log(count)

0 commit comments

Comments
 (0)