@@ -5,26 +5,26 @@ object Day9 {
5
5
/**
6
6
* Zipper-like immutable circular buffer.
7
7
*/
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)
11
11
10000
case Nil =>
12
12
init.reverse match {
13
- case hd :: it => MarbleCircle (List (current), hd, it)
13
+ case hd :: it => CircularZipper (List (current), hd, it)
14
14
case Nil => this
15
15
}
16
16
}
17
17
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)
20
20
case Nil =>
21
21
tail.reverse match {
22
- case hd :: tl => MarbleCircle (tl, hd, List (current))
22
+ case hd :: tl => CircularZipper (tl, hd, List (current))
23
23
case Nil => this
24
24
}
25
25
}
26
26
27
- def rotate (n : Int ): MarbleCircle = {
27
+ def rotate (n : Int ): CircularZipper [ A ] = {
28
28
if (n == 0 )
29
29
this
30
30
else if (n > 0 )
@@ -33,18 +33,22 @@ object Day9 {
33
33
prev.rotate(n + 1 )
34
34
}
35
35
36
- def inserted (elem : Int ): MarbleCircle = MarbleCircle (init, elem, current :: tail)
36
+ def inserted (elem : A ): CircularZipper [ A ] = CircularZipper (init, elem, current :: tail)
37
37
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))
40
40
case Nil =>
41
41
val hd :: it = init
42
- (current, MarbleCircle (it, hd, tail))
42
+ (current, CircularZipper (it, hd, tail))
43
43
}
44
44
}
45
45
46
+ object CircularZipper {
47
+ def apply [A ](elem : A ): CircularZipper [A ] = CircularZipper (Nil , elem, Nil )
48
+ }
49
+
46
50
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 ] = {
48
52
val nextPlayer = ((player - 1 ) + 1 ) % playerCount + 1
49
53
50
54
if (marble > lastMarble)
@@ -60,7 +64,7 @@ object Day9 {
60
64
}
61
65
}
62
66
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
64
68
}
65
69
66
70
def highscore (input : String , lastMarbleMult : Int = 1 ): Long = {
0 commit comments