Compare commits

...

2 Commits

Author SHA1 Message Date
0950e76d8d
day 19 puzzle 2 2024-12-20 09:53:58 +01:00
5921a90c73
day 19 puzzle 1 2024-12-19 18:26:07 +01:00
6 changed files with 99 additions and 0 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 128 KiB

After

Width:  |  Height:  |  Size: 129 KiB

View File

@ -33,4 +33,6 @@
17: 17:
stars: 1 stars: 1
18: 18:
stars: 2
19:
stars: 2 stars: 2

10
res/examples/day19.txt Normal file
View File

@ -0,0 +1,10 @@
r, wr, b, g, bwu, rb, gb, br
brwrr
bggr
gbbr
rrbgbr
ubwu
bwurrg
brgr
bbrgwb

41
src/day19/puzzle1.typ Normal file
View File

@ -0,0 +1,41 @@
#import "/src/utils.typ": *
#let is-possible(target, towels: none) = {
if towels == none {
panic()
}
for towel in towels {
if towel == target {
return true
}
if target.starts-with(towel) {
if is-possible(target.slice(towel.len()), towels: towels) {
return true
}
}
}
return false
}
#let solve(input) = {
let (towels, targets) = input.split("\n\n")
towels = towels.split(", ")
let is-possible = is-possible.with(towels: towels)
let total = 0
for target in targets.split("\n") {
if is-possible(target) {
total += 1
}
}
return total
}
#show-puzzle(
19, 1,
solve,
example: 6
)

46
src/day19/puzzle2.typ Normal file
View File

@ -0,0 +1,46 @@
#import "/src/utils.typ": *
#let solve(input) = {
let (towels, targets) = input.split("\n\n")
towels = towels.split(", ")
let by-initial = (:)
for towel in towels {
let initial = towel.first()
if initial not in by-initial {
by-initial.insert(initial, ())
}
by-initial.at(initial).push(towel)
}
let count(target) = {
let initial = target.first()
if initial not in by-initial {
return 0
}
let cnt = 0
for towel in by-initial.at(initial) {
if towel == target {
cnt += 1
} else if target.starts-with(towel) {
cnt += count(target.slice(towel.len()))
}
}
return cnt
}
let total = 0
for target in targets.split("\n") {
total += count(target)
}
return total
}
#show-puzzle(
19, 2,
solve,
example: 16,
only-example: true
)
#show-result(632423618484345)

Binary file not shown.