diff options
Diffstat (limited to 'score/main.cpp')
-rw-r--r-- | score/main.cpp | 109 |
1 files changed, 0 insertions, 109 deletions
diff --git a/score/main.cpp b/score/main.cpp deleted file mode 100644 index aae9ba2..0000000 --- a/score/main.cpp +++ /dev/null @@ -1,109 +0,0 @@ -#include <lib94/lib94.hpp> -#include <iostream> -#include <fstream> - -[[noreturn]] void usage(const char *argv0) { - std::cout << "usage: " << argv0 << " <first warrior> <second warrior> <number of rounds> <steps until tie>\n"; - exit(1); -} - -void print_warrior(const lib94::warrior *w) { - std::cerr << ";name " << w->name << '\n'; - std::cerr << ";author " << w->author << '\n'; - if (w->org != 0) - std::cerr << "org " << w->org << '\n'; - for (const auto &i : w->instructions) - std::cerr << lib94::instruction_to_string(i) << '\n'; - std::cerr << '\n'; -} - -int main(int argc, const char **argv) { - if (argc != 5) - usage(argv[0]); - - unsigned round_count, steps_until_tie; - - try { - round_count = std::stoul(argv[3]); - steps_until_tie = std::stoul(argv[4]); - } - catch (const std::exception &e) { - usage(argv[0]); - } - - std::ifstream file1(argv[1]); - std::ifstream file2(argv[2]); - - if (!file1 || !file2) - usage(argv[0]); - - std::string source1(std::istreambuf_iterator<char>(file1), {}); - std::string source2(std::istreambuf_iterator<char>(file2), {}); - - file1.close(); - file2.close(); - - lib94::warrior *w1, *w2; - - try { - w1 = lib94::compile_warrior(source1); - } - catch (const lib94::compiler_exception &ex) { - std::cout << "error in " << argv[1] << " on line " << ex.line_number << ": " << ex.message << '\n'; - return 1; - } - - try { - w2 = lib94::compile_warrior(source2); - } - catch (const lib94::compiler_exception &ex) { - std::cout << "error in " << argv[2] << " on line " << ex.line_number << ": " << ex.message << '\n'; - return 1; - } - - const lib94::warrior *ws[2] = {w1, w2}; - - print_warrior(ws[0]); - print_warrior(ws[1]); - - unsigned w1_wins = 0; - unsigned w2_wins = 0; - - lib94::seed_prng(time(NULL)); - - for (unsigned round_number = 0; round_number < round_count; ++round_number) { - - std::cerr << "round " << round_number + 1 << "\x1b[0G"; - - lib94::clear_core({ - .op = lib94::DAT, .mod = lib94::F, - .amode = lib94::DIRECT, .bmode = lib94::DIRECT, - .anumber = 0, .bnumber = 0 - }); - - lib94::init_round(ws, 2); - - for (unsigned step_number = 0; step_number < steps_until_tie; ++step_number) { - - const lib94::warrior *w = lib94::single_step<false>(); - - if (w == ws[0]) { - ++w2_wins; - break; - } - - if (w == ws[1]) { - ++w1_wins; - break; - } - - } - - } - - std::cout << round_count << " rounds completed\n"; - std::cout << w1_wins << " wins, " << w2_wins << " losses\n"; - std::cout << "score " << (int)w1_wins - (int)w2_wins << '\n'; - - return 0; -} |