Skip to content

Commit b3d4b65

Browse files
committed
Day 5: part 1 cleanup
1 parent 42df628 commit b3d4b65

File tree

2 files changed

+42
-24
lines changed

2 files changed

+42
-24
lines changed

src/main/scala/Day05.scala

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import cats.syntax.all.*
55

66
object Day05:
77

8-
case class Page(n: Int)
8+
case class Page(n: Int) derives Eq
99

1010
object Page:
1111
def parse(s: String): Option[Page] = s.toIntOption.map(Page.apply)
@@ -38,9 +38,13 @@ object Day05:
3838
as.reverse.foldLeft(List(List.empty[A]))((l, a) => if a == sep then List.empty :: l else (a :: l.head) :: l.tail)
3939

4040
case class Input(rules: NonEmptyList[OrderRule], updates: NonEmptyList[Update]):
41+
42+
def filteredRules(update: Update): List[OrderRule] =
43+
rules.filter(r => update.pages.contains_(r.before) && update.pages.contains_(r.after))
44+
4145
def correctlyOrderedUpdatesMiddlePageSum: Int =
4246
updates
43-
.collect(u => u.firstViolatedOrderRules(rules) match { case None => u })
47+
.collect(u => filteredRules(u).toNel.flatMap(u.firstViolatedOrderRules) match { case None => u })
4448
.foldMap(_.middlePage.n)
4549

4650
object Input:

src/test/scala/Day05Suite.scala

Lines changed: 36 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -46,49 +46,63 @@ class Day05Suite extends ScalaCheckSuite:
4646
Page(1)
4747
)
4848

49-
test("first violated order rule for small input's first update is None"):
49+
test("first violated order rule for small input's 1st update is None"):
5050
assertEquals(
51-
Input.parse(smallInput).flatMap(input => input.updates.head.firstViolatedOrderRules(input.rules)),
51+
for {
52+
input <- Input.parse(smallInput)
53+
firstPage = input.updates.head
54+
orderRule <- firstPage.firstViolatedOrderRules(input.rules)
55+
} yield orderRule,
5256
None
5357
)
5458

55-
test("first violated order rule for small input's second update is None"):
59+
test("first violated order rule for small input's 2nd update is None"):
5660
assertEquals(
57-
Input
58-
.parse(smallInput)
59-
.flatMap(input => input.updates.toNev.get(1).flatMap(_.firstViolatedOrderRules(input.rules))),
61+
for {
62+
input <- Input.parse(smallInput)
63+
secondPage <- input.updates.toNev.get(1)
64+
orderRule <- secondPage.firstViolatedOrderRules(input.rules)
65+
} yield orderRule,
6066
None
6167
)
6268

63-
test("first violated order rule for small input's third update is None"):
69+
test("first violated order rule for small input's 3rd update is None"):
6470
assertEquals(
65-
Input
66-
.parse(smallInput)
67-
.flatMap(input => input.updates.toNev.get(2).flatMap(_.firstViolatedOrderRules(input.rules))),
71+
for {
72+
input <- Input.parse(smallInput)
73+
thirdPage <- input.updates.toNev.get(2)
74+
orderRule <- thirdPage.firstViolatedOrderRules(input.rules)
75+
} yield orderRule,
6876
None
6977
)
7078

71-
test("first violated order rule for small input's fourth update is 97|75"):
79+
test("first violated order rule for small input's 4th update is 97|75"):
7280
assertEquals(
73-
Input
74-
.parse(smallInput)
75-
.flatMap(input => input.updates.toNev.get(3).flatMap(_.firstViolatedOrderRules(input.rules))),
81+
for {
82+
input <- Input.parse(smallInput)
83+
fourthPage <- input.updates.toNev.get(3)
84+
orderRule <- fourthPage.firstViolatedOrderRules(input.rules)
85+
} yield orderRule,
7686
OrderRule(before = Page(97), after = Page(75)).some
7787
)
7888

79-
test("first violated order rule for small input's fifth update is 29|13"):
89+
test("first violated order rule for small input's 5th update is 29|13"):
8090
assertEquals(
81-
Input
82-
.parse(smallInput)
83-
.flatMap(input => input.updates.toNev.get(4).flatMap(_.firstViolatedOrderRules(input.rules))),
91+
for {
92+
input <- Input.parse(smallInput)
93+
fifthPage <- input.updates.toNev.get(4)
94+
orderRule <- fifthPage.firstViolatedOrderRules(input.rules)
95+
} yield orderRule,
8496
OrderRule(before = Page(29), after = Page(13)).some
8597
)
8698

87-
test("first violated order rule for small input's sixth update is 75|13"):
99+
test("first violated order rule for small input's 6th update is 75|13"):
88100
assertEquals(
89-
Input
90-
.parse(smallInput)
91-
.flatMap(input => input.updates.toNev.get(5).flatMap(_.firstViolatedOrderRules(input.rules))),
101+
for {
102+
input <- Input.parse(smallInput)
103+
sixthPage <- input.updates.toNev.get(5)
104+
orderRule <- sixthPage.firstViolatedOrderRules(input.rules)
105+
} yield orderRule,
92106
OrderRule(before = Page(75), after = Page(13)).some
93107
)
94108

0 commit comments

Comments
 (0)