11import cats .Eq
2- import cats .data .NonEmptyList
2+ import cats .data .{ NonEmptyList , NonEmptyVector }
33import cats .derived .*
44import cats .syntax .all .*
5+ import scala .annotation .tailrec
56
67object Day05 :
78
@@ -21,6 +22,10 @@ object Day05:
2122
2223 case class Update (pages : NonEmptyList [Page ]):
2324
25+ val toNev : NonEmptyVector [Page ] = pages.toNev
26+
27+ val toNevWithIndex : NonEmptyVector [(Page , Int )] = toNev.zipWithIndex
28+
2429 def allOrderRules : List [OrderRule ] = pages.toList.zip(pages.tail).map(OrderRule .apply)
2530
2631 def middlePage : Page =
@@ -30,6 +35,18 @@ object Day05:
3035 def firstViolatedOrderRules (rules : NonEmptyList [OrderRule ]): Option [OrderRule ] =
3136 allOrderRules.map(_.reverse).find(rules.contains_)
3237
38+ def swap (p1 : Page , p2 : Page ): Update =
39+ (toNevWithIndex.find(_._1 == p1), toNevWithIndex.find(_._1 == p2)).tupled.fold(ifEmpty = this ) {
40+ case ((_, i1), (_, i2)) => Update (pages = toNev.updatedUnsafe(i1, p2).updatedUnsafe(i2, p1).toNonEmptyList)
41+ }
42+
43+ @ tailrec
44+ final def fixed (rules : NonEmptyList [OrderRule ]): Update =
45+ firstViolatedOrderRules(rules) match {
46+ case Some (r) => swap(r.before, r.after).fixed(rules)
47+ case None => this
48+ }
49+
3350 object Update :
3451 def parse (s : String ): Option [Update ] = s.split(',' ).toList.toNel.flatMap(_.traverse(Page .parse).map(Update .apply))
3552
@@ -47,6 +64,14 @@ object Day05:
4764 .collect(u => filteredRules(u).toNel.flatMap(u.firstViolatedOrderRules) match { case None => u })
4865 .foldMap(_.middlePage.n)
4966
67+ def fixedIncorrectlyOrderedUpdatesMiddlePageSum : Int =
68+ updates.collect { u =>
69+ filteredRules(u).toNel.flatMap(rs => u.firstViolatedOrderRules(rs).map((rs, _))) match {
70+ case Some ((rulesForUpdate, _)) => (u, rulesForUpdate)
71+ }
72+ }.map((u, rulesForUpdate) => u.fixed(rulesForUpdate))
73+ .foldMap(_.middlePage.n)
74+
5075 object Input :
5176 def parse (rows : List [String ]): Option [Input ] =
5277 rows.splitBySeparator(" " ) match {
0 commit comments