Compare commits

...

2 Commits

Author SHA1 Message Date
95981a219a
day 3 puzzle 2 2024-12-03 10:53:57 +01:00
a8611658a2
day 3 puzzle 1 2024-12-03 10:44:58 +01:00
8 changed files with 64 additions and 4 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 89 KiB

After

Width:  |  Height:  |  Size: 90 KiB

View File

@ -1,4 +1,6 @@
1:
stars: 2
2:
stars: 2
3:
stars: 2

1
res/examples/day3_1.txt Normal file
View File

@ -0,0 +1 @@
xmul(2,4)%&mul[3,7]!@^do_not_mul(5,5)+mul(32,64]then(mul(11,8)mul(8,5))

1
res/examples/day3_2.txt Normal file
View File

@ -0,0 +1 @@
xmul(2,4)&mul[3,7]!^don't()_mul(5,5)+mul(32,64](mul(11,8)undo()?mul(8,5))

16
src/day3/puzzle1.typ Normal file
View File

@ -0,0 +1,16 @@
#import "/src/utils.typ": *
#let solve(input) = {
let matches = input.matches(regex("mul\((\d{1,3}),(\d{1,3})\)"))
let total = matches.map(m => {
m.captures.map(int)
.product()
}).sum()
return total
}
#show-puzzle(
3, 1,
solve,
example: ("1": 161)
)

31
src/day3/puzzle2.typ Normal file
View File

@ -0,0 +1,31 @@
#import "/src/utils.typ": *
#let solve(input) = {
let dos = input.matches(regex("do\(\)"))
let donts = input.matches(regex("don't\(\)"))
let toggles = dos.map(m => (m.end, true))
toggles += donts.map(m => (m.end, false))
toggles = toggles.sorted(key: t => t.first())
let is-enabled(i) = {
let t = toggles.rev().find(t => t.first() <= i)
return t == none or t.last()
}
let matches = input.matches(regex("mul\((\d{1,3}),(\d{1,3})\)"))
let total = matches.map(m => {
if is-enabled(m.start) {
m.captures.map(int)
.product()
} else {
0
}
}).sum()
return total
}
#show-puzzle(
3, 2,
solve,
example: ("2": 48)
)

Binary file not shown.

View File

@ -67,7 +67,14 @@
)
}
#let show-puzzle(day, puzzle, func, example: none, visualize: none) = {
#let show-puzzle(
day,
puzzle,
func,
example: none,
visualize: none,
only-example: false
) = {
let check-example = check-example.with(visualize: visualize)
if example != none {
if type(example) == dictionary {
@ -80,9 +87,11 @@
linebreak()
}
let input = get-input(day)
let result = (func)(input)
show-result(result)
if not only-example {
let input = get-input(day)
let result = (func)(input)
show-result(result)
}
}
#let day-template(day, puzzle1, puzzle2, stars: 0) = {