AdventOfCode-2017/day25.kt

46 lines
1.6 KiB
Kotlin

import java.io.File
data class TuringValue(val toWrite: Int, val toMove: Int, val nextState: Char)
data class TuringState(val ifZero: TuringValue, val ifOne: TuringValue, val name: Char)
fun readValue(lines: List<String>, index: Int): TuringValue{
val firstLine = lines[index]
val toWrite = firstLine[firstLine.length - 2].toInt() - '0'.toInt()
val toMove = if(lines[index+1].endsWith("left.")) -1 else 1
val thirdLine = lines[index + 2]
val state = thirdLine[thirdLine.length - 2]
return TuringValue(toWrite, toMove, state)
}
fun readState(lines: List<String>, index: Int): TuringState {
val lineA = lines[index]
val name = lineA[lineA.length - 2]
return TuringState(readValue(lines, index + 2), readValue(lines, index + 6), name)
}
fun main(args: Array<String>){
// val file = File("../puzzle_25.txt")
val file = File("test.txt")
val lines = file.readLines()
val firstLine = lines.first()
val states = mutableMapOf<Char, TuringState>()
(0 until 6)
.map { readState(lines, it * 10) }
.forEach { states.put(it.name, it) }
val tape = mutableMapOf<Int, Int>()
var currentState: Char = 'A'
var steps = 12134527
var index = 0
while(steps > 0){
val tapeValue = tape.getOrDefault(index, 0)
val state = states.get(currentState)!!
val value = if(tapeValue == 0) state.ifZero else state.ifOne
tape[index] = value.toWrite
index += value.toMove
currentState = value.nextState
steps--
}
println(tape.values.count { it == 1 })
}