Submission details
Task:Tulkki
Sender:Luhpossu
Submission time:2025-10-28 14:48:58 +0200
Language:C++ (C++20)
Status:READY
Result:100
Feedback
groupverdictscore
#1ACCEPTED12
#2ACCEPTED32
#3ACCEPTED56
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.03 s3details
#16ACCEPTED0.00 s3details
#17ACCEPTED0.05 s3details
#18ACCEPTED0.03 s3details

Code

#include <algorithm>
#include <cstdlib>
#include <future>
#include <iostream>
#include <map>
#include <memory>
#include <stack>
#include <stdexcept>
#include <string>
#include <vector>

// #define DEBUG
namespace Variables {
    std::map<std::string, long long> variables;

    long long get(const std::string& key) {
        auto it = variables.find(key);
        if (it == variables.end()) {
            variables.insert({key, 0});
            return 0;
        }

        return it->second;
    }

    void increase(const std::string& key) {
        long long value = get(key) + 1;

        variables[key] = value;
    }

    void clear(const std::string& key) {
        variables[key] = 0;
    }
};

class Instruction {
public:
    virtual void handle() = 0;
    virtual ~Instruction() = default;
};

class PrintInstruction : public Instruction {
    std::string variable;
public:
    PrintInstruction(const std::string& variable) : variable(variable) { }

    void handle() override {
        std::cout << Variables::get(variable) << " ";
    }
};

class ClearInstruction : public Instruction {
    std::string variable;
public:
    ClearInstruction(const std::string& variable) : variable(variable) { }

    void handle() override {
        Variables::clear(variable);
    }
};

class IncreaseInstruction : public Instruction {
    std::string variable;
public:
    IncreaseInstruction(const std::string& variable) : variable(variable) { }

    void handle() override {
        Variables::increase(variable);
    }
};

class RepeatInstruction : public Instruction {
    std::string variable;
public:
    std::vector<std::shared_ptr<Instruction>> instructions;

    void handle() override {
        auto guh = variable == "" ? 1 : Variables::get(variable);

        for (int i = 0; i < guh; i++) {
            for (auto ins : instructions) {
                ins->handle();
            }
        }
    }

    RepeatInstruction(std::string variable = "") : variable(variable) { }
};

std::shared_ptr<Instruction> readPrint(const std::vector<std::string>& words, std::size_t& index) {
    std::string str = words.at(++index);
    return std::make_shared<PrintInstruction>(str);
}

std::shared_ptr<Instruction> readClear(const std::vector<std::string>& words, std::size_t& index) {
    std::string str = words.at(++index);
    return std::make_shared<ClearInstruction>(str);
}

std::shared_ptr<Instruction> readIncrease(const std::vector<std::string>& words, std::size_t& index) {
    std::string str = words.at(++index);
    return std::make_shared<IncreaseInstruction>(str);
}

std::shared_ptr<RepeatInstruction> readRepeat(const std::vector<std::string>& words, std::size_t& index) {
    std::string times = words.at(++index);
    index += 2;

    return std::make_shared<RepeatInstruction>(times);
}

int main([[maybe_unused]] int argc, [[maybe_unused]] char *argv[]) {
    auto base = std::make_shared<RepeatInstruction>();
    std::stack<std::shared_ptr<RepeatInstruction>> stack;

    stack.push(base);

    std::vector<std::string> words;

    std::string temp;
    while (std::cin >> temp) {
        int commentIndex = temp.find('#');

        if (commentIndex >= 0) {
            if (commentIndex > 0) {
                temp = temp.substr(0, commentIndex);
                words.push_back(temp);
            }
            
            std::string line;
            std::getline(std::cin, line);
            continue;
        }

        if (temp == "END") {
            goto END;
        } else {
            words.push_back(temp);
        }
    }
    
    END:

    std::size_t index = 0;

    while (index < words.size()) {
        std::string str = words.at(index);
        switch (str.at(0)) {
            case 'P' /* Print */: {
                stack.top()->instructions.push_back(readPrint(words, index));
                break;
            }
            case 'C' /* Clear */: {
                stack.top()->instructions.push_back(readClear(words, index));
                break;
            }
            case 'I' /* Increase */: {
                stack.top()->instructions.push_back(readIncrease(words, index));
                break;
            }
            case 'R' /* Repeat */: {
                auto guh = readRepeat(words, index);
                stack.top()->instructions.push_back(guh);
                stack.push(guh);
                break;
            }
            case ')' /* Repeat end */: {
                stack.pop();
                break;
            }
        }
        index++;
    }

    base->handle();
}

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