diff --git a/Day7.scala b/Day7.scala index 8d2ab0a..3d0c2e7 100644 --- a/Day7.scala +++ b/Day7.scala @@ -15,25 +15,14 @@ enum DeckKind: object DeckKind: def apply(deck: String) = - val ranks = deck.sorted.toArray - if ranks(0) == ranks(4) then Five - else if ranks(0) == ranks(3) || ranks(1) == ranks(4) then Four - else if ranks(0) == ranks(2) && ranks(3) == ranks(4) || ranks(0) == ranks( - 1 - ) && ranks(2) == ranks(4) - then House - else if ranks(0) == ranks(1) && ranks(2) == ranks(3) || ranks(0) == ranks( - 1 - ) && ranks(3) == ranks(4) || ranks(1) == ranks(2) && ranks(3) == ranks(4) - then Pairs - else - lazy val three = (0 until ranks.length - 2) - .find(i => ranks(i) == ranks(i + 2)) - .map(i => Three) - lazy val pair = (0 until ranks.length - 1) - .find(i => ranks(i) == ranks(i + 1)) - .map(i => Pair) - three.orElse(pair).getOrElse(High) + val counts = + deck.iterator.toSeq.groupBy(identity).values.map(_.length).toSeq + if counts.contains(5) then Five + else if counts.contains(4) then Four + else if counts.contains(3) then if counts.contains(2) then House else Three + else if counts.count(_ == 2) == 2 then Pairs + else if counts.contains(2) then Pair + else High import DeckKind._ @@ -42,11 +31,8 @@ case class Hand(deck: String, bet: Int): val kind = DeckKind(deck) lazy val bestKind = - deck.iterator - .foldLeft(Iterator("")) { (it, chr) => - if chr == 'J' then it.flatMap(s => possibleCards.map(s + _)) - else it.map(_ + chr) - } + possibleCards + .map(c => deck.replace('J', c)) .map(DeckKind(_)) .maxBy(_.ordinal)