1
1
package eu .sim642 .adventofcode2020
2
2
3
3
import eu .sim642 .adventofcodelib .pos .HexPos
4
+ import eu .sim642 .adventofcodelib .IteratorImplicits ._
4
5
5
6
object Day24 {
6
7
@@ -15,16 +16,39 @@ object Day24 {
15
16
16
17
def applyMoves (pos : HexPos , moves : Seq [String ]): HexPos = moves.foldLeft(pos)(_ + neighbors(_))
17
18
18
- def countBlackTiles (directions : Seq [Seq [String ]]): Int = {
19
+ def getBlackTiles (directions : Seq [Seq [String ]]): Set [ HexPos ] = {
19
20
directions
20
21
.view
21
22
.map(applyMoves(HexPos .zero, _))
22
23
.groupMapReduce(identity)(_ => 1 )(_ + _)
23
24
.filter(_._2 % 2 == 1 )
24
- .keys
25
- .size
25
+ .keySet
26
26
}
27
27
28
+ def countBlackTiles (directions : Seq [Seq [String ]]): Int = getBlackTiles(directions).size
29
+
30
+ def step (blackTiles : Set [HexPos ]): Set [HexPos ] = {
31
+ // based on 2020 Day 17
32
+ blackTiles.iterator
33
+ .flatMap(pos =>
34
+ neighbors.values.iterator
35
+ .map(pos + _)
36
+ )
37
+ .groupMapReduce(identity)(_ => 1 )(_ + _)
38
+ .collect({
39
+ case (pos, 2 ) => pos
40
+ case (pos, 1 ) if blackTiles(pos) => pos
41
+ })
42
+ .toSet
43
+ }
44
+
45
+ def countBlackTilesAfter (directions : Seq [Seq [String ]], days : Int = 100 ): Int = {
46
+ val initialBlackTiles = getBlackTiles(directions)
47
+ val finalBlackTiles = Iterator .iterate(initialBlackTiles)(step)(days)
48
+ finalBlackTiles.size
49
+ }
50
+
51
+
28
52
private val moveRegex = """ e|se|sw|w|nw|ne""" .r
29
53
30
54
def parseMoves (s : String ): Seq [String ] = moveRegex.findAllIn(s).toSeq
@@ -35,5 +59,6 @@ object Day24 {
35
59
36
60
def main (args : Array [String ]): Unit = {
37
61
println(countBlackTiles(parseDirections(input)))
62
+ println(countBlackTilesAfter(parseDirections(input)))
38
63
}
39
64
}
0 commit comments