Day 07
This commit is contained in:
parent
6e5bb0fffe
commit
426f64709f
2 changed files with 1110 additions and 0 deletions
1000
input/day07
Normal file
1000
input/day07
Normal file
File diff suppressed because it is too large
Load diff
110
src/day07.scala
Normal file
110
src/day07.scala
Normal file
|
|
@ -0,0 +1,110 @@
|
||||||
|
package aoc
|
||||||
|
package day07
|
||||||
|
|
||||||
|
import util.chaining.*
|
||||||
|
import math.Ordering.Implicits.seqOrdering
|
||||||
|
|
||||||
|
val dayNumber = "07"
|
||||||
|
|
||||||
|
@main def part1: Unit =
|
||||||
|
println(part1(loadInput(dayNumber)))
|
||||||
|
|
||||||
|
@main def part2: Unit =
|
||||||
|
println(part2(loadInput(dayNumber)))
|
||||||
|
|
||||||
|
type Card = Char
|
||||||
|
|
||||||
|
enum HandType:
|
||||||
|
case FiveOfAKind,
|
||||||
|
FourOfAKind,
|
||||||
|
FullHouse,
|
||||||
|
ThreeOfAKind,
|
||||||
|
TwoPair,
|
||||||
|
OnePair,
|
||||||
|
HighCard
|
||||||
|
given Ordering[HandType] = Ordering.by(_.ordinal)
|
||||||
|
|
||||||
|
def part1(input: String): String =
|
||||||
|
val cardsOrder = "AKQJT98765432"
|
||||||
|
given Ordering[Card] = Ordering.by(cardsOrder.indexOf(_))
|
||||||
|
|
||||||
|
final case class Hand(cards: Seq[Card], bid: Long):
|
||||||
|
val tpe =
|
||||||
|
cards
|
||||||
|
.groupMapReduce(identity)(_ => 1)(_ + _)
|
||||||
|
.values
|
||||||
|
.toSeq
|
||||||
|
.sorted
|
||||||
|
.reverse match
|
||||||
|
case 5 :: _ => HandType.FiveOfAKind
|
||||||
|
case 4 :: _ => HandType.FourOfAKind
|
||||||
|
case 3 :: 2 :: _ => HandType.FullHouse
|
||||||
|
case 3 :: _ => HandType.ThreeOfAKind
|
||||||
|
case 2 :: 2 :: _ => HandType.TwoPair
|
||||||
|
case 2 :: _ => HandType.OnePair
|
||||||
|
case _ => HandType.HighCard
|
||||||
|
object Hand:
|
||||||
|
given Ordering[Hand] =
|
||||||
|
Ordering
|
||||||
|
.by[Hand, HandType](_.tpe)
|
||||||
|
.orElseBy[Seq[Card]](_.cards)
|
||||||
|
input
|
||||||
|
.split('\n')
|
||||||
|
.map(_.split(' ') match
|
||||||
|
case Array(cards, bid) => Hand(cards.toSeq, bid.toLong)
|
||||||
|
)
|
||||||
|
.sorted
|
||||||
|
.map(_.bid)
|
||||||
|
.reverse
|
||||||
|
.zipWithIndex
|
||||||
|
.map((bid, index) => bid * (index + 1))
|
||||||
|
.sum
|
||||||
|
.toString
|
||||||
|
|
||||||
|
def part2(input: String): String =
|
||||||
|
val cardsOrder = "AKQT98765432J"
|
||||||
|
given Ordering[Card] = Ordering.by(cardsOrder.indexOf(_))
|
||||||
|
|
||||||
|
final case class Hand(cards: Seq[Card], bid: Long):
|
||||||
|
val jCount = cards.count(_ == 'J')
|
||||||
|
val tpe =
|
||||||
|
cards
|
||||||
|
.groupMapReduce(identity)(_ => 1)(_ + _)
|
||||||
|
.values
|
||||||
|
.toSeq
|
||||||
|
.sorted
|
||||||
|
.reverse match
|
||||||
|
case 5 :: _ => HandType.FiveOfAKind
|
||||||
|
case 4 :: _ if jCount == 4 => HandType.FiveOfAKind
|
||||||
|
case 4 :: _ if jCount == 1 => HandType.FiveOfAKind
|
||||||
|
case 4 :: _ => HandType.FourOfAKind
|
||||||
|
case 3 :: 2 :: _ if jCount == 3 => HandType.FiveOfAKind
|
||||||
|
case 3 :: 2 :: _ if jCount == 2 => HandType.FiveOfAKind
|
||||||
|
case 3 :: 2 :: _ => HandType.FullHouse
|
||||||
|
case 3 :: _ if jCount == 3 => HandType.FourOfAKind
|
||||||
|
case 3 :: _ if jCount == 1 => HandType.FourOfAKind
|
||||||
|
case 3 :: _ => HandType.ThreeOfAKind
|
||||||
|
case 2 :: 2 :: _ if jCount == 2 => HandType.FourOfAKind
|
||||||
|
case 2 :: 2 :: _ if jCount == 1 => HandType.FullHouse
|
||||||
|
case 2 :: 2 :: _ => HandType.TwoPair
|
||||||
|
case 2 :: _ if jCount == 2 => HandType.ThreeOfAKind
|
||||||
|
case 2 :: _ if jCount == 1 => HandType.ThreeOfAKind
|
||||||
|
case 2 :: _ => HandType.OnePair
|
||||||
|
case _ if jCount == 1 => HandType.OnePair
|
||||||
|
case _ => HandType.HighCard
|
||||||
|
object Hand:
|
||||||
|
given Ordering[Hand] =
|
||||||
|
Ordering
|
||||||
|
.by[Hand, HandType](_.tpe)
|
||||||
|
.orElseBy(_.cards)
|
||||||
|
input
|
||||||
|
.split('\n')
|
||||||
|
.map(_.split(' ') match
|
||||||
|
case Array(cards, bid) => Hand(cards.toSeq, bid.toLong)
|
||||||
|
)
|
||||||
|
.sorted
|
||||||
|
.reverse
|
||||||
|
.zipWithIndex
|
||||||
|
.map((hand, index) => hand.bid * (index + 1))
|
||||||
|
.sum
|
||||||
|
.toString
|
||||||
Loading…
Add table
Add a link
Reference in a new issue