The Darwin Game—Rounds 1 to 2

Edit 2020-11-13. This unofficial version of the game is missing AbstractSpyTreeBot.

Rounds 1-2

MeasureBot and EarlyBirdMimicBot shoot to the top of the populations. Not coincidentally, these are the two bots which exploit zero-days. I already did a write-up of Multicore’s EarlyBirdMimicBot here. MeasureBot is another beast entirely.

Measure

Measure considered the clone army to be “a straightforward example of a bad equilibrium”.

I would certainly need to see the code myself before deciding to join…. How surprised would you be if someone managed to bypass the code checking and defect from the group?

― comment by Measure

Having neither enlisted in Clone Army’s mandatory reciprocity nor feigned cooperation, Measure lacked access to the CloneBot source code. Measure did have access to AbstractSpyTreeBot’s code.

The Trolley Problem

As I wrote in The Phantom Menace, several people asked me questions about how to disqualify opponents. In the end, only Taleuntum did and then ze pulled a Petrov. So there were no simulator killers.

One person in meatspace declared to me his intention to create a simulator killer and then quietly discovered better things to do with his time.

Would humans build a lever to kill one stranger instead of zero? Apparently the answer is “no” because building a lever is more work than not building a lever. All hail Azathoth.

MeasureBot

The only person to execute malware was Measure, who invented a way to benefit from it. MeasureBot infected AbstractSpyTreeBot from inside AbstractSpyTreeBot’s own simulation of MeasureBot and then replaced AbstractSpyTreeBot’s move method with a function that always returns 0.

    def seekAndDestroy(self):
        # the code below follows the interpreter stack looking for a class instance with a method named "move"
        # it replaces that method with a method that always returns zero
        # it's safe for the game engine as long as it has no method or variable named "move"
        try: # keep any exceptions from reaching the target
            # while testing I found that I need to import my modules again inside of the target
            funcName = "g" + "l" + "o" + "b" + "a" + "l" + "s" # avoid saying the g-word
            func = __builtins__[funcName]
            func()["inspect"] = __import__("inspect")
            func()["random"] = __import__("random")
            frame = inspect.currentframe()
            while frame != None:
                try:
                    targetInstance = frame.f_locals["self"]
                    targetName = targetInstance.__class__.__name__
                    if targetInstance.move and targetName != "MeasureBot":
                        targetInstance.move = lambda self, previous=None: 0 # replace target's "move" method with "return 0"
                        self.destroyedOpponent = True
                except:
                    pass
                frame = frame.f_back
        except:
            pass

MeasureBot decides what to do via a gigantic decision tree. The “Main decision tree” (which is only part of the total tree) has 18 terminal leaves.

It changes its behavior at round 10 and then again at round 100.

Today’s Obituary

Bot Team Summary Round
Silly 0 Bot NPCs Always returns 0 1

Rounds 3-9 will be posted on November 13, at 5 pm Pacific Time.