Skip to content

Commit e9a5719

Browse files
committed
feat(2024/19): day 19
1 parent 33b217f commit e9a5719

File tree

2 files changed

+42
-0
lines changed

2 files changed

+42
-0
lines changed

2024/day19.scala

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package `2024`.day19
2+
3+
import scala.collection.concurrent.TrieMap
4+
import prelude.*
5+
6+
case class Towel(val designs: Set[String]):
7+
def combos(towel: String): Long =
8+
val memo = TrieMap[String, Long]("" -> 1)
9+
10+
def go(cur: String): Long = memo.getOrElseUpdate(
11+
cur,
12+
designs.view.filter(cur.startsWith).sumBy { p => go(cur.drop(p.size)) },
13+
)
14+
go(towel)
15+
16+
@main def main =
17+
val input = fromFile(".cache/2024/19.txt").getLines
18+
val (towel, cases) = input.splitAt(2) |> ((a, b) =>
19+
(a.mkString.split(",").map(_.trim).toSet |> Towel.apply, b.toVector)
20+
)
21+
val result = cases.map(towel.combos)
22+
println(s"part1: ${result.count(_ > 0)}")
23+
println(s"part2: ${result.sum}")

2024/day19.test.scala

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package `2024`.day19
2+
3+
import munit.FunSuite
4+
5+
class Test extends FunSuite:
6+
test("example"):
7+
val towel = Towel(Set("r", "wr", "b", "g", "bwu", "rb", "gb", "br"))
8+
9+
val cases = Map[String, Long](
10+
"brwrr" -> 2,
11+
"bggr" -> 1,
12+
"gbbr" -> 4,
13+
"rrbgbr" -> 6,
14+
"ubwu" -> 0,
15+
"bwurrg" -> 1,
16+
"brgr" -> 2,
17+
"bbrgwb" -> 0,
18+
)
19+
cases.foreach((a, b) => assertEquals(towel.combos(a), b))

0 commit comments

Comments
 (0)