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, 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, 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){ // val file = File("../puzzle_25.txt") val file = File("test.txt") val lines = file.readLines() val firstLine = lines.first() val states = mutableMapOf() (0 until 6) .map { readState(lines, it * 10) } .forEach { states.put(it.name, it) } val tape = mutableMapOf() 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 }) }