8000 Refactor 2020 day 22 · sim642/adventofcode@01e3f48 · GitHub
[go: up one dir, main page]

Skip to content
8000

Commit 01e3f48

Browse files
committed
Refactor 2020 day 22
1 parent b6a97ed commit 01e3f48

File tree

1 file changed

+35
-35
lines changed

1 file changed

+35
-35
lines changed

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

Lines changed: 35 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,12 @@ object Day22 {
1010
type Decks = (Deck, Deck)
1111

1212
sealed trait Part {
13-
def playWinner(decks: Decks): Either[Decks, Decks]
13+
def playWinner(decks: Decks): Either[Deck, Deck]
1414

1515
def winningScore(decks: Decks): Int = {
1616
val winningDeck = playWinner(decks) match {
17-
case Left((deck1, _)) => deck1
18-
case Right((_, deck2)) => deck2
17+
case Left(deck1) => deck1
18+
case Right(deck2) => deck2
1919
}
2020
winningDeck
2121
.reverseIterator
@@ -25,18 +25,20 @@ object Day22 {
2525
}
2626
}
2727

28+
// TODO: reduce duplication
29+
2830
object Part1 extends Part {
2931

30-
override def playWinner(decks: Decks): Either[Decks, Decks] = {
31-
val roundDecks = LazyList.unfold0(decks)(playRound)
32-
val lastDecks@(lastDeck1, _) = roundDecks.last
32+
override def playWinner(decks: Decks): Either[Deck, Deck] = {
33+
val roundDecks = decks #:: LazyList.unfold0(decks)(playRound) // unfold0 doesn't include first
34+
val (lastDeck1, lastDeck2) = roundDecks.last
3335
if (lastDeck1.nonEmpty)
34-
Left(lastDecks)
36+
Left(lastDeck1)
3537
else
36-
Right(lastDecks)
38+
Right(lastDeck2)
3739
}
3840

39-
def playRound(decks: Decks): Option[Decks] = {
41+
private def playRound(decks: Decks): Option[Decks] = {
4042
val (deck1, deck2) = decks
4143
(deck1.dequeueOption, deck2.dequeueOption) match {
4244
case (Some((card1, newDeck1)), Some((card2, newDeck2))) =>
@@ -51,47 +53,45 @@ object Day22 {
5153
}
5254

5355
object Part2 extends Part {
56+
// TODO: optimize
5457

55-
override def playWinner(decks: Decks): Either[Decks, Decks] = {
56-
//println(s"GAME: $decks")
57-
val roundDecks = decks #:: LazyList.unfold0(decks)(playRound)
58+
override def playWinner(decks: Decks): Either[Deck, Deck] = {
59+
val roundDecks = decks #:: LazyList.unfold0(decks)(playRound) // unfold0 doesn't include first
5860
NaiveCycleFinder.find(roundDecks) match {
5961
case None =>
60-
val lastDecks@(lastDeck1, _) = roundDecks.last
61-
//println("GAME OVER (normal)")
62+
val (lastDeck1, lastDeck2) = roundDecks.last
6263
if (lastDeck1.nonEmpty)
63-
Left(lastDecks)
64+
Left(lastDeck1)
6465
else
65-
Right(lastDecks)
66+
Right(lastDeck2)
6667
case Some(cycle) =>
67-
//println("GAME OVER (cycle)")
68-
Left(cycle.cycleHead)
68+
Left(cycle.cycleHead._1)
6969
}
7070
}
7171

72-
def playRound(decks: Decks): Option[Decks] = {
73-
//println(s"ROUND: $decks")
72+
private def playRound(decks: Decks): Option[Decks] = {
7473
val (deck1, deck2) = decks
7574
(deck1.dequeueOption, deck2.dequeueOption) match {
7675
case (Some((card1, newDeck1)), Some((card2, newDeck2))) =>
77-
//println(s" $card1 vs $card2")
78-
// TODO: Queue has inefficient length?
79-
if (!(newDeck1.length >= card1 && newDeck2.length >= card2)) {
80-
if (card1 > card2)
76+
val winner: Either[Any, Any] = {
77+
// TODO: Queue has inefficient length?
78+
if (newDeck1.length >= card1 && newDeck2.length >= card2) {
79+
val recDecks = (newDeck1.take(card1), newDeck2.take(card2))
80+
playWinner(recDecks)
81+
} else {
82+
if (card1 > card2)
83+
Left()
84+
else
85+
Right()
86+
}
87+
}
88+
89+
winner match {
90+
case Left(_) =>
8191
Some((newDeck1.enqueue(card1).enqueue(card2), newDeck2))
82-
else
92+
case Right(_) =>
8393
Some((newDeck1, newDeck2.enqueue(card2).enqueue(card1)))
8494
}
85-
else {
86-
val recDeck1 = newDeck1.take(card1)
87-
val recDeck2 = newDeck2.take(card2)
88-
playWinner((recDeck1, recDeck2)) match {
89-
case Left(_) =>
90-
Some((newDeck1.enqueue(card1).enqueue(card2), newDeck2))
91-
case Right(_) =>
92-
Some((newDeck1, newDeck2.enqueue(card2).enqueue(card1)))
93-
}
94-
}
9595
case (_, _) =>
9696
None
9797
}

0 commit comments

Comments
 (0)
0