Submission details
Task:Tulkki
Sender:aatukaj
Submission time:2025-10-27 00:56:51 +0200
Language:Rust (2021)
Status:READY
Result:44
Feedback
groupverdictscore
#1ACCEPTED12
#2ACCEPTED32
#30
Test results
testverdicttimegroup
#1ACCEPTED0.00 s1, 2, 3details
#2ACCEPTED0.00 s1, 2, 3details
#3ACCEPTED0.00 s1, 2, 3details
#4ACCEPTED0.00 s1, 2, 3details
#5ACCEPTED0.00 s1, 2, 3details
#6ACCEPTED0.00 s1, 2, 3details
#7ACCEPTED0.00 s2, 3details
#8ACCEPTED0.00 s2, 3details
#9ACCEPTED0.00 s2, 3details
#10ACCEPTED0.00 s2, 3details
#11ACCEPTED0.00 s2, 3details
#12ACCEPTED0.00 s2, 3details
#13ACCEPTED0.00 s3details
#14ACCEPTED0.00 s3details
#15ACCEPTED0.02 s3details
#16ACCEPTED0.00 s3details
#17ACCEPTED0.04 s3details
#180.00 s3details

Compiler report

warning: unused variable: `i`
  --> input/code.rs:75:21
   |
75 |                 for i in 0..val {
   |                     ^ help: if this is intentional, prefix it with an underscore: `_i`
   |
   = note: `#[warn(unused_variables)]` on by default

warning: 1 warning emitted

Code

use std::{
    collections::HashMap,
    io::{self, Read},
};

struct Parser<'a> {
    src: &'a str,
    vars: HashMap<char, i32>,
}

#[derive(PartialEq)]
enum Kw {
    Clear,
    Increase,
    Print,
    Repeat,
    Times,
}

const KWS: [(Kw, &str); 5] = [
    (Kw::Clear, "CLEAR"),
    (Kw::Increase, "INCREASE"),
    (Kw::Print, "PRINT"),
    (Kw::Repeat, "REPEAT"),
    (Kw::Times, "TIMES"),
];

impl Parser<'_> {
    fn bump(&mut self) {
        self.src = &self.src[1..];
    }
    fn parse_keyword(&mut self) -> Kw {
        for (kw, s) in KWS {
            if self.src.starts_with(s) {
                self.src = &self.src[s.len()..];
                return kw;
            }
        }
        unreachable!("invalid keyword, src is {}", self.src)
    }
    fn peek(&self) -> char {
        match self.src.chars().next() {
            Some(c) => c,
            None => '?',
        }
    }
    fn parse(&mut self) {
        while self.peek() != '?' && self.peek() != ')' {
            self.parse_command();
        }
    }
    fn parse_command(&mut self) {
        if self.peek() == ')' {
            return;
        }
        let kw = self.parse_keyword();
        // println!("{}", self.src);
        let var = self.peek();
        self.bump();
        match kw {
            Kw::Clear => {
                self.vars.insert(var, 0);
            }
            Kw::Increase => {
                *self.vars.get_mut(&var).unwrap() += 1;
            }
            Kw::Print => {
                print!("{} ", self.vars.get(&var).unwrap());
            }
            Kw::Repeat => {
                let val = *self.vars.get(&var).unwrap();
                assert!(self.parse_keyword() == Kw::Times);
                self.bump();
                let prv = self.src;
                for i in 0..val {
                    self.src = prv;
                    // println!("START {i}, src: {}", self.src);
                    self.parse();
                    // println!("LOOP {i}, src: {}", self.src);
                }
                // println!("ENDLOOP, src: {}", self.src);
                self.bump();
            }
            Kw::Times => unreachable!(),
        }
    }
}

fn main() {
    let mut stdin = io::stdin();
    let mut buf = String::new();
    let _ = stdin.read_to_string(&mut buf);
    let filtered = buf
        .lines()
        .map(|s| {
            let pos = s.find('#').unwrap_or(s.len());
            s[0..pos].chars()
        })
        .flatten()
        .filter(|c| !c.is_whitespace())
        .collect::<String>();

    let mut vars = HashMap::new();
    for c in 'A'..='Z' {
        vars.insert(c, 0);
    }
    let mut parser = Parser {
        src: &filtered,
        vars,
    };
    parser.parse();
    println!();
}

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

user output

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: ACCEPTED

input
INCREASE A
INCREASE A

INCREASE B
INCREASE B
...

correct output
42 

user output
42 

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:

input
# Efficient algorithm for find...

correct output
2 3 5 7 11 13 17 19 23 29 31 3...

user output
(empty)

Error:
thread 'main' panicked at input/code.rs:39:9:
internal error: entered unreachable code: invalid keyword, src is LEARDINCREASEI)CLEARCINCREASELREPEATDTIMES(INCREASEF))REPEATVTIMES(INCREASEWINCREASEYCLEARAREPEATYTIMES(INCREASEOINCREASEXINCREASEXREPEATLTIMES(INCREASEICLEARN)INCREASEQINCREASEA)INCREASEHCLEARYREPEATOTIMES(CLEARCINCREASEAREPEATITIMES(INCREASECREPEATDTIMES(CLEARXCLEARTINCREASEOINCREASEUCLEARM)CLEARV)INCREASEWPRINTAREPEATATIMES(INCREASEB)REPEATBTIMES(REPEATATIMES(INCREASEG)PRINTG)REPEATCTIMES(CLEARYINCREASEGINCREASEU)REPEATATIMES(REPEATATIMES(PRINTGREPEATATIMES(INCREASEGINCREASET))REPEATTTIMES(INCREASEKINCREASEN)REPEATATIMES(INCREASEG))INCREASEQPRINTGREPEATQTIMES(INCREASEG)REPEATATIMES(PRINTGREPEATATIMES(INCREASEG))CLEARSREPEATATIMES(REPEATCTIMES(INCREASEGINCREASEN)PRINTG)REPEATATIMES(CLEARNINCREASEMINCREASER)INCREASEMREPEATMTIMES(REPEATWTIMES(INCREASEG)PRINTGREPEATATIMES(INCREASEW))REPEATCTIMES(INCREASEG)REPEATATIMES(REPEATATIMES(INCREASEG)PRINTG)REPEATATIMES(INCREASEGREPEATA...