# The Darwin Game - Rounds 0 to 10

The most important change between my game and Zvi's original is that bots can read each others' source code. They can simulate each other and predict each others' behavior. Within a day of the tournament launching—and an entire week before entries closed—Zack\_M\_Davis had already written a bot to simulate opponents and then [open-sourced](https://github.com/zackmdavis/less_wrong_darwin_tournament/blob/e75b2f8776ab9/abstract_spy_tree_bot.py) it to everyone.

That's what happens when a [significant contributor](https://www.lesswrong.com/posts/AHTRyQJtiRin22kth/the-darwin-game-1?commentId=j5wcrCEmXsWSKLFKx) to an open source Lisp dialect participates in a software competition.

Taleuntum wanted to write an even better simulator but was informed that it would take [too many years](https://www.lesswrong.com/posts/AHTRyQJtiRin22kth/the-darwin-game-1?commentId=vCphofwhEs8HQfEcw) to run.

Muticore solved the limited compute problem and wrote a safe, effective, obfuscated simulator, with randomization.

The Phantom Menace
==================

Three separate people asked me what happens if a bot crashes the game while simulating an opponent with malware in it. This turned out not to matter because nobody deployed malware to destroy simulators. Only one player, Measure, deployed malware—and the malware didn't crash the game. Instead, it attempted to replace its opponent's `move` method with a method that returned `0` instead. But the threat of getting disqualified seemed to scare away other potential simulators.

Taleuntum did write a `MatrixCrashingBot` that crashes simulators but did not submit it. This is a disappointment, as Taleuntum would have been allowed to submit this bot as a separate entry on the grounds that it does not coordinate with Taleuntum's CloneBot. To my knowledge, nobody else took advantage of this deliberate loophole in the rules either.

RaterBot safely combed through its opponent's source code for "2"s and "3"s to estimate aggression without the dangers associated with running untrusted code.

Computer programs attempting to simulate each other can produce complex behavior. The behavior is so complex it is [provably undecidable](https://en.wikipedia.org/wiki/Halting_problem)—and that's totally ignoring the real-world sandboxing problem.

Nevertheless, two contestants requested I write code to simulate their opponents. I refused these requests. Zvi[^\[1\]^](#fn-W2vwGcmyaT6uTiMm7-1) accepted a [simpler bot](https://www.lesswrong.com/posts/AHTRyQJtiRin22kth/the-darwin-game-1?commentId=kAjD4J2dx8MP7Fjv2) and the other contestant dropped out.

> I'm surprised running the enemy is complicated though—it should just be a function call.
> 
> ―quote from the contestant who dropped out

The most significant use of an opponent's source code came from Vanilla_cabs.

Attack of the Clones
====================

Zvi's original game was dominated by a clique of players who coordinated out-of-game to defeat the non-clique players. It worked great—and then defectors within the clique dominated both the non-clique players *and* the clique players.

Vanilla\_cabs observed that players could use each other's source code to detect (and therefore punish) defection from a clique. Leveraging this insight, Vanilla\_cabs [created](https://www.lesswrong.com/posts/AHTRyQJtiRin22kth/the-darwin-game-1?commentId=Kh9KYXuaLPQrCSRK8) a CloneBot template that would cooperate only for the first 90 rounds—long enough to eliminate all non-clones—and then allow players to do whatever they wanted afterward.

Brilliantly, the CloneBots used [the lexographic length](https://www.lesswrong.com/posts/AHTRyQJtiRin22kth/the-darwin-game-1?commentId=qwBsSrocaCxrgfpZ9) of custom code to break parity symmetry and guarantee perfect coordination between CloneBot instances instead of having to fumble around for the initial rounds of each pairing.

At the same time, Vanilla\_cabs worried that someone might attempt to bypass the CloneBot's self-recognition system. As a first line of defense, Vanilla\_cabs kept the source code secret from non-cloners. As a second line of defense, Vanilla_cabs [deliberately left open a weakness as a honeypot](https://www.lesswrong.com/posts/AHTRyQJtiRin22kth/the-darwin-game-1?commentId=YC4GtYuhc46EZX2HR). Among the first co-conspirators in the clone army, only Lanrian reported this weakness.

Taleuntum, in contrast, contributed two lies to the clique intrigue.

> I lied that I've already submitted one program detecting and crashing simulators…obviously I did not even plan to do so. Some time later…I added another lie that the method of detecting simulators was my friend's idea (hopefully suggesting that there is another contestant with the same method outside the clique).
> 
> ―[Taleuntum](https://www.lesswrong.com/posts/AHTRyQJtiRin22kth/the-darwin-game-1)

One player discovered a way to defect from the CloneBots.

Multicore
=========

The original CloneBot template used `splitlines()` to parse source code. But the Python3 interpreter behaves slightly differently from `splitlines()`. In particular, `splitlines()` splits on the groups separator character `0x1D`, which Python3 does not treat as a newline. By placing `0x1D` group separator characters inside of a comment, Multicore's EarlyBirdMimicBot bypassed the CloneBot self-recognition system.

Multicore did a lot of things.

*   Wrote a simulator.
*   Optimized the simulator via a branching algorithm to perform efficient searches.
*   Used randomization to disrupt opposing simulators.
*   Protected the simulator from malware.
*   Joined the CloneBots.
*   Defected from the CloneBots via a zero-day exploit in the CloneBot code.
*   Recruited two friends to submit password bots to serve as fodder.
*   Adjusted strategy based on the round number.

When I hosted this tournament, I hadn't expected anyone to "\[read\] through the C code for the python lexer".

For a complete write-up of Multicore's strategy, including source code, see [here](https://www.lesswrong.com/posts/AHTRyQJtiRin22kth/the-darwin-game-1?commentId=PeHa27vgerZYpgery).

> On a side note, I really love this site. I can't really recall any other game I've been in getting this tangled.
> 
> ―[Emiya](https://www.lesswrong.com/posts/AHTRyQJtiRin22kth/the-darwin-game-1?commentId=FBPT4KGc7ba6GvFPd)

The First Game
==============

The first iteration of the game was run by Taleuntum who ran "[a simulation of the whole tournament till the 160th round with 8 bots](https://www.lesswrong.com/posts/AHTRyQJtiRin22kth/the-darwin-game-1?commentId=8SRfwhuhcvD5bEeZN)" despite the tournament's source code not being public at the time.

Taleuntum's tournament was unofficial and does not count.

The Real Game
=============

Teams
-----

In order to make sense of the 54 participating bots, I have bucketed them into teams.

*   \[Blue\] **Clone Army.** 10 players [pledged](https://www.lesswrong.com/posts/AHTRyQJtiRin22kth/the-darwin-game-1?commentId=nkaRDuTvQ95kfgagA) to submit clone bots. 8 followed through, 1 didn't and Multicore submitted a \[Red\] mimic bot.
*   \[Red\] **Multics.** Multicore's friends submitted 2 password bots to aid Multicore's mimic bot.
*   \[Green\] **Norm Enforcers.** Ben Pace joined forces with jacobjacob to form their own little duo.
*   \[Black\] **Chaos Army.** 20 players wrote individual bots.
*   \[Magenta\] **NPCs.** I wrote 21 Silly Bots. Some of them had synergies.

The clones \[Blue\] begin the game outnumbered 6-to-1.

![pie 0](https://s3-us-west-2.amazonaws.com/www.lsusr.com/lesswrong/darwin-game/pie-0.png)

Edit: Everything below this line is in error. See [here](https://www.lesswrong.com/posts/YsdCAQaHGcjmeBGyy/the-darwin-game-round-1) for details.
================================================================================================================================================

Round 1
-------

5 bots died on turn 1 including 4 NPCs and Team Norm Enforcers' jacobjacob bot.

![0-1](https://s3-us-west-2.amazonaws.com/www.lsusr.com/lesswrong/darwin-game/0-1.png)

Rounds 2-3
----------

Another 4 NPCs died.

![1-3](https://s3-us-west-2.amazonaws.com/www.lsusr.com/lesswrong/darwin-game/1-3.png)

Rounds 4-10
-----------

S_A and BenBot die, along with 3 more NPCs. Thus ends team Norm Enforcers.

The clone army is mostly doing well, except for CloneBot which is doing poorly and AbstractSpyTreeBot which is doing almost as well as the average clone.

EarlyBirdMimicBot is doing better than the average CloneBot but not by much. The MimicBot's `0x1D` exploit succeeded in defecting but the bot appears not to have leveraged its defection to gamebreaking effect.

![3-10](https://s3-us-west-2.amazonaws.com/www.lsusr.com/lesswrong/darwin-game/3-10.png)

The clones have built up a critical mass of >50%. If their coordination mechanisms work then they ought to crush the rest of the competition.

![pie 10](https://s3-us-west-2.amazonaws.com/www.lsusr.com/lesswrong/darwin-game/pie-10.png)

If Zack\_M\_Davis' AbstractSpyTreeBot can survive in a world of clones until turn 90 when the clone treaty expires then there may be some hope for Chaos Army.

If not then, begun, the clone wars have.

Everything so far
=================

![0-10](https://s3-us-west-2.amazonaws.com/www.lsusr.com/lesswrong/darwin-game/0-10.png)

Today's Obituary
================

| Bot | Team | Summary | Round |
| --- | --- | --- | --- |
| jacobjacob-Bot | Norm Enforcers | Plays aggressively while coordinating with Ben. | 1   |
| Silly 5 Bot | NPCs | Always returns `5`. | 1   |
| Silly 0 Bot | NPCs | Always returns `0`. | 1   |
| Silly Invert Bot 0 | NPCs | Starts with `0`. Then always returns `5 - opponent_previous_move`. | 1   |
| Silly Invert Bot 5 | NPCs | Starts with `5`. Then always returns `5 - opponent_previous_move`. | 1   |
| Silly 4 Bot | NPCs | Always returns `4`. Then always returns `5 - opponent_previous_move`. | 2   |
| Silly Invert Bot 1 | NPCs | Starts with `0`. Then always returns `5 - opponent_previous_move`. | 2   |
| Silly Chaos Bot | NPCs | Plays completely randomly. | 4   |
| Silly Invert Bot 4 | NPCs | Starts with `4`. Then always returns `5 - opponent_previous_move`. | 4   |
| S_A | Chaos Army | Plays `1` 79% of the time, `5` 20% of the time and randomly 1% of the time | 5   |
| Silly Random Invert Bot 4 | NPCs | Starts randomly. Then always returns `5 - opponent_previous_move`. | 6   |
| Silly 1 Bot | NPCs | Always returns `1`. | 7   |
| Ben Bot | Norm Enforcers | Cooperates with jacobjacob \\[deceased\\]. If not paired with jacobjacob then this bot returns `3` for the first 100 turns and then does fancy stuff. Unfortunately for Ben, I picked 100 as the number of turns per pairing. | 10  |
| Silly 3 Bot | NPCs | Always returns `3`. | 10  |

* * *

The next installment of this series will be posted on October 26, 2020 at 5 pm Pacific Time.

* * *

Zvi's specification did address the halting problem, sandboxing problems and unpredictable resource consumption. [↩︎](#fnref-W2vwGcmyaT6uTiMm7-1)