46 lines
1.6 KiB
Kotlin
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 })
|
|
} |