summaryrefslogtreecommitdiff
path: root/score
diff options
context:
space:
mode:
authorBenji Dial <benji@benjidial.net>2023-05-29 20:44:40 -0400
committerBenji Dial <benji@benjidial.net>2023-05-29 20:44:40 -0400
commitb50e93257b0b73109b1e815219076e443d1a291e (patch)
tree119b92a4bee36d8904e2e2a612872aba0726fd7c /score
parent67a30f10dd690c8e7f8b18f7710a59449ce1a8ea (diff)
downloadlib94-b50e93257b0b73109b1e815219076e443d1a291e.tar.gz
scorer
Diffstat (limited to 'score')
-rw-r--r--score/main.cpp91
1 files changed, 91 insertions, 0 deletions
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 <lib94/lib94.hpp>
+#include <iostream>
+#include <fstream>
+
+[[noreturn]] void usage(const char *argv0) {
+ std::cerr << "usage: " << argv0 << " <first warrior> <second warrior> <number of rounds> <steps until tie>\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<char>(file1), {});
+ std::string source2(std::istreambuf_iterator<char>(file2), {});
+
+ file1.close();
+ file2.close();
+
+ auto w1 = lib94::compile_warrior(source1);
+ auto w2 = lib94::compile_warrior(source2);
+
+ if (std::holds_alternative<std::string>(w1)) {
+ std::cerr << "error compiling " << argv[1] << ": " << std::get<std::string>(w1) << '\n';
+ return 1;
+ }
+
+ if (std::holds_alternative<std::string>(w2)) {
+ std::cerr << "error compiling " << argv[2] << ": " << std::get<std::string>(w2) << '\n';
+ return 1;
+ }
+
+ const lib94::warrior *ws[2];
+ ws[0] = std::get<lib94::warrior *>(w1);
+ ws[1] = std::get<lib94::warrior *>(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;
+}