8000 Generify 2018 day 9 MarbleCircle to CircularZipper · sim642/adventofcode@dc2f3f6 · GitHub
[go: up one dir, main page]

Skip to content

Commit dc2f3f6

Browse files
committed
Generify 2018 day 9 MarbleCircle to CircularZipper
1 parent aa5cbbb commit dc2f3f6

File tree

1 file changed

+18
-14
lines changed
  • src/main/scala/eu/sim642/adventofcode2018

1 file changed

+18
-14
lines changed

src/main/scala/eu/sim642/adventofcode2018/Day9.scala

Lines changed: 18 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -5,26 +5,26 @@ object Day9 {
55
/**
66
* Zipper-like immutable circular buffer.
77
*/
8-
case class MarbleCircle(init: List[Int], current: Int, tail: List[Int]) {
9-
def next: MarbleCircle = tail match {
10-
case hd :: tl => MarbleCircle(current :: init, hd, tl)
8+
case class CircularZipper[A](init: List[A], current: A, tail: List[A]) {
9+
def next: CircularZipper[A] = tail match {
10+
case hd :: tl => CircularZipper(current :: init, hd, tl)
1111
10000 case Nil =>
1212
init.reverse match {
13-
case hd :: it => MarbleCircle(List(current), hd, it)
13+
case hd :: it => CircularZipper(List(current), hd, it)
1414
case Nil => this
1515
}
1616
}
1717

18-
def prev: MarbleCircle = init match {
19-
case hd :: it => MarbleCircle(it, hd, current :: tail)
18+
def prev: CircularZipper[A] = init match {
19+
case hd :: it => CircularZipper(it, hd, current :: tail)
2020
case Nil =>
2121
tail.reverse match {
22-
case hd :: tl => MarbleCircle(tl, hd, List(current))
22+
case hd :: tl => CircularZipper(tl, hd, List(current))
2323
case Nil => this
2424
}
2525
}
2626

27-
def rotate(n: Int): MarbleCircle = {
27+
def rotate(n: Int): CircularZipper[A] = {
2828
if (n == 0)
2929
this
3030
else if (n > 0)
@@ -33,18 +33,22 @@ object Day9 {
3333
prev.rotate(n + 1)
3434
}
3535

36-
def inserted(elem: Int): MarbleCircle = MarbleCircle(init, elem, current :: tail)
36+
def inserted(elem: A): CircularZipper[A] = CircularZipper(init, elem, current :: tail)
3737

38-
def removed: (Int, MarbleCircle) = tail match {
39-
case hd :: tl => (current, MarbleCircle(init, hd, tl))
38+
def removed: (A, CircularZipper[A]) = tail match {
39+
case hd :: tl => (current, CircularZipper(init, hd, tl))
4040
case Nil =>
4141
val hd :: it = init
42-
(current, MarbleCircle(it, hd, tail))
42+
(current, CircularZipper(it, hd, tail))
4343
}
4444
}
4545

46+
object CircularZipper {
47+
def apply[A](elem: A): CircularZipper[A] = CircularZipper(Nil, elem, Nil)
48+
}
49+
4650
def highscore(playerCount: Int, lastMarble: Int): Long = {
47-
def helper(marbles: MarbleCircle, marble: Int, player: Int, scores: Map[Int, Long]): Map[Int, Long] = {
51+
def helper(marbles: CircularZipper[Int], marble: Int, player: Int, scores: Map[Int, Long]): Map[Int, Long] = {
4852
val nextPlayer = ((player - 1) + 1) % playerCount + 1
4953

5054
if (marble > lastMarble)
@@ -60,7 +64,7 @@ object Day9 {
6064
}
6165
}
6266

63-
helper(MarbleCircle(Nil, 0, Nil), 1, 1, Map.empty.withDefaultValue(0)).values.max
67+
helper(CircularZipper(0), 1, 1, Map.empty.withDefaultValue(0)).values.max
6468
}
6569

6670
def highscore(input: String, lastMarbleMult: Int = 1): Long = {

0 commit comments

Comments
 (0)
0