@@ -7,44 +7,45 @@ import de.ronny_h.aoc.extensions.Direction
77fun main () = PerfectlySphericalHouses ().run (2592 , 2360 )
88
99class PerfectlySphericalHouses : AdventOfCode <Int >(2015 , 3 ) {
10- override fun part1 (input : List <String >): Int {
11- require(input.size == 1 )
12- var position = Coordinates (0 , 0 )
13- val visited = mutableSetOf<Coordinates >(position)
14- input.parseDirections()
15- .forEach {
16- position + = it
17- visited.add(position)
18- }
19- return visited.size
20- }
10+ override fun part1 (input : List <String >): Int = input
11+ .parseDirections()
12+ .visitCoordinates()
13+ .size
2114
2215 override fun part2 (input : List <String >): Int {
23- require(input.size == 1 )
24- var santaPosition = Coordinates (0 , 0 )
25- var robotSantaPosition = santaPosition
26- val visited = mutableSetOf<Coordinates >(santaPosition)
27- input.parseDirections()
28- .forEachIndexed { i, direction ->
29- if (i % 2 == 0 ) {
30- robotSantaPosition + = direction
31- visited.add(robotSantaPosition)
32- } else {
33- santaPosition + = direction
34- visited.add(santaPosition)
16+ val (santa, roboSanta) = input
17+ .parseDirections()
18+ .withIndex()
19+ .partition { it.index % 2 == 0 }
20+
21+ return santa.map { it.value }.visitCoordinates()
22+ .union(
23+ roboSanta.map { it.value }.visitCoordinates()
24+ )
25+ .size
26+ }
27+
28+ private fun List<String>.parseDirections (): List <Direction > {
29+ require(size == 1 )
30+ return first()
31+ .map {
32+ when (it) {
33+ ' ^' -> Direction .NORTH
34+ ' v' -> Direction .SOUTH
35+ ' >' -> Direction .EAST
36+ ' <' -> Direction .WEST
37+ else -> error(" invalid direction: $it " )
3538 }
3639 }
37- return visited.size
3840 }
3941
40- private fun List<String>.parseDirections () = first()
41- .map {
42- when (it) {
43- ' ^' -> Direction .NORTH
44- ' v' -> Direction .SOUTH
45- ' >' -> Direction .EAST
46- ' <' -> Direction .WEST
47- else -> error(" invalid direction: $it " )
48- }
42+ private fun List<Direction>.visitCoordinates (): Set <Coordinates > {
43+ var position = Coordinates (0 , 0 )
44+ val visited = mutableSetOf<Coordinates >(position)
45+ forEach {
46+ position + = it
47+ visited.add(position)
4948 }
49+ return visited
50+ }
5051}
0 commit comments