10000 Solve 2020 day 21 part 2 · sim642/adventofcode@c142072 · GitHub
[go: up one dir, main page]

Skip to content

Commit c142072

Browse files
committed
Solve 2020 day 21 part 2
1 parent 0221daf commit c142072

File tree

2 files changed

+41
-0
lines changed

2 files changed

+41
-0
lines changed

src/main/scala/eu/sim642/adventofcode2020/Day21.scala

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package eu.sim642.adventofcode2020
22

3+
import eu.sim642.adventofcodelib.IteratorImplicits._
4+
35
object Day21 {
46

57
case class Food(ingredients: Set[String], allergens: Set[String])
@@ -26,6 +28,36 @@ object Day21 {
2628
.sum
2729
}
2830

31+
def solveAllergenIngredients(foods: Seq[Food]): Map[String, String] = {
32+
33+
def helper(allergenIngredients: Map[String, Set[String]]): Iterator[Map[String, String]] = {
34+
if (allergenIngredients.isEmpty)
35+
Iterator(Map.empty)
36+
else {
37+
val (allergen, ingredients) = allergenIngredients.head
38+
val newAllergenIngredients = allergenIngredients - allergen
39+
for {
40+
ingredient <- ingredients.iterator
41+
newAllergenIngredients2 = newAllergenIngredients.view.mapValues(_ - ingredient).toMap
42+
rest <- helper(newAllergenIngredients2)
43+
} yield rest + (allergen -> ingredient)
44+
}
45+
}
46+
47+
val allergenIngredients = findAllergenIngredients(foods)
48+
helper(allergenIngredients).head
49+
}
50+
51+
def canonicalBadIngredients(foods: Seq[Food]): String = {
52+
val allergenIngredients = solveAllergenIngredients(foods)
53+
54+
allergenIngredients
55+
.toSeq
56+
.sortBy(_._1)
57+
.map(_._2)
58+
.mkString(",")
59+
}
60+
2961

3062
private val foodRegex = """(.*) \(contains (.*)\)""".r
3163

@@ -43,5 +75,6 @@ object Day21 {
4375

4476
def main(args: Array[String]): Unit = {
4577
println(countGoodIngredients(parseFoods(input)))
78+
println(canonicalBadIngredients(parseFoods(input)))
4679
}
4780
}

src/test/scala/eu/sim642/adventofcode2020/Day21Test.scala

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,4 +18,12 @@ class Day21Test extends AnyFunSuite {
1818
test("Part 1 input answer") {
1919
assert(countGoodIngredients(parseFoods(input)) == 2170)
2020
}
21+
22+
test("Part 2 examples") {
23+
assert(canonicalBadIngredients(parseFoods(exampleInput)) == "mxmxvkd,sqjhc,fvjkl")
24+
}
25+
26+
test("Part 2 input answer") {
27+
assert(canonicalBadIngredients(parseFoods(input)) == "nfnfk,nbgklf,clvr,fttbhdr,qjxxpr,hdsm,sjhds,xchzh")
28+
}
2129
}

0 commit comments

Comments
 (0)
0