complete 2733.kt
This commit is contained in:
162
storage/zeta/kt/completed/2733.kt
Normal file
162
storage/zeta/kt/completed/2733.kt
Normal file
@@ -0,0 +1,162 @@
|
||||
import java.util.Stack
|
||||
|
||||
class BfInstance(val program: String) {
|
||||
var ptr: UByte = 0u
|
||||
var tape: Array<UByte> = Array(32768, { 0u })
|
||||
|
||||
data class Instruct(val type: Int, var jump: Int) {
|
||||
constructor(type: Int) : this(type, 0)
|
||||
}
|
||||
|
||||
var instructions = mutableListOf<Instruct>()
|
||||
var stack = Stack<Int>()
|
||||
|
||||
val bw = System.out.bufferedWriter()
|
||||
|
||||
fun pre(): Boolean {
|
||||
var pc = 0
|
||||
var commentFlag = false
|
||||
for (c in program) {
|
||||
if (commentFlag && c != '\n') {
|
||||
continue
|
||||
}
|
||||
when (c) {
|
||||
'>' -> {
|
||||
instructions.add(Instruct(0))
|
||||
pc++
|
||||
}
|
||||
|
||||
'<' -> {
|
||||
instructions.add(Instruct(1))
|
||||
pc++
|
||||
}
|
||||
|
||||
'+' -> {
|
||||
instructions.add(Instruct(2))
|
||||
pc++
|
||||
}
|
||||
|
||||
'-' -> {
|
||||
instructions.add(Instruct(3))
|
||||
pc++
|
||||
}
|
||||
|
||||
'.' -> {
|
||||
instructions.add(Instruct(4))
|
||||
pc++
|
||||
}
|
||||
|
||||
'[' -> {
|
||||
instructions.add(Instruct(5))
|
||||
stack.add(pc)
|
||||
pc++
|
||||
}
|
||||
|
||||
']' -> {
|
||||
instructions.add(Instruct(6))
|
||||
|
||||
if (stack.isNotEmpty()) {
|
||||
val jump: Int = stack.pop()
|
||||
instructions[pc].jump = jump
|
||||
instructions[jump].jump = pc
|
||||
} else {
|
||||
return false
|
||||
}
|
||||
|
||||
pc++
|
||||
}
|
||||
|
||||
'%' -> {
|
||||
commentFlag = true
|
||||
}
|
||||
|
||||
'\n' -> {
|
||||
commentFlag = false
|
||||
}
|
||||
}
|
||||
}
|
||||
if (stack.isNotEmpty()) {
|
||||
return false
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
fun execute() {
|
||||
var curr = 0
|
||||
while (curr < instructions.size) {
|
||||
val inst = instructions[curr]
|
||||
when (inst.type) {
|
||||
0 -> {
|
||||
ptr++
|
||||
curr++
|
||||
}
|
||||
|
||||
1 -> {
|
||||
ptr--
|
||||
curr++
|
||||
}
|
||||
|
||||
2 -> {
|
||||
tape[ptr.toInt()]++
|
||||
curr++
|
||||
}
|
||||
|
||||
3 -> {
|
||||
tape[ptr.toInt()]--
|
||||
curr++
|
||||
}
|
||||
|
||||
4 -> {
|
||||
bw.write(tape[ptr.toInt()].toInt().toChar().toString())
|
||||
curr++
|
||||
}
|
||||
|
||||
5 -> {
|
||||
if (tape[ptr.toInt()].toUInt() == 0u) {
|
||||
curr = inst.jump
|
||||
} else {
|
||||
curr++
|
||||
}
|
||||
}
|
||||
|
||||
6 -> {
|
||||
if (tape[ptr.toInt()].toUInt() != 0u) {
|
||||
curr = inst.jump
|
||||
} else {
|
||||
curr++
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
bw.flush()
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
fun main() = with(System.`in`.bufferedReader()) {
|
||||
val t = this.readLine().toInt()
|
||||
val bw = System.out.bufferedWriter()
|
||||
(1..t).forEach {
|
||||
bw.write("PROGRAM #${it}:\n")
|
||||
bw.flush()
|
||||
val sb = StringBuilder()
|
||||
var line = this.readLine()
|
||||
while (line != "end") {
|
||||
sb.append(line)
|
||||
sb.append('\n')
|
||||
line = this.readLine()
|
||||
}
|
||||
val bf = BfInstance(sb.toString())
|
||||
if (!bf.pre()) {
|
||||
bw.write("COMPILE ERROR\n")
|
||||
bw.flush()
|
||||
} else {
|
||||
bf.execute()
|
||||
bw.write("\n")
|
||||
bw.flush()
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user