From b50e93257b0b73109b1e815219076e443d1a291e Mon Sep 17 00:00:00 2001 From: Benji Dial Date: Mon, 29 May 2023 20:44:40 -0400 Subject: scorer --- score/main.cpp | 91 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 91 insertions(+) create mode 100644 score/main.cpp (limited to 'score/main.cpp') diff --git a/score/main.cpp b/score/main.cpp new file mode 100644 index 0000000..1b29107 --- /dev/null +++ b/score/main.cpp @@ -0,0 +1,91 @@ +#include +#include +#include + +[[noreturn]] void usage(const char *argv0) { + std::cerr << "usage: " << argv0 << " \n"; + exit(1); +} + +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(file1), {}); + std::string source2(std::istreambuf_iterator(file2), {}); + + file1.close(); + file2.close(); + + auto w1 = lib94::compile_warrior(source1); + auto w2 = lib94::compile_warrior(source2); + + if (std::holds_alternative(w1)) { + std::cerr << "error compiling " << argv[1] << ": " << std::get(w1) << '\n'; + return 1; + } + + if (std::holds_alternative(w2)) { + std::cerr << "error compiling " << argv[2] << ": " << std::get(w2) << '\n'; + return 1; + } + + const lib94::warrior *ws[2]; + ws[0] = std::get(w1); + ws[1] = std::get(w2); + + unsigned w1_wins = 0; + unsigned w2_wins = 0; + + lib94::seed_prng(time(NULL)); + + for (unsigned round_number = 0; round_number < round_count; ++round_number) { + + 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(); + + 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; +} -- cgit v1.2.3