mirror of
https://github.com/Aviortheking/advent-of-code.git
synced 2025-04-22 02:42:14 +00:00
feat: Add the four first days of 2023
Signed-off-by: Avior <github@avior.me>
This commit is contained in:
parent
e4d13f602e
commit
72ca03a2f1
1000
2023/day-1/input.txt
Normal file
1000
2023/day-1/input.txt
Normal file
File diff suppressed because it is too large
Load Diff
10
2023/day-1/part-1.ts
Normal file
10
2023/day-1/part-1.ts
Normal file
@ -0,0 +1,10 @@
|
||||
// note: this runs using bun!
|
||||
const file = Bun.file('./input.txt')
|
||||
const text = await file.text()
|
||||
const res = text.split('\n').filter((it) => !!it).map((it) => {
|
||||
const nums = it.replace(/[a-z]/g, '')
|
||||
const first = nums[0]
|
||||
const last = nums[nums.length - 1]
|
||||
return parseInt(first + last)
|
||||
}).reduce((p, c) => p + c, 0)
|
||||
console.log(res)
|
43
2023/day-1/part-2.ts
Normal file
43
2023/day-1/part-2.ts
Normal file
@ -0,0 +1,43 @@
|
||||
// note: this runs using bun!
|
||||
const file = Bun.file('./input.txt')
|
||||
const text = await file.text()
|
||||
|
||||
// hack by https://twitter.com/championswimmer/status/1730667285415948767
|
||||
const letters = {
|
||||
'one': 'o1ne',
|
||||
'two': 't2wo',
|
||||
'three': 'th3ree',
|
||||
'four': 'fo4ur',
|
||||
'five': 'fi5ve',
|
||||
'six': 's6ix',
|
||||
'seven': 'se7ven',
|
||||
'eight': 'ei8ght',
|
||||
'nine': 'ni9ne'
|
||||
} as const
|
||||
|
||||
const res = text.split('\n').filter((it) => !!it).map((it) => {
|
||||
let nextNumber = -1
|
||||
let nextLetter: keyof typeof letters | null = null
|
||||
do {
|
||||
nextNumber = -1
|
||||
for (const text in letters) {
|
||||
const idx = it.indexOf(text)
|
||||
if (nextNumber === -1 || (idx > -1 && idx < nextNumber)) {
|
||||
nextNumber = idx
|
||||
nextLetter = text as 'one'
|
||||
}
|
||||
}
|
||||
if (nextNumber > -1 && nextLetter) {
|
||||
it = it.replace(nextLetter, letters[nextLetter])
|
||||
}
|
||||
} while (nextNumber > -1)
|
||||
|
||||
const nums = it.replace(/[a-z]/g, '')
|
||||
const first = nums[0]
|
||||
const last = nums[nums.length - 1]
|
||||
return parseInt(first + last)
|
||||
}).reduce((p, c) => p + c, 0)
|
||||
console.log(res)
|
||||
|
||||
// too low:
|
||||
// too high: 53896
|
100
2023/day-2/input.txt
Normal file
100
2023/day-2/input.txt
Normal file
@ -0,0 +1,100 @@
|
||||
Game 1: 1 green, 4 blue; 1 blue, 2 green, 1 red; 1 red, 1 green, 2 blue; 1 green, 1 red; 1 green; 1 green, 1 blue, 1 red
|
||||
Game 2: 2 blue, 2 red, 6 green; 1 red, 6 green, 7 blue; 10 green, 8 blue, 1 red; 2 green, 18 blue, 2 red; 14 blue, 3 green, 1 red; 8 green, 1 red, 9 blue
|
||||
Game 3: 6 green, 5 blue, 9 red; 4 blue, 1 green, 13 red; 9 green, 14 red, 1 blue
|
||||
Game 4: 14 green, 3 blue, 16 red; 20 red; 4 green, 2 red, 1 blue; 10 blue, 11 green, 18 red; 3 red, 3 blue, 6 green; 2 green, 18 red, 9 blue
|
||||
Game 5: 5 green, 4 blue; 1 red, 3 blue, 2 green; 4 green, 2 red, 15 blue; 11 blue, 8 green, 4 red; 4 red, 3 green; 4 red, 3 green, 7 blue
|
||||
Game 6: 6 blue, 10 green; 2 red, 6 green, 2 blue; 4 red, 4 blue, 1 green; 2 blue, 7 green, 2 red
|
||||
Game 7: 14 green, 3 red, 2 blue; 5 blue, 3 green, 2 red; 1 green, 3 blue
|
||||
Game 8: 7 red; 3 blue, 9 red, 1 green; 5 green, 5 blue, 7 red; 1 red, 2 blue
|
||||
Game 9: 3 green, 4 blue, 1 red; 3 blue, 12 green, 18 red; 7 green, 9 red, 8 blue; 2 blue, 10 red, 12 green; 4 blue, 1 red, 1 green; 4 blue, 6 green, 6 red
|
||||
Game 10: 2 blue, 4 green, 2 red; 7 green, 4 red; 5 red, 8 green
|
||||
Game 11: 1 blue, 10 green, 15 red; 1 blue, 2 green, 2 red; 5 green, 10 blue, 8 red; 13 red, 7 blue; 1 red, 9 green, 4 blue; 9 blue, 9 red, 8 green
|
||||
Game 12: 1 green, 10 red, 3 blue; 14 red, 1 green, 4 blue; 6 red, 3 green, 12 blue; 13 blue, 1 green, 18 red; 4 green, 14 red, 7 blue
|
||||
Game 13: 1 red, 3 green; 2 green, 1 red, 5 blue; 1 blue; 1 green, 7 blue, 1 red; 1 red, 2 green, 7 blue
|
||||
Game 14: 7 blue, 9 red, 1 green; 8 red, 2 blue; 11 red, 18 blue, 4 green; 2 blue, 3 green, 1 red; 1 green, 8 red, 9 blue; 2 blue, 8 red, 1 green
|
||||
Game 15: 8 blue, 3 green, 15 red; 13 red, 10 blue; 2 red
|
||||
Game 16: 1 green, 1 red; 1 blue, 2 green, 2 red; 1 blue, 4 red, 1 green; 3 green; 2 blue, 3 green, 4 red
|
||||
Game 17: 1 green, 3 red, 14 blue; 1 red, 2 blue, 2 green; 3 red
|
||||
Game 18: 1 red, 2 green, 8 blue; 2 blue, 14 red; 4 blue, 2 red, 2 green; 6 red
|
||||
Game 19: 2 red, 11 blue, 18 green; 3 red, 6 green, 3 blue; 7 green, 1 red, 10 blue
|
||||
Game 20: 10 red, 1 blue, 4 green; 4 green, 3 blue; 10 green, 13 red, 4 blue; 2 red, 7 green; 4 red, 3 blue, 5 green; 13 red, 1 green, 4 blue
|
||||
Game 21: 20 red, 4 green, 5 blue; 10 red, 11 green, 4 blue; 1 red, 8 blue, 14 green; 11 green, 8 blue, 15 red; 8 blue, 2 green, 13 red
|
||||
Game 22: 2 red, 11 blue, 4 green; 1 blue, 3 red, 6 green; 6 green, 1 red, 1 blue; 4 green, 7 blue, 3 red; 11 blue, 6 green, 4 red
|
||||
Game 23: 6 green, 3 red, 1 blue; 17 green, 11 red; 1 red, 2 blue, 13 green; 13 green, 19 red
|
||||
Game 24: 1 blue; 12 red, 1 blue; 1 red; 12 red, 1 green, 1 blue; 11 red, 1 blue; 12 red, 1 green
|
||||
Game 25: 12 blue, 6 red, 3 green; 8 green, 14 blue; 11 green, 5 blue, 6 red; 4 red, 12 blue, 8 green
|
||||
Game 26: 15 red, 13 green, 9 blue; 9 blue, 8 green, 7 red; 2 green, 6 red, 3 blue; 1 blue, 7 red, 3 green; 13 blue, 4 green, 18 red
|
||||
Game 27: 9 blue, 5 red; 15 red, 12 blue, 3 green; 12 red, 12 blue, 1 green
|
||||
Game 28: 18 red, 4 green; 4 green, 6 red; 1 blue, 6 green, 19 red; 9 green, 17 red; 4 green, 5 blue, 18 red
|
||||
Game 29: 7 green, 6 red, 6 blue; 6 blue, 19 red, 4 green; 4 green, 4 blue, 13 red; 5 blue, 15 red, 10 green; 2 green, 6 blue, 5 red; 8 red, 10 green, 6 blue
|
||||
Game 30: 1 green, 13 red, 12 blue; 1 red, 2 blue; 11 blue, 1 red, 1 green
|
||||
Game 31: 8 green, 18 blue, 17 red; 4 red, 8 green, 6 blue; 9 blue, 7 green; 3 green, 1 blue, 12 red; 5 red, 10 blue, 11 green
|
||||
Game 32: 17 red, 17 green, 7 blue; 18 red, 16 green; 1 blue
|
||||
Game 33: 16 blue, 3 red; 9 blue, 1 red, 2 green; 3 green, 7 blue; 1 green, 4 red; 3 green, 1 red, 8 blue; 5 blue
|
||||
Game 34: 5 blue, 8 red, 1 green; 9 red, 10 blue, 7 green; 1 green, 14 blue; 8 blue, 4 red, 10 green; 15 blue, 8 green, 7 red; 2 red, 6 green, 3 blue
|
||||
Game 35: 13 red, 9 blue; 7 blue, 16 red, 10 green; 4 red, 6 blue; 3 blue, 12 green, 7 red; 8 blue, 6 red; 10 blue, 3 green, 2 red
|
||||
Game 36: 1 blue, 9 red, 2 green; 11 red, 3 blue, 2 green; 2 green, 6 red; 8 green, 11 red, 3 blue; 4 green, 7 blue, 11 red; 9 green, 8 red, 2 blue
|
||||
Game 37: 8 green, 3 blue, 4 red; 14 blue, 10 green, 3 red; 19 green, 2 blue, 7 red
|
||||
Game 38: 2 green, 3 red, 3 blue; 3 green, 9 red; 13 blue, 8 red; 6 red, 5 green, 13 blue
|
||||
Game 39: 8 red, 5 blue; 4 green, 5 blue, 3 red; 18 red, 2 green, 6 blue; 2 green, 5 blue, 17 red; 1 green, 2 red; 5 green, 6 blue
|
||||
Game 40: 12 red, 4 blue, 1 green; 11 green, 20 blue, 4 red; 10 blue, 4 red
|
||||
Game 41: 2 green, 2 blue; 2 red, 2 green; 2 green, 2 blue, 10 red
|
||||
Game 42: 6 green, 3 blue; 2 red, 2 green, 1 blue; 3 blue, 5 green, 6 red; 6 red; 1 blue, 6 green, 12 red
|
||||
Game 43: 1 blue, 4 green; 1 blue; 2 blue, 8 red, 2 green; 2 blue, 1 red, 4 green; 1 blue, 4 red, 4 green; 4 green, 7 red
|
||||
Game 44: 8 green, 9 red; 1 red, 2 blue, 13 green; 4 blue, 8 green, 17 red; 13 red, 13 green; 1 red, 9 green; 19 red, 3 green, 3 blue
|
||||
Game 45: 10 blue, 2 red, 1 green; 6 green, 5 red, 8 blue; 3 blue, 1 red; 4 green, 10 blue, 4 red
|
||||
Game 46: 3 red, 8 blue; 6 blue, 7 green, 6 red; 6 green, 1 blue, 7 red; 8 red, 1 green, 5 blue; 9 red, 12 blue, 10 green; 7 green, 5 red, 1 blue
|
||||
Game 47: 5 red; 2 blue, 2 green, 5 red; 3 green, 7 red; 14 red, 3 green, 2 blue
|
||||
Game 48: 7 blue, 12 green, 2 red; 11 green, 10 blue, 1 red; 1 red, 13 blue, 2 green; 14 green, 2 red, 9 blue; 2 red, 12 green, 3 blue; 2 red, 7 blue
|
||||
Game 49: 4 green, 5 blue; 9 blue; 10 blue, 5 green, 2 red; 10 blue, 2 red, 2 green; 1 red, 1 green, 4 blue; 2 blue
|
||||
Game 50: 2 red, 2 blue, 7 green; 7 red, 9 green, 3 blue; 5 red, 10 green
|
||||
Game 51: 15 red, 9 blue, 4 green; 5 red, 2 blue, 15 green; 4 blue, 3 green, 20 red; 12 green, 1 red, 10 blue; 10 green, 5 blue, 13 red; 9 red, 10 green, 11 blue
|
||||
Game 52: 3 blue, 12 green, 1 red; 6 green; 1 red, 8 green; 1 blue, 1 green, 1 red
|
||||
Game 53: 10 green, 7 red, 12 blue; 9 blue, 6 green, 2 red; 8 green, 5 blue, 5 red; 7 blue, 16 green, 11 red; 6 red, 8 blue, 13 green
|
||||
Game 54: 10 green, 6 blue, 3 red; 6 green, 2 red, 8 blue; 9 blue, 11 green, 2 red; 10 green, 1 blue, 3 red
|
||||
Game 55: 4 blue, 1 red; 3 red, 7 blue; 12 red, 4 green, 8 blue; 3 green, 5 blue, 1 red; 13 blue, 12 red, 1 green
|
||||
Game 56: 12 blue, 15 green; 1 green, 7 red, 11 blue; 5 green, 9 blue, 1 red; 8 red, 5 green, 6 blue
|
||||
Game 57: 4 green, 11 blue, 18 red; 14 blue, 14 red, 16 green; 7 red, 15 green, 3 blue; 18 red, 20 green, 8 blue; 12 blue, 9 red, 16 green
|
||||
Game 58: 10 blue, 9 green, 8 red; 13 green, 6 blue, 8 red; 8 green, 4 red; 4 blue, 1 red, 18 green; 7 red, 10 green, 10 blue; 15 blue, 10 green, 3 red
|
||||
Game 59: 17 green, 2 blue, 2 red; 2 blue, 1 red, 8 green; 14 green, 1 red, 1 blue; 15 green, 3 blue, 2 red; 2 blue, 8 green, 1 red; 1 blue, 1 red, 8 green
|
||||
Game 60: 1 green, 1 blue, 1 red; 4 blue, 3 red, 2 green; 13 green; 2 blue, 2 red, 8 green; 4 red, 12 green, 4 blue; 4 green, 4 blue, 4 red
|
||||
Game 61: 3 blue, 7 red; 5 blue, 8 red, 1 green; 1 blue, 8 red; 10 blue, 2 red, 1 green; 1 green, 5 blue, 2 red
|
||||
Game 62: 10 red, 2 green; 8 blue, 7 red, 2 green; 4 green, 2 blue, 10 red
|
||||
Game 63: 1 green, 3 blue, 5 red; 6 green, 5 blue, 2 red; 3 blue, 7 red
|
||||
Game 64: 6 red, 20 blue; 4 red, 3 blue, 2 green; 3 green, 19 blue, 6 red; 2 green, 6 blue, 3 red; 13 blue, 5 green, 5 red
|
||||
Game 65: 6 red, 9 blue, 20 green; 6 red, 16 green, 4 blue; 12 red, 6 green, 5 blue
|
||||
Game 66: 2 blue, 5 red, 4 green; 13 blue, 2 green; 1 green, 6 blue
|
||||
Game 67: 4 green, 5 blue, 2 red; 1 red, 14 blue, 6 green; 1 green, 14 red, 5 blue; 18 red, 16 blue; 15 blue, 8 red, 18 green; 1 green, 18 red, 6 blue
|
||||
Game 68: 1 blue, 9 red, 7 green; 7 red, 1 blue, 6 green; 5 green, 1 blue, 8 red
|
||||
Game 69: 12 green, 3 blue, 4 red; 9 green, 8 red, 7 blue; 4 blue, 5 red, 10 green; 4 red, 5 green, 7 blue; 9 green, 4 red, 2 blue; 3 green, 13 blue, 1 red
|
||||
Game 70: 9 red, 1 green, 8 blue; 11 green, 13 blue, 12 red; 3 blue, 5 green, 8 red; 1 red, 14 blue
|
||||
Game 71: 10 blue; 2 green, 8 blue, 9 red; 5 red, 1 blue
|
||||
Game 72: 3 green, 5 blue, 5 red; 1 blue, 1 red, 2 green; 4 red, 4 blue, 1 green; 5 blue, 4 red, 1 green; 6 blue, 3 green, 5 red; 5 blue, 1 red, 4 green
|
||||
Game 73: 3 red, 1 green, 1 blue; 7 green, 2 red, 1 blue; 2 green, 1 blue, 3 red; 1 red, 4 green, 1 blue; 3 red, 5 green
|
||||
Game 74: 5 blue, 1 red, 4 green; 3 red, 2 green; 4 red, 6 blue; 2 red, 2 blue; 1 green, 4 red, 8 blue; 5 blue, 4 red
|
||||
Game 75: 3 red, 5 blue, 3 green; 9 green, 6 blue, 7 red; 2 green, 3 red, 12 blue; 14 green, 4 blue, 10 red
|
||||
Game 76: 1 blue, 7 red, 1 green; 6 red, 1 blue, 2 green; 4 red, 2 green; 3 red, 1 blue; 16 red, 1 green
|
||||
Game 77: 3 red, 10 blue, 1 green; 4 red, 7 blue, 3 green; 7 blue, 6 green, 7 red; 5 green, 15 blue, 7 red; 12 green, 5 red
|
||||
Game 78: 6 red, 10 blue, 15 green; 6 green, 11 red, 4 blue; 6 blue, 8 red; 4 blue, 7 red, 2 green; 11 green, 7 red, 11 blue; 3 blue, 14 green, 6 red
|
||||
Game 79: 14 red, 6 green, 4 blue; 13 red, 6 blue; 6 red, 13 green, 4 blue
|
||||
Game 80: 8 red, 2 blue, 8 green; 6 red, 10 green, 4 blue; 3 red, 9 green; 2 green, 8 blue, 7 red; 7 blue, 3 red, 11 green; 1 red, 12 green, 8 blue
|
||||
Game 81: 9 red, 4 blue, 11 green; 1 blue, 4 red, 2 green; 5 red; 3 blue, 2 red, 2 green; 14 red, 12 green
|
||||
Game 82: 5 green; 2 blue; 2 red; 1 blue, 2 red, 11 green; 8 green, 2 red, 1 blue
|
||||
Game 83: 3 green, 7 red, 6 blue; 7 red, 7 green, 11 blue; 7 blue, 13 green, 7 red; 12 blue, 10 red, 2 green; 1 green, 11 red, 7 blue; 12 blue, 9 red, 9 green
|
||||
Game 84: 5 blue, 1 green; 16 green, 4 blue, 8 red; 7 red, 5 blue, 16 green
|
||||
Game 85: 9 green, 20 blue, 7 red; 19 blue, 14 red, 2 green; 10 green, 2 red, 10 blue
|
||||
Game 86: 1 green, 3 red, 5 blue; 9 red, 2 blue, 6 green; 8 green, 14 red, 3 blue; 18 green, 2 blue, 7 red; 2 blue, 10 red, 14 green; 17 green, 4 blue, 12 red
|
||||
Game 87: 4 green, 8 red, 13 blue; 7 red, 13 blue, 4 green; 1 green, 8 blue
|
||||
Game 88: 9 blue, 11 red; 5 green, 7 blue, 12 red; 10 red, 2 green, 1 blue; 2 blue, 5 red, 5 green; 7 red, 6 green, 9 blue; 1 green, 10 red, 5 blue
|
||||
Game 89: 7 red, 2 green, 1 blue; 1 blue, 2 green; 6 red, 1 green; 7 red, 1 blue; 3 green, 3 red
|
||||
Game 90: 8 blue, 2 red, 3 green; 9 green, 4 blue, 3 red; 7 green, 11 blue, 2 red; 13 green, 12 blue, 8 red; 10 blue, 2 green; 5 green, 1 red, 9 blue
|
||||
Game 91: 2 red, 2 green, 4 blue; 5 blue, 2 red, 16 green; 11 green; 3 blue, 2 red, 8 green; 4 green, 3 blue
|
||||
Game 92: 8 red, 12 blue, 3 green; 11 red, 10 blue, 6 green; 14 red, 8 green, 14 blue
|
||||
Game 93: 3 green, 2 red, 3 blue; 3 green, 3 red, 1 blue; 2 blue, 16 red, 3 green; 2 green; 5 green, 2 blue, 2 red
|
||||
Game 94: 5 red, 2 green; 9 red, 3 blue; 2 green, 2 blue, 5 red; 3 blue, 8 red, 2 green; 8 red, 1 blue, 1 green
|
||||
Game 95: 3 blue, 4 green, 7 red; 7 red, 1 green, 15 blue; 6 blue, 2 green, 7 red
|
||||
Game 96: 2 blue, 1 red, 6 green; 7 blue, 8 green; 1 red, 7 green; 2 green, 14 blue, 1 red; 3 blue, 1 red, 7 green; 4 blue, 11 green
|
||||
Game 97: 2 red, 9 blue, 8 green; 3 green, 5 blue; 6 green, 1 red, 9 blue; 2 red, 13 green, 1 blue; 2 green, 2 red, 2 blue
|
||||
Game 98: 2 blue, 1 green, 1 red; 4 blue, 5 red, 1 green; 4 blue, 3 red, 2 green
|
||||
Game 99: 17 red, 2 blue, 4 green; 4 green, 8 red, 6 blue; 5 red
|
||||
Game 100: 6 red, 4 green; 3 red, 2 blue, 9 green; 1 blue, 5 green, 14 red; 1 blue, 2 red, 2 green; 9 red, 1 blue, 14 green; 2 blue, 11 green, 8 red
|
38
2023/day-2/part-1.ts
Normal file
38
2023/day-2/part-1.ts
Normal file
@ -0,0 +1,38 @@
|
||||
// note: this runs using bun!
|
||||
const file = Bun.file('./input.txt')
|
||||
const text = await file.text()
|
||||
|
||||
const maxs = {
|
||||
'red': 12,
|
||||
'green': 13,
|
||||
'blue': 14,
|
||||
} as const
|
||||
|
||||
const res = text.split('\n').map((it) => {
|
||||
const [gameId, data] = it.split(':', 2)
|
||||
const id = gameId.split(' ')[1]
|
||||
return {
|
||||
id: parseInt(id),
|
||||
reveals: data.trim().split(';').map((game) => {
|
||||
return game
|
||||
.trim()
|
||||
.split(',')
|
||||
.map((balls) => {
|
||||
const r = balls
|
||||
.trim()
|
||||
.split(' ')
|
||||
return {cubes: parseInt(r[0]), color: r[1]}
|
||||
})
|
||||
})
|
||||
}
|
||||
}).filter((game) => {
|
||||
return !game.reveals.find((reveal) => {
|
||||
for (const color in maxs) {
|
||||
const max = maxs[color as 'red']
|
||||
if (reveal.find((v) => v.color === color && v.cubes > max)) {
|
||||
return true
|
||||
}
|
||||
}
|
||||
})
|
||||
}).reduce((p, c) => p + c.id, 0)
|
||||
console.log(res)
|
46
2023/day-2/part-2.ts
Normal file
46
2023/day-2/part-2.ts
Normal file
@ -0,0 +1,46 @@
|
||||
// note: this runs using bun!
|
||||
const file = Bun.file('./input.txt')
|
||||
const text = await file.text()
|
||||
|
||||
type Colors = 'red' | 'green' | 'blue'
|
||||
|
||||
const res = text.split('\n').map((it) => {
|
||||
const [gameId, data] = it.split(':', 2)
|
||||
const id = gameId.split(' ')[1]
|
||||
return {
|
||||
id: parseInt(id),
|
||||
reveals: data.trim().split(';').map((game) => {
|
||||
const res = game
|
||||
.trim()
|
||||
.split(',')
|
||||
.map((balls) => {
|
||||
const r = balls
|
||||
.trim()
|
||||
.split(' ')
|
||||
return {cubes: parseInt(r[0]), color: r[1]}
|
||||
})
|
||||
return {
|
||||
red: res.find((it) => it.color === 'red')?.cubes ?? 0,
|
||||
green: res.find((it) => it.color === 'green')?.cubes ?? 0,
|
||||
blue: res.find((it) => it.color === 'blue')?.cubes ?? 0,
|
||||
}
|
||||
})
|
||||
}
|
||||
}).map((game) => {
|
||||
let lowests: Record<Colors, number> = {
|
||||
red: 0,
|
||||
blue: 0,
|
||||
green: 0
|
||||
}
|
||||
for (const reveal of game.reveals) {
|
||||
for (const color of Object.keys(lowests) as Array<Colors>) {
|
||||
const lowest = lowests[color]
|
||||
if (reveal[color] > lowest) {
|
||||
lowests[color] = reveal[color]
|
||||
}
|
||||
}
|
||||
}
|
||||
return lowests
|
||||
}).reduce((p, c) => p + c.blue * c.green * c.red, 0)
|
||||
|
||||
console.log(res)
|
140
2023/day-3/input.txt
Normal file
140
2023/day-3/input.txt
Normal file
@ -0,0 +1,140 @@
|
||||
...317..........214.....................................751.................................630...479..205....41.993............416.........
|
||||
...*....813........%....572........%...629.154......518....*....365..................-.......*.......#.....................422...........661
|
||||
269.......*...58...........=......264.....*..........*......937.-...........235...303.........848..............195.....154*.........144.-...
|
||||
........476..@...162.855................$....288...821..............107.....-...........290......../..301.........=...........135..*........
|
||||
618.............=....*...547...........441....*........................@................*........851....+...................+..*...102.310..
|
||||
...*961....905......534..$...377...............854...341.342....485.......109....89.995..927..............................90..997......*....
|
||||
............*...................*.................../.....*......@...........%....*...*.......................+44.....913.........9.....891.
|
||||
....62......724...592....946.878...854....$.701............480......575.246....119.....54..296.906..684..................*.........*838.....
|
||||
.................+......*...............478....................469.....*..................*...........+..502..156.........821...........983.
|
||||
....................315.764..996..571...............=........................804.......&...892....958.....*......*.............61...........
|
||||
........+...697*.....+.........*...*...........@.448........................*.......322.............*....309..37.602.....775....*...........
|
||||
32.480..665.....557......+...435..449..691..327....................#....921..535..........755...43...597........................322..7......
|
||||
......*.....848.........745.............*.......679/............106.......&........404......+....*...................888..750........*......
|
||||
......93...*....=.............*297......550...........324.597............................................819.....997*......-...734$..588....
|
||||
.........363..112..754...............&..........723....................14..954.............175....773...*.............&.....................
|
||||
..................*.......#..........502......../...............606.........@..778*.......#.........*....844...713...743....-.........&.....
|
||||
............827.895.-539...469...938...../.248.....................*.49............749.............783.........$...+.........33....471......
|
||||
..............*.................../...517...&......368*710......432...*............................................841.=.................194
|
||||
.....*491....395.......&481.................../.#...................83................668..181.....698..155*...........981.200..............
|
||||
...................219.................196.473..224.....=.....733*.......=.........98*.......*.420..........671.....*......*......369.205...
|
||||
........@......696*....669.....50.....................853.593.........168....@.............802..*...388............3......792........*......
|
||||
......641............./....62..*...836#.......*169.........@...............872.................416....*.................-...................
|
||||
..........................#...377..........179.......101........+504.................*554.............947..............447.............830..
|
||||
243........*902.....#................480*...........+.....*258.........*243.......389.......&....................723.........838...991......
|
||||
........182.........33..........840......616.733.......756..........290.....................145..119..........................+......&......
|
||||
..............................................*....807...................777......+..556............@....85#................................
|
||||
.212.664..3......316..579..462..............435.......*............@....*........36...$........572................703..732........@.........
|
||||
...........=....@.....*.....*............*.......-..337......656...411.357.373.....................*21....37.........%./.....918...185.387..
|
||||
...350.................338...161.856..157.906...527...........*............+.........*336.......204............755.............*............
|
||||
....&...........683...................................801......313............831.230......374.......................383.....940.48.........
|
||||
...............*........447......635....335......%.........627........44@..........................895....................@.................
|
||||
....$....958..943.......#...935.%..........*...794......16.*..................+...........100..469........743.*.........529....=.......883..
|
||||
..308.....*........*776.......*.....*....430............*..562.......895......765.................*.........*..776..........246..921&.......
|
||||
.........200...............*..1....572................814...........$......#..........138...&....487..668..58.......485.....................
|
||||
...*845.............935...958.................................667.....%.121.......691.......245.........*..............*........131.........
|
||||
.........*............*.............=............................*.593.............*..................380........189...219.211......@.......
|
||||
.....152..783........634...........521.+.......26.............659...............328...%.............................*........$......397.*...
|
||||
......*.......124..........299..........808.....*........359................424.....%..454..........553.............49..562.....257......723
|
||||
......641.........24.............576.............975........=..............*.......974.............*...........146......*......../...@......
|
||||
940.........&....@....221........*.........149.......&...............689....418...........538...................*.....985............526....
|
||||
.............192.........*816...582...561..+..........915..981%.......*..................*......&8....+.........497..........145............
|
||||
.........144........$....................@......................425.933....846*824.$...370.342*....375...641..=........927.....*.......160..
|
||||
............$.......925...67.655....57.............=905..881....@..................585.........746.............224..........224...864...*...
|
||||
.....872................#..*...$.....*.........#............*...........979....699...................947.........................*.....788..
|
||||
............949......676..42........340.....694...144......712..296..45...*.......*..............191.@.......889-......=786.....417.........
|
||||
...........*.................846....................*..160.......*.......403.....347...914.91...=...........................................
|
||||
.371.=....904.643......816...*...647...$.858.......431..........486..........706......*....-..............961........................698....
|
||||
......398.....*....252*....591..../..224...$..341...........#................*................956............*...27..............57.....*534
|
||||
.............363...............................&.............69........163.233.580....113*367..............44...*..................*406.....
|
||||
...893..457..........91%........................................538.....$......*..............................475....864.......289..........
|
||||
..........-........................549............909..572.....-..............385.............97.....................=.....159..*...........
|
||||
...174...............................*...576.875....*.....=...................................*....506..115...............*....856....408...
|
||||
.....=.......685....58........177.965...-.....*....489......402/..&603.....................357......=..&....84.....451&.810........93...*...
|
||||
.....................*...87.........................................................447........@............*................-......*...117.
|
||||
......205.593........298..................................622....955.......34*325......*....965...................604......729....509.......
|
||||
........=..*.......+...............966.......................$.$...................206......................99....-....424..............$...
|
||||
378..........636..141.543%....34...........437-.................303.........80....*.............915...........*........*...885...........148
|
||||
............*................=......................39......-.......208.560*...906...................320.860.975....532....*.........740....
|
||||
....834...13...................426.395*962...44.......-......552...................*539.+........953.......%............647.........*.......
|
||||
..............589...............*..........................................179...71.....207........#.577......758...247..........958........
|
||||
....930.......*......&139...820.56.....%164....................536.=31......*.............................................89................
|
||||
.....#.........569............*.............882....296......&................465.......21............=.....331........998*..................
|
||||
..........847..............206....$............%.....#.464.318..=.....751*........................501..971...*..............227.......854...
|
||||
.466......*......768..../.......110......................*.......612......551......868.......727.......*......39.850..-.....*.........*.....
|
||||
.........377.561....&.718...94............246..........159...........255............%.........*...........445........472...520.......304.472
|
||||
...............*..........................@.....292.............................476......&.........135......*...223.........................
|
||||
..............288.....................944........*......775*934................+......152.............*55..806............239#..............
|
||||
...181*552...............................*....238...............499...880.476...................................417.#66.........472.........
|
||||
.....................*........%...629.853............*......@9...@......=.....443...673........271...*..........-...........98..............
|
||||
.........567*288...10.257..837......*.........862..14................21......*...................%..714...........963.........%.450....528..
|
||||
....................................862..................889.....604...*424..350...812..34........................*...646...................
|
||||
...............*....*933.....355@..................*528....=......................+.....*...&996..493.....992..840.......*..271.............
|
||||
..............984...............................678.................+571.....648......262............*......*..............*......293..197..
|
||||
..........386..............463..984......129................-588..............*..361...............408..269.652...........406........*..+...
|
||||
.........*............494....*.......847...*..#..942..825.............&......32.........................*........427...........-....339.....
|
||||
.......415.=434..439.....*..23........$..34..410.........+.......746.976.............731..../.1*.........709.......*.........197........#...
|
||||
................*......493.......760.............................................654*....398.........158....../......396.............922....
|
||||
.....845.=....955...................*.....*574....954*........@...........$.......................-....*.....796......-...426...$732........
|
||||
.......*.88.............@.........738..924............213...40....115......315...................299...108...................*.......320....
|
||||
....567...............%..13.................*14...........$.......@.....%.........../...518.......................-.810...514..952..........
|
||||
........892...275....485.......820.......367.......@.....544...........428.........54..-.............*....108..964...*..........*...........
|
||||
.......@...................861......#.........893.116.........836.982......961.............../...615.188.....*.....914.........761....765...
|
||||
...........169.962.........*......81...769...#...............................-..714.424..759.390...@.........855...........562.........*....
|
||||
....../906......../......81..968.......-..............................185..............*.%............=......................*.205.....72...
|
||||
................*............*....110........./.907....241.......708...*...383.701..869...............346..............649.771.#............
|
||||
.............531.976...670...288...........382....*.......*116.........820.-...*............764..556...........@..984....$.......638...165..
|
||||
........................-..........479.............55..........................515.....345...#................533...*.......................
|
||||
.....$....569.936.301.........914..*.......-.....=................453..............209..*..........................551.-.......479..........
|
||||
..233.....*......*.....506.........931..246....221.639....#..................@......*....784........591.................818...%.......523...
|
||||
.......233....%.........................................416...714&........448.......698......387........432............................*....
|
||||
...........718.......@......465....................430........................603.......491..*..........*...22.164...+...............179....
|
||||
...............450.462.549.=....283.185...880......................652.......................142..430.372.....*.......633...................
|
||||
.370....143....*.........*.........*......*.....962...........*.....*....................537........%...........&136........................
|
||||
.....39.......956......213...........476.143.......*.......321.60....708..........966.......#...921......+146............+...665............
|
||||
...........................941...321*.............880.499...........................*.............*.383........668.....212...*....827*428...
|
||||
..236..527...................=..........................*........../..854......................489...-........................234...........
|
||||
.....*.................................622..........289..599....207...*............&953.599=...............885............682.....914.....12
|
||||
793...754.............$497..............*............*................163....................+.........15.....*..*....338*..................
|
||||
...*.......864................348..........758.......439...................1........83....748...............325.535...................=.....
|
||||
...368....*........382*250....*.....317.......*................473*....877.+.........*..................@................%....331..513......
|
||||
.........55..239...........2...377...=......1.792...294*607........831..........*.950...&....-....#....864.....139.......512................
|
||||
....427.......*...*...#....%...........765...............................418.995.........6..492.465...........@....................*218.....
|
||||
......*......939.410.371......#...-......#.................&............*.............................496..........503..........629.........
|
||||
.....410....................215.193.................678.786.....370...71..598......329..........262.................*.......473.............
|
||||
.........979..855..432=................212.....346..*....................*........*............#...................249...=.....+...525.217..
|
||||
.........*....*...............387.....*...........*.228......./....%....245..&.....690.....429............................685.........*.....
|
||||
129....907.423........949.772......666....173..679........992.313...398......427..............*...................244.......................
|
||||
.........................*.....*............................*........................../....998..........510..825*..........................
|
||||
.....132....867........%.....42.780..............776*744...898.......664....196....360..823......899.211..=.................+...............
|
||||
.....*.......%......703................916...%...............................*....*................*....&.....689..$......591.......64*238..
|
||||
...684..160.......................445.....*...164.......602....249...........431.12.............=..758............138..........983..........
|
||||
..........@..766.92..............*......334........671..*...............&646..................797.............950.........935.........469...
|
||||
................*..................510..............*..285..........................................650.......*....807...*............#.....
|
||||
..205.669...768...88........................+59..148............682........#.................3..............376...*.......191...............
|
||||
.........&....*..%........................................183......*......61................/........657..........163............255........
|
||||
..674.......46..............392..251....507.................*.248...74..........+...775.97.....222.........%..........135...950.....*.......
|
||||
....*...........*967..533...*............*......949..245.276...#.........*.....728...................677..137.....*.....*..&........522.....
|
||||
...367.......196.......$..239..........510.748..*............/...481..722....................800........*........735..268...................
|
||||
.........442...................111...............752........567...*.........*..........696..%............790................................
|
||||
.............182....677..613............................/..........814...372.86........*......915*..............799.................*....253
|
||||
....&....739*........../....*206.........284...........584...427................727..485..........781.992.........-...............619.......
|
||||
.....603.........................907........*....607......../.............................617............*...=.......986-.............918...
|
||||
.........819..667..341...........*....#..397................................#........$..................822...20...........359.....43.......
|
||||
.......&....*...#....*.......*....88.691.........................700.675....910...227........350...&591............301.......$.......*......
|
||||
..404$..259.......557....876.218...........216.=211.7...=569........*........................=.................320..*....462...480....747...
|
||||
..........................+.............#..*........*.................=518........................274............@...276........../.........
|
||||
.......#...904......622..............923....543....969../..................571..778......#888.253..................+.....163.........-679...
|
||||
295.207.........708......................................942...496....#...*.......*.373@.......*..645...............580.......177...........
|
||||
................................982*317............304........*.......28.823....994.......370..96........@.=...*675............*.....604....
|
||||
644.138.522......%......901.................374*..*.........458.....................#135....=..........730.355........955...=.47.277*.......
|
||||
...*....*.........288..*.............+.433.........240.................317/........................609............#90.*...623...............
|
||||
.....%..675....87.......110...126.408..*......355.............................@131......110....778...*..519.834.......537.....19........502.
|
||||
..831............*460........*..........824.....*..751...467.829..........850..........*............365....*................................
|
||||
..........398..............473....-..........751.....*......*................@.446*....780...........................732....................
|
||||
.......................#.........333..................170........596...............943......66..186......@...........@.....=................
|
||||
......124....780.....58.....933........926.../.............693...*..........*828...............*........666.............=..337..............
|
||||
.......*.........197..........$.......*......67............-...335...........................122...582................197..........328......
|
||||
.....151...............................763......180....@............890../....835...578..871..........*295..#....%...........-541.$.........
|
||||
........................153.........-........@.....*...661..*833......*.775.....-...........................40....665...............701.....
|
||||
..890....252......................544........809..425..............925......................................................................
|
72
2023/day-3/part-1.ts
Normal file
72
2023/day-3/part-1.ts
Normal file
@ -0,0 +1,72 @@
|
||||
// note: this runs using bun!
|
||||
const file = Bun.file('./input.txt')
|
||||
const text = await file.text()
|
||||
|
||||
const rowLength = text.indexOf('\n')
|
||||
const rows = text.split('\n')// .slice(1, 3)
|
||||
const rowCount = rows.length
|
||||
const matrix = rows.map((it) => it.split(''))
|
||||
const numbers = '0123456789'
|
||||
|
||||
function cellHasSymbol(rowIdx: number, colIdx: number) {
|
||||
const char = matrix[rowIdx][colIdx]
|
||||
return char !== '.' && !numbers.includes(char)
|
||||
}
|
||||
|
||||
function numberHasSymbol(rowIdx: number, colIdxStart: number, colIdxEnd: number) {
|
||||
console.log(rowIdx, colIdxStart, colIdxEnd)
|
||||
const min = Math.max(0, colIdxStart - 1)
|
||||
const max = Math.min(rowLength, colIdxEnd + 2)
|
||||
for (let colIdx = min; colIdx < max; colIdx++) {
|
||||
if (rowIdx > 0) {
|
||||
console.log(cellHasSymbol(rowIdx - 1, colIdx), rowIdx - 1, colIdx)
|
||||
if (cellHasSymbol(rowIdx - 1, colIdx)) {
|
||||
return true
|
||||
}
|
||||
}
|
||||
console.log(cellHasSymbol(rowIdx, colIdx), rowIdx, colIdx)
|
||||
if (cellHasSymbol(rowIdx, colIdx)) {
|
||||
return true
|
||||
}
|
||||
if (rowIdx < rowCount - 1) {
|
||||
console.log(cellHasSymbol(rowIdx + 1, colIdx), rowIdx + 1, colIdx)
|
||||
if (cellHasSymbol(rowIdx + 1, colIdx)) {
|
||||
return true
|
||||
}
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
let numbersWithPart: Array<number> = []
|
||||
for (let rowIdx = 0; rowIdx < matrix.length; rowIdx++) {
|
||||
const row = matrix[rowIdx]
|
||||
let startIdx = -1
|
||||
let num = ''
|
||||
for (let colIdx = 0; colIdx < row.length; colIdx++) {
|
||||
const col = row[colIdx]
|
||||
if (numbers.includes(col) && startIdx === -1) {
|
||||
startIdx = colIdx
|
||||
num += col
|
||||
} else if (numbers.includes(col)) {
|
||||
num += col
|
||||
} else if (!numbers.includes(col) && startIdx > -1) {
|
||||
console.log(num)
|
||||
if (numberHasSymbol(rowIdx, startIdx, colIdx - 1)) {
|
||||
numbersWithPart.push(parseInt(num))
|
||||
}
|
||||
startIdx = -1
|
||||
num = ''
|
||||
}
|
||||
}
|
||||
if (startIdx > -1) {
|
||||
if (numberHasSymbol(rowIdx, startIdx, row.length - 1)) {
|
||||
console.log(num)
|
||||
numbersWithPart.push(parseInt(num))
|
||||
}
|
||||
}
|
||||
}
|
||||
console.log(numbersWithPart, numbersWithPart.reduce((p, c) => p + c, 0))
|
||||
|
||||
// too low: 514045
|
||||
// too high: 516111
|
83
2023/day-3/part-2.ts
Normal file
83
2023/day-3/part-2.ts
Normal file
@ -0,0 +1,83 @@
|
||||
// note: this runs using bun!
|
||||
const file = Bun.file('./input.txt')
|
||||
const text = await file.text()
|
||||
|
||||
const rowLength = text.indexOf('\n')
|
||||
const rows = text.split('\n')// .slice(1, 3)
|
||||
const rowCount = rows.length
|
||||
const matrix = rows.map((it) => it.split(''))
|
||||
const numbers = '0123456789'
|
||||
|
||||
function cellIsGear(rowIdx: number, colIdx: number) {
|
||||
return matrix[rowIdx][colIdx] === '*'
|
||||
}
|
||||
|
||||
function numberHasGear(rowIdx: number, colIdxStart: number, colIdxEnd: number) {
|
||||
console.log(rowIdx, colIdxStart, colIdxEnd)
|
||||
const min = Math.max(0, colIdxStart - 1)
|
||||
const max = Math.min(rowLength, colIdxEnd + 2)
|
||||
for (let colIdx = min; colIdx < max; colIdx++) {
|
||||
if (rowIdx > 0) {
|
||||
console.log(cellIsGear(rowIdx - 1, colIdx), rowIdx - 1, colIdx)
|
||||
if (cellIsGear(rowIdx - 1, colIdx)) {
|
||||
return [rowIdx - 1, colIdx]
|
||||
}
|
||||
}
|
||||
console.log(cellIsGear(rowIdx, colIdx), rowIdx, colIdx)
|
||||
if (cellIsGear(rowIdx, colIdx)) {
|
||||
return [rowIdx, colIdx]
|
||||
}
|
||||
if (rowIdx < rowCount - 1) {
|
||||
console.log(cellIsGear(rowIdx + 1, colIdx), rowIdx + 1, colIdx)
|
||||
if (cellIsGear(rowIdx + 1, colIdx)) {
|
||||
return [rowIdx + 1, colIdx]
|
||||
}
|
||||
}
|
||||
}
|
||||
return undefined
|
||||
}
|
||||
|
||||
let gears: Record<`${number}-${number}`, Array<number>> = {}
|
||||
|
||||
let numbersWithPart: Array<number> = []
|
||||
for (let rowIdx = 0; rowIdx < matrix.length; rowIdx++) {
|
||||
const row = matrix[rowIdx]
|
||||
let startIdx = -1
|
||||
let num = ''
|
||||
for (let colIdx = 0; colIdx < row.length; colIdx++) {
|
||||
const col = row[colIdx]
|
||||
if (numbers.includes(col) && startIdx === -1) {
|
||||
startIdx = colIdx
|
||||
num += col
|
||||
} else if (numbers.includes(col)) {
|
||||
num += col
|
||||
} else if (!numbers.includes(col) && startIdx > -1) {
|
||||
const gearIdx = numberHasGear(rowIdx, startIdx, colIdx - 1)
|
||||
if (gearIdx) {
|
||||
let gear = gears[gearIdx.join('-') as '1-1']
|
||||
if (!gear) {
|
||||
gear = []
|
||||
}
|
||||
gear.push(parseInt(num))
|
||||
gears[gearIdx.join('-') as '1-1'] = gear
|
||||
}
|
||||
num = ''
|
||||
startIdx = -1
|
||||
}
|
||||
}
|
||||
if (startIdx > -1) {
|
||||
const gearIdx = numberHasGear(rowIdx, startIdx, row.length - 1)
|
||||
if (gearIdx) {
|
||||
let gear = gears[gearIdx.join('-') as '1-1']
|
||||
if (!gear) {
|
||||
gear = []
|
||||
}
|
||||
gear.push(parseInt(num))
|
||||
gears[gearIdx.join('-') as '1-1'] = gear
|
||||
}
|
||||
}
|
||||
}
|
||||
console.log(gears, Object.values(gears).filter((it) => it.length === 2).reduce((p, c) => p + c.reduce((pp, cc) => pp * cc, 1), 0))
|
||||
|
||||
// too low:
|
||||
// too high:
|
Loading…
x
Reference in New Issue
Block a user