Day 6 part 2 completed.
All checks were successful
Solve / example-action (push) Successful in 2m26s
All checks were successful
Solve / example-action (push) Successful in 2m26s
This commit is contained in:
parent
67ce498228
commit
fcaa401d60
61
day06.kts
61
day06.kts
@ -3,8 +3,7 @@ import java.io.File
|
|||||||
import java.lang.RuntimeException
|
import java.lang.RuntimeException
|
||||||
import java.util.Scanner
|
import java.util.Scanner
|
||||||
|
|
||||||
data class MoveResult(val newLocation: Pair<Int, Int>, val newDirection: Direction)
|
data class LocationState(val location: Pair<Int, Int>, val direction: Direction)
|
||||||
data class MoveHistory(val location: Pair<Int, Int>, val direction: Direction)
|
|
||||||
enum class Direction(val offset: Pair<Int, Int>) {
|
enum class Direction(val offset: Pair<Int, Int>) {
|
||||||
NORTH(Pair(0, -1)),
|
NORTH(Pair(0, -1)),
|
||||||
EAST(Pair(1, 0)),
|
EAST(Pair(1, 0)),
|
||||||
@ -36,12 +35,12 @@ enum class Direction(val offset: Pair<Int, Int>) {
|
|||||||
fun moveByPartOneRules(
|
fun moveByPartOneRules(
|
||||||
currentLocation: Pair<Int, Int>,
|
currentLocation: Pair<Int, Int>,
|
||||||
blocks: Set<Pair<Int, Int>>
|
blocks: Set<Pair<Int, Int>>
|
||||||
): MoveResult {
|
): LocationState {
|
||||||
var currentDirection = this
|
var currentDirection = this
|
||||||
do {
|
do {
|
||||||
val potentialMove = currentDirection.move(currentLocation)
|
val potentialMove = currentDirection.move(currentLocation)
|
||||||
if (potentialMove !in blocks) {
|
if (potentialMove !in blocks) {
|
||||||
return MoveResult(potentialMove, currentDirection)
|
return LocationState(potentialMove, currentDirection)
|
||||||
}
|
}
|
||||||
currentDirection = currentDirection.turnRight()
|
currentDirection = currentDirection.turnRight()
|
||||||
} while (currentDirection != this)
|
} while (currentDirection != this)
|
||||||
@ -52,10 +51,36 @@ fun isPositionInTheRoom(player: Pair<Int, Int>, xMax: Int, yMax: Int): Boolean {
|
|||||||
return player.first in 0..xMax && player.second in 0..yMax
|
return player.first in 0..xMax && player.second in 0..yMax
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun isLoop(
|
||||||
|
playerLocation: Pair<Int, Int>,
|
||||||
|
playerDirection: Direction,
|
||||||
|
history: List<LocationState>,
|
||||||
|
blocks: MutableSet<Pair<Int, Int>>,
|
||||||
|
potentialBlockLocation: Pair<Int, Int>,
|
||||||
|
xMax: Int,
|
||||||
|
yMax: Int
|
||||||
|
): Boolean {
|
||||||
|
var localLocation = playerLocation
|
||||||
|
var localDirection = playerDirection
|
||||||
|
val localHistory = history.toMutableList()
|
||||||
|
val localBlocks = blocks.toMutableSet()
|
||||||
|
localBlocks.add(potentialBlockLocation)
|
||||||
|
while (LocationState(localLocation, localDirection) !in localHistory) {
|
||||||
|
localHistory.add(LocationState(localLocation, localDirection))
|
||||||
|
val (newLocation, newDirection) = localDirection.moveByPartOneRules(localLocation, localBlocks)
|
||||||
|
localLocation = newLocation
|
||||||
|
localDirection = newDirection
|
||||||
|
if (!isPositionInTheRoom(localLocation, xMax, yMax)) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
val scanner = Scanner(System.`in`)
|
val scanner = Scanner(System.`in`)
|
||||||
val visited = mutableSetOf<Pair<Int, Int>>()
|
val visited = mutableSetOf<Pair<Int, Int>>()
|
||||||
val history = mutableListOf<MoveHistory>()
|
val history = mutableListOf<LocationState>()
|
||||||
var playerLocation = Pair(0, 0)
|
var playerLocation = Pair(0, 0)
|
||||||
var playerDirection: Direction = Direction.NORTH
|
var playerDirection: Direction = Direction.NORTH
|
||||||
val blocks = mutableSetOf<Pair<Int, Int>>()
|
val blocks = mutableSetOf<Pair<Int, Int>>()
|
||||||
@ -94,7 +119,7 @@ while (isPositionInTheRoom(playerLocation, xMax, yMax)) {
|
|||||||
if (checkForLoopIfObstacleInFront(playerLocation, playerDirection, history)) {
|
if (checkForLoopIfObstacleInFront(playerLocation, playerDirection, history)) {
|
||||||
potentialBlocks.add(playerDirection.move(playerLocation))
|
potentialBlocks.add(playerDirection.move(playerLocation))
|
||||||
}
|
}
|
||||||
history.add(MoveHistory(playerLocation, playerDirection))
|
history.add(LocationState(playerLocation, playerDirection))
|
||||||
val (newLocation, newDirection) = playerDirection.moveByPartOneRules(playerLocation, blocks)
|
val (newLocation, newDirection) = playerDirection.moveByPartOneRules(playerLocation, blocks)
|
||||||
playerLocation = newLocation
|
playerLocation = newLocation
|
||||||
playerDirection = newDirection
|
playerDirection = newDirection
|
||||||
@ -106,29 +131,13 @@ println("Potential blocks: ${potentialBlocks.size}")
|
|||||||
fun checkForLoopIfObstacleInFront(
|
fun checkForLoopIfObstacleInFront(
|
||||||
playerLocation: Pair<Int, Int>,
|
playerLocation: Pair<Int, Int>,
|
||||||
playerDirection: Direction,
|
playerDirection: Direction,
|
||||||
history: MutableList<MoveHistory>
|
history: MutableList<LocationState>
|
||||||
): Boolean {
|
): Boolean {
|
||||||
val potentialBlockLocation = playerDirection.move(playerLocation)
|
val potentialBlockLocation = playerDirection.moveByPartOneRules(playerLocation, blocks).location
|
||||||
val nextMove = playerDirection.moveByPartOneRules(playerLocation, blocks)
|
|
||||||
val alreadyVisited = potentialBlockLocation in visited
|
val alreadyVisited = potentialBlockLocation in visited
|
||||||
val pathAlreadyBlocked = potentialBlockLocation != nextMove.newLocation
|
|
||||||
val positionNotInTheRoom = !isPositionInTheRoom(potentialBlockLocation, xMax, yMax)
|
val positionNotInTheRoom = !isPositionInTheRoom(potentialBlockLocation, xMax, yMax)
|
||||||
if (alreadyVisited || pathAlreadyBlocked || positionNotInTheRoom) {
|
if (alreadyVisited || positionNotInTheRoom) {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
var localLocation = playerLocation
|
return isLoop(playerLocation, playerDirection, history, blocks, potentialBlockLocation, xMax, yMax)
|
||||||
var localDirection = playerDirection
|
|
||||||
val localHistory = history.toMutableList()
|
|
||||||
val localBlocks = blocks.toMutableSet()
|
|
||||||
localBlocks.add(potentialBlockLocation)
|
|
||||||
while (MoveHistory(localLocation, localDirection) !in localHistory) {
|
|
||||||
localHistory.add(MoveHistory(localLocation, localDirection))
|
|
||||||
val (newLocation, newDirection) = localDirection.moveByPartOneRules(localLocation, localBlocks)
|
|
||||||
localLocation = newLocation
|
|
||||||
localDirection = newDirection
|
|
||||||
if (!isPositionInTheRoom(localLocation, xMax, yMax)) {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
2
day06.kts.testvalue
Normal file
2
day06.kts.testvalue
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
Player location: 4883
|
||||||
|
Potential blocks: 1655
|
Loading…
Reference in New Issue
Block a user