I lurk and tag stuff.
Multicore
PSA: Voting on relevance is an important, underserved, and easy to contribute to area of the tagging system.
One person can create a tag, make a good description, and find a bunch of posts that fit it, but it takes multiple people’s votes to create a decent ordering of posts from most to least relevant. Which posts are listed first will be an important part of the user experience.
This will be especially important for the more crowded tags, like the core tags, history, math, science, statistics, ai risk, and so forth.
Contributing can be as easy as just going through the list and upvoting posts that you’ve read and think are a good fit for the tag.
Edit: It would be nice to have a spreadsheet sorting tags by something like average relevance karma per post, to identify which tags most need votes.
Looking through the code, yep, my simulation criteria were so conservative that I only simulated the PasswordBots. OscillatingTwoThreeBot was oh so close to only having two open parentheses but it used a decorative set of parentheses in the class definition (as did many others) Looks like I didn’t need simulation anyway.
I am somewhat interested in using the code to explore alternate timelines. Who wins without me? Who wins the clone showdown if it’s allowed to happen? What happens if you start the game at round 90 and make the smart bots use their endgame strategies in a pool full of silly bots? What happens if you remove npc bots and have a pool of only players? Does anything interesting happen if the number of turns per round is 101 rather than 100? I’m probably not interested enough to commit to doing this in a timely manner though.
What marginal submission would win in this pool? Probably just a MimicBot with Measure’s opening game. Using simulation, especially hy-compatible simulation, could make you win more as long as you didn’t simulate MeasureBot, or only simulated it in a separate thread.
It’s been a great ride. Thanks for running the game, lsusr.
That 80k guide seems aimed at people who don’t yet have any software engineering experience. I’m curious what you think the path is from “Average software engineer with 5+ years experience” to the kind of engineer you’re looking for, since that’s the point I’m starting from.
A way I can contribute to the site without having to come up with brilliant original ideas? Excellent!
Somewhat. The profile pic changes based on the character’s emotions, or their reaction to a situation. Sometimes there’s a reply where the text is blank and the only content is the character’s reaction as conveyed by the profile pic.
That said, it’s a minor enough element that you wouldn’t lose too much if it wasn’t there.
On the other hand, it is important for you to know which character each reply is associated with, as trying to figure out who’s talking from the text alone could get confusing in many scenes. So any format change should at least preserve the names.
Predict the winners at
I think you may have misread the “Unvaccinated and undeterred” graph (which is terrible and misleading).
All the numbers in each section add up to 100%, so it’s saying “53% of people who dined in restaurants were unvaccinated” not “53% of unvaccinated people dined in restaurants”. So you have to consider base rates. The numbers for half-vaccinated people were lower mostly because there are fewer half-vaccinated people than there are of the other groups.
(Saw this on twitter but I don’t remember from who.)
The Progress Bar has been filled!
Dubious honor to https://www.lesswrong.com/posts/XCsKmLw8L55ZyYjnK/think-before-you-speak-and-signal-it as the last post with 25+ karma to be tagged.
I would join such a zoom call. I have also been feeling the call of the progress bar’s final phase.
I think in a lot of people’s models, “10% chance of alignment by default” means “if you make a bunch of AIs, 10% chance that all of them are aligned, 90% chance that none of them are aligned”, not “if you make a bunch of AIs, 10% of them will be aligned and 90% of them won’t be”.
And the 10% estimate just represents our ignorance about the true nature of reality; it’s already true either that alignment happens by default or that it doesn’t, we just don’t know yet.
The original post does not explain in detail how organisms move from biome to biome. Looking at the code it seems to be like this:
-Each organism has a chance to roam at each step proportional to its speed. An organism with speed 10 will roam 1/1000 of the time. An organism with speed 0 will never roam to another biome. This seems like an extremely important consideration for any species that could survive in multiple biomes: put at least one point into speed.
-If an organism chooses to roam, it goes to a randomly chosen biome, including the one it just came from.
-If it can’t survive in that biome, it dies.
Submissions:
MMDoom: An instance of Doom(1993) is implanted in Avacedo’s mind. You can view the screen on the debug console. You control the game by talking to Avacedo and making him think of concepts. The 8 game inputs are mapped to the concepts of money, death, plants, animals, machines, competition, leisure, and learning. $5000 bounty to the first player who can beat the whole game.
AI Box: Avacedo thinks that he is the human gatekeeper, and you the user are the AI in the box. Can you convince him to let you out?
Ouroboros: I had MMAvacedo come up with my contest entry for me.
This sounds a lot like the “Precisely Bound Demons and their Behavior” concept that Yudkowsky described but never wrote the story for.
Ra also features magic-as-engineering.
Voting even works on the edits from the old wiki! I find it somewhat amusing to upvote an edit from twelve years ago.
Level one: A job title that straightforwardly describes what the person actually does in the job. For example, “Seventh-grade math teacher” or “Data Analyst”
Level two: A job title which claims to describe what the person actually does, but is misleading. For example, if someone was hired as an Electrical Engineer but actually spends their time doing IT work.
You move into level three a bit when the job title is partly about your status in a hierarchy: “Senior Software Engineer” or “Junior Software Engineer”.
As the original post suggests, job titles for high level management are mostly about social status and hierarchy, and therefore are never below level three.
Here’s some embedded prediction elicitation thingies about how the game will go.
(I’ve already made my submissions; this is not a ploy to gather information.)
- 6 Oct 2021 21:25 UTC; 9 points) 's comment on 2021 Darwin Game—Everywhere Else by (
An interesting bot for simulators to grapple with is this:
class BullyBot:
def __init__(self, round=0):
self.opponentThreesPlayed = 0
def move(self, previous=None):
if self.opponentThreesPlayed > 3:
return previous
elif previous == 3:
self.opponentThreesPlayed+=1
if self.opponentThreesPlayed > 3:
return 2
return 3
Something that holds out just long enough to get a naive simulator to fold to it forever, but will probably end up cooperating with most others.
This was a neat feature on Arbital, nice to see it here as well.
tl;dr I betrayed the CloneBot clique and submitted MimicBot. My submission is in this Github repository.
My Process in chronological order:
There were three important things I noted in the original post
Self cooperation is free, so an early lead is a big advantage.
There are guaranteed to be “silly” bots in the early pool.
You can vary your strategy depending on the round.
It seemed to me that the best strategy was to get as many points as possible early by exploiting silly bots, cooperating with anyone willing to cooperate, and folding somewhat to attackers. Then later on just play a non-exploitable cooperative strategy and hope for your early advantage to snowball.
Simulation
After seeing AbstractSpyTreeBot and some of the comments around it, it seemed to me that simulation was perhaps the best way to take advantage of simple bots. There are various approaches you could take, but mine was to simulate every possible sequence of moves I could make for the next N turns, and use the one with the best outcome. Since this has exponential time complexity, I only considered the moves 2 and 3 and kept N fairly small, with the option for the game runner to reduce it further to improve performance.
There are several possible pitfalls with simulators:
The opponent might have randomized behavior, making your simulated predictions useless. In fact, not using randomization seems wrong to me, since you might get stuck in a rut against another deterministic bot, alternating 2 and 3 on the same schedule. Only bad bots would be deterministic and therefore simulatable.
The opponent might have planted a landmine in their code to disqualify any potential simulator.
The opponent might be slow, and make my dozens of simulations per turn take too long.
The opponent might be a BullyBot, who attacks until the opponent retaliates. My short time horizon would make folding look correct, when actually retaliating would give more points in the long run. At the same time, I did want to fold against AttackBot.
My solution to the first three problems was to only run simulations against bots with two or fewer open parentheses “(” in their source. That’s how many you need to define __init__ and move, so it wouldn’t leave any for calls to exec or random or inspect. I suspect it might be possible to sneak a landmine past this requirement, but since I didn’t tell anyone what I was doing it seemed safe enough. Hopefully enough of the deterministic bots fulfill this requirement for simulation to be worthwhile.
For the BullyBot problem, I had the simulation also see what the best strategy was that didn’t let the opponent outscore by more than X but also got at least Y points. If this strategy didn’t exist, such as against AttackBot, I would fold, but otherwise I would play that strategy. I also made the simulation be more willing to be uncompromising against attackers as the rounds went on, in case one of the dumb bots was actually putting up a fight in the overall tournament.
For my backup strategy against non-simulatable bots I kept it simple and pulled from Zvi’s playbook. In the early rounds, I play an EquityBot which folds if the opponent plays 3 ten times in a row. In the later rounds, I play DefenseBot.
I considered a plan of obfuscating my code so that it would look safe to other simulators, and then disqualifying them if they tried to simulate me. I gave up on that because it seemed like other simulators would either be careful like I was or someone else would disqualify them for me. Plus, simulators are fun. I’d rather have a fair fight against other simulators. My code uses randomization and has lots of scary keywords in it, so other simulators aren’t going to be exploiting me.
To feed my simulation plan, I found two people who didn’t have time to make a proper submission, and got them to submit PasswordBot, which plays 3 on the first two turns, then if the opponent played 2 on the first two turns it plays 2 for the rest of the game, and otherwise plays 3 for the rest of the game. I figured that only a branching simulator could take advantage of this.
CloneBot
Throughout the week, a couple people publicly announced intent to join the CloneBot clique. I decided that the CloneBots would be a huge threat that I might not be able to compete with if I didn’t do something to address them. Originally I was planning to not contact the clique and use the public source, but when Vanilla_cabs announced the source would not be public, I messaged them indicating willingness to join the clique. I’m not sure how suspicious the timing seemed to them, but I was included anyway. I gave Vanilla_cabs some notes about other parts of the code, but intentionally did not comment on anything related to security.
My plan was to bypass whatever they were using to check that the opponent is a clone, so that I could get perfect cooperation with clones, but also use my simulation strategy to exploit dumb bots and continue to cooperate with outsiders as the clones got more aggressive.
On Friday, the CloneBot security update was released, with the final version of the clone check.
(I can’t figure out how to paste code into here), the source is here.
There are two constraints:
After the string sanitization, my code before the payload must compare identical with the sanitized version of my opponent’s pre-payload code.
After the string sanitization, my code after the payload must have at least eight spaces at the beginning of every line.
I got cracking.
I noticed that the checker was splitting the code by “\n”, so I wondered if there was any other character that python would treat as semantically equivalent to a newline. There is—the ASCII Form Feed character \f (0x0C). However, this didn’t work. I hadn’t noticed the earlier sanitization step of using splitlines() and then joining by \n. All my \f’s were just getting turned into \n’s and getting busted.
I then wondered if there was any other way of convincing python that there was a newline, or convincing it to dedent to a lower indentation level, without using a character that would be caught by splitlines or using less than eight spaces of indentation. A string of google searches led me to reading through the C code for the python lexer, which was very educational but convinced me that this route was a dead end.
I noticed in reading about the lexer that it has a somewhat complicated system for handling tabs and spaces in indents. I noticed that the code sanitization was automatically converting tabs to four spaces and wondered if I could use a mixture of tabs and spaces in indentation to manipulate the if / else statements in the clonebot move function to make it run the payload early. Unfortunately python 3 does not allow any mixture of tabs and spaces which makes the meaning of the code depend on how many spaces a tab is worth. I think this attack vector might be valid if we were using python 2.
At this point it was 3 AM and I slept on it. On Saturday morning I thought back to the very thing that had foiled my first attempt, the splitlines() sanitization. Instead of finding a character that would be treated as a newline but not caught by splitlines, what about a character that would be caught by splitlines but not treated as a newline? I found a thread online where people were complaining about splitlines splitting on certain characters, and a dev said the behavior was intentional. One of those characters was 0x1D, the ASCII Group Separator character. I tried it in a test program, and it worked. I tried it in CloneBot, and… it worked!
That’s the technique my final program uses. Starting with the first comment in the move function, I replaced every newline with 0x1D, which is a valid character in a comment. The bottom half of the CloneBot source is a comment and gets skipped over, so the move function actually runs my custom code, which is all indented at least eight spaces and fulfills the second constraint of the clone check. I use the same cooperateWithClone function as the clones to cooperate with them until the showdown round, at which point I just treat them like any other bot.
I’m not too surprised that other people tried and failed to cheat the restrictions, since it took me 8+ hours and some real thinking outside the box. It does make me feel better that I’m not the only would-be betrayer.
Predictions
How do I think I’m going to do? My bot passes the clone check both in Vanilla_cabs’s official checking tool and in my test harness, but I can see some possibility of something introducing enough differences to screw up the check. Vanilla_cabs encouraged people to submit through the form, while I submitted a git repo. Lsusr promised to preserve my special characters, but the real game environment might be different enough to make the check go wrong, though if that was the case maybe all clones would fail the check.
Separately, my bot is pretty complicated. I wouldn’t be surprised if it was the longest submitted, at over 250 lines of code. I’ve done a fair amount of testing, but I am not confident in my ability to make my software robust to anything that might happen. There’s a decent chance something unexpected will happen and I’ll crash and get disqualified.
However, if my bot doesn’t have a crippling bug and no one else figured out how to submit a MimicBot, I don’t really see how I lose. I get lots of points from clones, dumb bots, and cooperators, while everyone else is losing out against at least one of those.
I’ll say 30% my bot crashes or fails the clone test, 10% someone else submitted MimicBot and theirs is better, 10% those things don’t happen but I still lose, 50% I win.