Skip to content

Commit 5cde78d

Browse files
committed
Refactor PerfectlySphericalHouses to be less repeating
1 parent 9056e5e commit 5cde78d

File tree

1 file changed

+34
-33
lines changed

1 file changed

+34
-33
lines changed

src/main/kotlin/de/ronny_h/aoc/year2015/day03/PerfectlySphericalHouses.kt

Lines changed: 34 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -7,44 +7,45 @@ import de.ronny_h.aoc.extensions.Direction
77
fun main() = PerfectlySphericalHouses().run(2592, 2360)
88

99
class 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

Comments
 (0)