| Task: | Tulkki |
| Sender: | MattiDragon |
| Submission time: | 2025-10-27 18:27:05 +0200 |
| Language: | Java |
| Status: | READY |
| Result: | 12 |
| group | verdict | score |
|---|---|---|
| #1 | ACCEPTED | 12 |
| #2 | WRONG ANSWER | 0 |
| #3 | WRONG ANSWER | 0 |
| test | verdict | time | group | |
|---|---|---|---|---|
| #1 | ACCEPTED | 0.13 s | 1, 2, 3 | details |
| #2 | ACCEPTED | 0.13 s | 1, 2, 3 | details |
| #3 | ACCEPTED | 0.13 s | 1, 2, 3 | details |
| #4 | ACCEPTED | 0.14 s | 1, 2, 3 | details |
| #5 | ACCEPTED | 0.18 s | 1, 2, 3 | details |
| #6 | ACCEPTED | 0.19 s | 1, 2, 3 | details |
| #7 | ACCEPTED | 0.13 s | 2, 3 | details |
| #8 | ACCEPTED | 0.12 s | 2, 3 | details |
| #9 | ACCEPTED | 0.13 s | 2, 3 | details |
| #10 | ACCEPTED | 0.14 s | 2, 3 | details |
| #11 | ACCEPTED | 0.13 s | 2, 3 | details |
| #12 | WRONG ANSWER | 0.14 s | 2, 3 | details |
| #13 | ACCEPTED | 0.13 s | 3 | details |
| #14 | ACCEPTED | 0.14 s | 3 | details |
| #15 | ACCEPTED | 0.16 s | 3 | details |
| #16 | ACCEPTED | 0.13 s | 3 | details |
| #17 | ACCEPTED | 0.28 s | 3 | details |
| #18 | ACCEPTED | 0.17 s | 3 | details |
Code
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Scanner;
import java.util.stream.Collectors;
public class C {
static final boolean DEBUG = Boolean.getBoolean("debug");
static final boolean IP_LOG = Boolean.getBoolean("ip-log");
static final boolean NO_RUN = Boolean.getBoolean("no-run");
static final int OPTIMIZATION = Integer.getInteger("optimize", 1);
static final byte NOOP = 0;
static final byte CLEAR = 1;
static final byte INCREASE = 2;
static final byte PRINT = 3;
static final byte REPEAT = 4;
static final byte END_REPEAT = 5;
static final byte E_ADD = 11;
public static void main(String[] args) throws IOException {
var scanner = new Scanner(System.in);
var tokens = new ArrayList<Byte>();
while (scanner.hasNext()) {
var tok = scanner.next();
var hashIndex = tok.indexOf('#');
if (hashIndex != -1) {
scanner.nextLine();
tok = tok.substring(0, hashIndex);
}
if (tok.isEmpty())
continue;
switch (tok) {
case "CLEAR":
tokens.add(CLEAR);
break;
case "INCREASE":
tokens.add(INCREASE);
break;
case "PRINT":
tokens.add(PRINT);
break;
case "REPEAT":
tokens.add(REPEAT);
break;
case "TIMES":
case "(":
break;
case ")":
tokens.add(END_REPEAT);
break;
default:
if (tok.length() == 1) {
var c = tok.charAt(0);
if (c >= 'A' && c <= 'Z') {
tokens.add((byte) c);
break;
}
}
throw new IllegalStateException("Unexpected token '" + tok + "'");
}
}
if (DEBUG) {
prettyPrint(tokens);
System.out.println();
System.out.println();
}
if (OPTIMIZATION >= 1) {
optimize(tokens);
}
if (DEBUG) {
prettyPrint(tokens);
}
var bytecode = new byte[tokens.size()];
for (var i = 0; i < bytecode.length; i++) {
bytecode[i] = tokens.get(i);
}
if (!NO_RUN) {
runVm(bytecode);
}
}
private static void optimize(ArrayList<Byte> tokens) {
var replacementBytecode = new ArrayList<Byte>();
var clearedVariables = new HashSet<Byte>();
// Get rid of simple addition loops:
var i = 0;
findLoops: while (i < tokens.size()) {
// Find loop
while (tokens.get(i++) != REPEAT) {
if (i >= tokens.size()) {
break findLoops;
}
}
var loopStart = i - 1;
var loopVariable = tokens.get(i++);
replacementBytecode.clear();
clearedVariables.clear();
convertBytecode: while (true) {
switch (tokens.get(i++)) {
case CLEAR:
var clearedVariable = tokens.get(i++);
clearedVariables.add(clearedVariable);
replacementBytecode.add(CLEAR);
replacementBytecode.add(clearedVariable);
break;
case INCREASE:
var variable = tokens.get(i++);
if (clearedVariables.contains(variable)) {
replacementBytecode.add(INCREASE);
replacementBytecode.add(variable);
} else {
replacementBytecode.add(E_ADD);
replacementBytecode.add(loopVariable);
replacementBytecode.add(variable);
}
break;
case END_REPEAT:
break convertBytecode;
default:
i--;
continue findLoops;
}
}
var loopSize = i - loopStart;
for (int j = 0; j < loopSize; j++) {
tokens.remove(loopStart);
}
tokens.addAll(loopStart, replacementBytecode);
i -= loopSize;
i += replacementBytecode.size();
}
}
private static void runVm(byte[] bytecode) {
var out = new StringBuilder();
var registers = new int[26];
var callstack = new int[1000];
var loopCounters = new int[1000];
var sp = 0;
var ip = 0;
while (ip < bytecode.length) {
if (DEBUG) {
System.out.printf("ip: %s; b[ip]: %s; sp: %s%n", ip, bytecode[ip], sp);
System.out.println("r: " + Arrays.toString(registers));
System.out.print("s: ");
for (int i = 0; i <= sp; i++) {
System.out.print(callstack[i] + "|" + loopCounters[i] + " ");
}
System.out.println();
System.out.println();
}
if (IP_LOG) {
System.out.print("s: ");
for (int i = 0; i <= sp; i++) {
System.out.print(callstack[i] + "|" + loopCounters[i] + " ");
}
System.out.print(" ".repeat(20) + "\r");
}
switch (bytecode[ip++]) {
case CLEAR:
registers[bytecode[ip++] - 'A'] = 0;
break;
case INCREASE:
registers[bytecode[ip++] - 'A'] += 1;
break;
case PRINT:
out.append(registers[bytecode[ip++] - 'A']);
out.append(' ');
if (out.length() > 10000) {
System.out.print(out);
out.delete(0, out.length());
}
break;
case REPEAT:
int count = registers[bytecode[ip++] - 'A'];
if (count > 0) {
loopCounters[sp] = count;
callstack[sp++] = ip;
} else {
var nested = 1;
do {
var next = bytecode[ip++];
if (next == END_REPEAT)
nested--;
if (next == REPEAT)
nested++;
} while (nested != 0);
}
break;
case END_REPEAT:
if (--loopCounters[--sp] == 0) {
break;
} else {
ip = callstack[sp++];
}
break;
case E_ADD:
var addValue = registers[bytecode[ip++] - 'A'];
registers[bytecode[ip++] - 'A'] += addValue;
break;
default:
break;
}
}
System.out.print(out);
}
private static void prettyPrint(List<Byte> tokens) {
var indent = 0;
var i = 0;
while (i < tokens.size()) {
var indentStr = " ".repeat(indent);
switch (tokens.get(i++)) {
case NOOP:
break;
case CLEAR:
System.out.printf("%sCLEAR %c%n", indentStr, (char) (byte) tokens.get(i++));
break;
case INCREASE:
System.out.printf("%sINCREASE %c%n", indentStr, (char) (byte) tokens.get(i++));
break;
case PRINT:
System.out.printf("%sPRINT %c%n", indentStr, (char) (byte) tokens.get(i++));
break;
case REPEAT:
System.out.printf("%sREPEAT %c TIMES (%n", indentStr, (char) (byte) tokens.get(i++));
indent++;
break;
case END_REPEAT:
indent--;
System.out.printf("%s)%n", " ".repeat(indent));
break;
case E_ADD:
System.out.printf("%s!ADD %c %c%n", " ".repeat(indent), (char) (byte) tokens.get(i++),
(char) (byte) tokens.get(i++));
break;
default:
break;
}
}
}
}Test details
Test 1 (public)
Group: 1, 2, 3
Verdict: ACCEPTED
| input |
|---|
| PRINT X INCREASE X PRINT X INCREASE X PRINT X ... |
| correct output |
|---|
| 0 1 2 0 |
| user output |
|---|
| 0 1 2 0 |
Test 2 (public)
Group: 1, 2, 3
Verdict: ACCEPTED
| input |
|---|
| INCREASE X # aybabtu PRINT X INCREASE # test ... |
| correct output |
|---|
| 1 3 |
| user output |
|---|
| 1 3 |
Test 3 (public)
Group: 1, 2, 3
Verdict: ACCEPTED
| input |
|---|
| # Create number 3 INCREASE X INCREASE X INCREASE X ... |
| correct output |
|---|
| 3 |
| user output |
|---|
| 3 |
Test 4 (public)
Group: 1, 2, 3
Verdict: ACCEPTED
| input |
|---|
| INCREASE A PRINT A INCREASE B PRINT B INCREASE C ... |
| correct output |
|---|
| 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ... |
| user output |
|---|
| 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ... |
Test 5 (public)
Group: 1, 2, 3
Verdict: ACCEPTED
| input |
|---|
| INCREASE X INCREASE X INCREASE X INCREASE X INCREASE X ... |
| correct output |
|---|
| 999 |
| user output |
|---|
| 999 |
Test 6 (public)
Group: 1, 2, 3
Verdict: ACCEPTED
| input |
|---|
| PRINT X PRINT X PRINT X PRINT X PRINT X ... |
| correct output |
|---|
| 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ... |
| user output |
|---|
| 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ... |
Test 7 (public)
Group: 2, 3
Verdict: ACCEPTED
| input |
|---|
| INCREASE A INCREASE A INCREASE A INCREASE A INCREASE A ... |
| correct output |
|---|
| 5 5 5 5 5 |
| user output |
|---|
| 5 5 5 5 5 |
Test 8 (public)
Group: 2, 3
Verdict: ACCEPTED
| input |
|---|
| INCREASE A INCREASE A INCREASE A INCREASE A INCREASE A ... |
| correct output |
|---|
| 0 0 0 0 0 |
| user output |
|---|
| 0 0 0 0 0 |
Test 9 (public)
Group: 2, 3
Verdict: ACCEPTED
| input |
|---|
| INCREASE A INCREASE A INCREASE A INCREASE A INCREASE A ... |
| correct output |
|---|
| 6 7 8 9 10 |
| user output |
|---|
| 6 7 8 9 10 |
Test 10 (public)
Group: 2, 3
Verdict: ACCEPTED
| input |
|---|
| INCREASE A INCREASE A INCREASE A INCREASE A INCREASE A ... |
| correct output |
|---|
| 5 5 |
| user output |
|---|
| 5 5 |
Test 11 (public)
Group: 2, 3
Verdict: ACCEPTED
| input |
|---|
| INCREASE A INCREASE A INCREASE A INCREASE A INCREASE A ... |
| correct output |
|---|
| 20 |
| user output |
|---|
| 20 |
Test 12 (public)
Group: 2, 3
Verdict: WRONG ANSWER
| input |
|---|
| INCREASE A INCREASE A INCREASE B INCREASE B ... |
| correct output |
|---|
| 42 |
| user output |
|---|
| 132 |
Feedback: Incorrect character on line 1 col 1: expected "42", got "132"
Test 13 (public)
Group: 3
Verdict: ACCEPTED
| input |
|---|
| INCREASE A INCREASE A INCREASE A INCREASE A INCREASE A ... |
| correct output |
|---|
| 1 2 2 3 3 3 4 4 4 4 5 5 5 5 5 |
| user output |
|---|
| 1 2 2 3 3 3 4 4 4 4 5 5 5 5 5 |
Test 14 (public)
Group: 3
Verdict: ACCEPTED
| input |
|---|
| # Create number 3 INCREASE A INCREASE A INCREASE... |
| correct output |
|---|
| 12 |
| user output |
|---|
| 12 |
Test 15 (public)
Group: 3
Verdict: ACCEPTED
| input |
|---|
| INCREASE X INCREASE X INCREASE X INCREASE X INCREASE X ... |
| correct output |
|---|
| 531441 |
| user output |
|---|
| 531441 |
Test 16 (public)
Group: 3
Verdict: ACCEPTED
| input |
|---|
| INCREASE A INCREASE A INCREASE A INCREASE A INCREASE A ... |
| correct output |
|---|
| 1337 |
| user output |
|---|
| 1337 |
Test 17 (public)
Group: 3
Verdict: ACCEPTED
| input |
|---|
| INCREASE A INCREASE A REPEAT A TIMES ( REPEAT A TIMES ( ... |
| correct output |
|---|
| 1 2 1 2 1 1 3 4 3 4 3 4 3 4 3 ... |
| user output |
|---|
| 1 2 1 2 1 1 3 4 3 4 3 4 3 4 3 ... |
Test 18 (public)
Group: 3
Verdict: ACCEPTED
| input |
|---|
| # Efficient algorithm for find... |
| correct output |
|---|
| 2 3 5 7 11 13 17 19 23 29 31 3... |
| user output |
|---|
| 2 3 5 7 11 13 17 19 23 29 31 3... |
