Edit 2020-11-13. This unofficial version of the game is missing
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 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
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.
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
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.
|Silly 0 Bot||NPCs||Always returns
Rounds 3-9 will be posted on November 13, at 5 pm Pacific Time.