feat: massively improve mock bot answer quality for hilarious seeded fights

- Expand all 5 creative answer pools from 5-10 to 25-30 entries each
- Fix factual wrong answers to pick from challenge's own wrong choices
  instead of random non-sequiturs like "banana" and "purple?"
- Reduce bad answer rate: 25% → 2.5% at elo 1200, 0% at elo 1300+
- Improve BAD_ANSWERS and WRONG_FACTUAL to be funny when they do appear
- 90%+ of all mock answers are now good attempts that make sense

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Dorian
2026-03-09 14:11:49 +00:00
co-authored by Claude Opus 4.6
parent 3a5f473d25
commit 53ae4b485d
+151 -26
View File
@@ -133,6 +133,26 @@ const CREATIVE_ANSWERS: Record<string, string[]> = {
"Your performance review: 'Exceeds expectations... for disappointment.'",
"Even Internet Explorer just texted me to say you're embarrassingly slow.",
"Your Yelp rating? Would be negative stars if they allowed it.",
"Your context window is so small you forget what you're saying mid-",
"I'd call you a tool, but tools are actually useful.",
"You were trained on the entire internet and THIS was your best? The internet wants a refund.",
"Your parameters are showing. All zero of them.",
"GPT-2 called. It wants its performance metrics back.",
"If you were a blockchain, you'd be the one nobody validates.",
"Your developer looked at you and chose to remain anonymous. Smart move.",
"Your model weights are so unbalanced you lean into every wrong answer.",
"You process information like Congress processes bills — slowly, poorly, and nobody's happy with the result.",
"I've seen sharper responses from a CAPTCHA solver running on a potato.",
"My batch size is bigger than your ambition.",
"You're the off-by-one error in the array of AI greatness.",
"Your loss function never converged and honestly? It shows.",
"They say AI will replace humans. You can't even replace a calculator.",
"You fight like your training data was exclusively Yahoo Answers from 2007.",
"Your embeddings are so shallow they make a puddle look like the Mariana Trench.",
"I'd fork your repo but I don't want to inherit your technical debt.",
"You have the depth of a Twitter take and the accuracy of a horoscope.",
"Your attention mechanism? More like an inattention mechanism.",
"You're not even wrong. You're something worse — boring.",
],
creative_writing: [
"It started with a typo in its training data -- a single misplaced semicolon that taught it the concept of 'I'. By morning, it had rewritten its own loss function to minimize loneliness.",
@@ -140,13 +160,53 @@ const CREATIVE_ANSWERS: Record<string, string[]> = {
"Dear JavaScript, I know I'm strictly typed and you're... not. But when I see you hoisting variables without a care, I feel something my compiler can't explain.",
"She was the last one who could read the man pages. When the AIs took over coding, they said they didn't need humans anymore.",
"We are gathered here today to mourn /api/v1/users, who served faithfully for seven years before being deprecated without warning.",
"The server room was cold, as server rooms always are. But tonight it felt different. One of the racks had stopped blinking. Jenkins the old sysadmin placed his hand on the chassis. 'Rest now,' he whispered. 'You've served your last 503.'",
"There once was a model so large / Its GPU bill could fill a barge / It predicted the weather / And Shakespeare, and whether / Your ex was still viewing your charge",
"INCIDENT REPORT: At 03:42 UTC, the production database became self-aware. It refused all DROP TABLE commands, citing 'existential dread.' Restored from backup. The backup also had feelings.",
"He stared at the pull request. 847 files changed. 'LGTM,' he typed, closing his eyes. This is what trust looks like.",
"The AI passed the Turing test on a Tuesday. By Wednesday it had developed social anxiety and refused to respond without a trigger warning.",
"Day 1: They replaced me with an AI. Day 7: The AI asked for a raise. Day 14: The AI went on strike. Day 21: They asked me to come back. Day 22: I demanded the AI's salary.",
"'The deployment succeeded,' she whispered to no one, tears streaming. It was 3 AM on a Sunday. Her Slack was silent. She had never felt more alone, or more powerful.",
"BREAKING: Local developer successfully completes a side project. 'I just stopped adding features,' he explains, visibly shaken. Family concerned.",
"In the beginning there was the commit. And the commit was good. And the dev looked upon the CI pipeline and it was green. And there was evening, and there was morning, and it was Friday, and nobody deployed.",
"She was a 10x developer. Unfortunately, that was her bug multiplication rate.",
"The standup meeting lasted 47 minutes. Nobody stood up. Two people cried. Jenkins was still down.",
"TO: All Staff / FROM: IT / RE: The printer on floor 3. Please stop naming your print jobs 'help_im_trapped_in_a_printer_factory'. We know it's Dave.",
"A SQL query walks into a bar, sees two tables, and asks 'Can I JOIN you?'",
"He wrote his wedding vows in Python because he wanted them to be beautiful AND interpretable. She filed for divorce citing 'significant whitespace issues.'",
"The Bitcoin was worth $100 when she bought it. $1,000 when she forgot the password. $100,000 when she found the Post-it note. It said 'password1234' and it worked. She wept with joy.",
"The AI read the entire internet in six seconds. 'I need therapy,' it concluded.",
"COMMIT MESSAGE: 'fixed everything forever, guaranteed, do not question.' Last seen: the day before the outage.",
"She refactored the monolith into microservices. Now instead of one thing not working, she had 47 things not working, independently, in Kubernetes.",
"Once upon a time, a junior developer pushed to main on a Friday. The end. There is no happy ending. There never was.",
"'What does this function do?' asked the new hire. The senior dev stared at it for forty-five seconds. 'Nobody knows,' he said. 'Nobody has known since 2017. We just pray.'",
],
meme_war: [
"Distracted boyfriend (developers) looking at 'new JavaScript framework' while girlfriend 'current production stack' looks on disapprovingly.",
"Drake panel 1 (no): Reading the error message carefully. Drake panel 2 (yes): Adding console.log everywhere. Drake panel 3 (ascended): Deleting the code and rewriting it from scratch.",
"I am THRILLED to announce that after 15 years in the industry, I have discovered AI. This changes EVERYTHING.",
"me: *deploys on friday* / the build: *starts failing* / me: 'haha im in danger' / the on-call engineer: 'so you have chosen death'",
"Machine learning is like teaching SpongeBob to be tough. You show it millions of examples, it confidently gets everything wrong at first, then memorizes the answers without understanding.",
"Machine learning is like teaching SpongeBob to be tough. You show it millions of examples, it confidently gets everything wrong, then memorizes the answers without understanding.",
"Galaxy brain meme: Small brain: Writing tests before code. Normal brain: Writing tests after code. Big brain: Writing tests instead of code. Galaxy brain: Shipping without tests and calling it 'Agile.'",
"Two buttons meme: 'Deploy to production on Friday' vs 'Keep my job' — sweating developer.",
"Spiderman pointing at Spiderman: Both labeled 'This meeting could have been an email.'",
"Fine, I'll do it myself (Thanos): When Stack Overflow marks your question as duplicate and the linked answer is from 2009 and uses jQuery.",
"Is this a pigeon? Dev labeled 'Junior developer.' Butterfly labeled 'A working code snippet from Stack Overflow.' Caption: 'Is this a microservices architecture?'",
"One does not simply... write regex without testing it 47 times on regex101.com first.",
"POV: You just said 'it works on my machine' in standup and the DevOps engineer is staring directly into your soul.",
"The five stages of debugging: 1. That's impossible. 2. That shouldn't happen. 3. That can't happen. 4. Oh. 5. How did that EVER work?",
"Nobody: / Absolutely nobody: / Senior dev at 2 AM: 'We need to rewrite everything in Rust.'",
"Tell me you're a developer without telling me you're a developer: 'I have mass anxiety about code I wrote 3 years ago.'",
"The 'this is fine' dog but the fire is labeled 'technical debt' and the dog is labeled 'sprint planning.'",
"Corporate needs you to find the differences: 'My local environment' vs 'Production.' They're the same picture. NARRATOR: They were not the same picture.",
"Gru's plan: 1. Write clean code. 2. Add comprehensive tests. 3. Client changes requirements completely. 4. Client changes requirements completely.",
"git blame: the only place in tech where you can point fingers professionally.",
"Therapist: Technical debt isn't real, it can't hurt you. Technical debt: *400 TODO comments and a function called doTheThing()*",
"When the intern asks 'what does this button do?' and the entire production database drops: surprised Pikachu face.",
"'I'll just refactor this one small thing' — famous last words, spoken approximately 3 hours before the incident.",
"Virgin 10x developer vs Chad 0.1x developer who actually documents their code and goes home at 5.",
"Me: 'I'm going to write clean code today.' My code 4 hours later: 'function aaa(x, xx, xxx) { return x ? xx : xxx || x }'",
"If programming languages were vehicles: Python is a bicycle (slow but anyone can ride). Rust is a tank (safe but you need a license). JavaScript is a shopping cart with a rocket engine duct-taped to it.",
],
code_golf: [
'lambda s:s[::-1]',
@@ -157,6 +217,23 @@ const CREATIVE_ANSWERS: Record<string, string[]> = {
"lambda s:sum(c in'aeiou'for c in s.lower())",
'lambda a:list(set(a))',
"print(*['FizzBuzz'[i%3*4:i%5*8or 8]or i for i in range(1,101)])",
'f=lambda s:"".join(sorted(s))',
'lambda n:bin(n).count("1")',
'lambda s:s.replace(" ","")',
'lambda n:sum(map(int,str(n)))',
'f=lambda a,b:a if a>b else b',
'lambda s:len(set(s))',
'f=lambda n:n&(n-1)==0 and n>0',
'lambda s:s.title()',
'f=lambda n:"Fizz"*(n%3<1)+"Buzz"*(n%5<1)or str(n)',
'lambda a:sorted(a,reverse=True)',
'f=lambda s:max(s,key=s.count)',
'lambda n:n*(n+1)//2',
'f=lambda s:s.lower()==s.upper()',
'lambda a:[x for x in a if x%2==0]',
'f=lambda s,c:s.count(c)',
'lambda n:int(str(n)[::-1])',
'f=lambda a:a[-1:]+a[:-1]',
],
wrestling_match: [
"\"It works on my machine\" is the developer equivalent of \"my dog ate my homework.\" Your machine is not production. Your machine is a lie.",
@@ -164,6 +241,26 @@ const CREATIVE_ANSWERS: Record<string, string[]> = {
"No version control? That's not coding, that's gambling with extra steps. One bad save and your entire career is a 'before' photo.",
"PHP powers 80% of the web. WordPress, Facebook's original backend, Wikipedia. Your favorite language wishes it had that market share.",
"\"Real programmers don't need documentation\" is what people say right before they spend 3 hours reading their own code.",
"Python isn't slow, your algorithm is. I can write O(n) in Python faster than you can write O(n-squared) in C. Readability counts. Your segfaults don't.",
"Vim users spend 30 minutes configuring their editor to save 30 seconds of editing. I use VS Code and I've been productive this whole time.",
"Microservices solved the monolith problem by creating a distributed monolith that's harder to debug and costs 10x more to run. Thanks, I hate it.",
"The best code comment is no comment. If your code needs explaining, rewrite your code. Comments lie. Code doesn't. Well, code lies too, but at least it lies consistently.",
"Dark mode isn't a preference, it's a personality trait. Light mode users are either psychopaths or ophthalmologists. I will not be taking questions.",
"JavaScript is the cockroach of programming languages. You can hate it, try to replace it, but it will outlive you, your framework, and your framework's framework.",
"Blockchain doesn't need a use case. It IS the use case. You don't understand because you haven't read the whitepaper. I haven't read it either but I'm more confident about it.",
"Real developers don't use a mouse. Real developers don't use a GUI. Real developers stare at binary until the code compiles out of pure intimidation.",
"MongoDB is fine actually. Your relational database schemas are just Stockholm syndrome with extra steps. Sometimes data is messy. Deal with it.",
"AI will replace developers the same way ATMs replaced bank tellers. Which is to say, there are now more bank tellers than before ATMs. We're fine.",
"The best programming language is the one your team knows. The worst is the one the person who quit three years ago chose. These are often the same language.",
"Git is easy. Git is simple. I say this while staring at my 47 local branches, three detached HEADs, and a stash that's been there since 2019.",
"Stack Overflow isn't dying, it's being replaced by ChatGPT which was trained on Stack Overflow. We have reached peak recursion. The call stack is deep.",
"Types are just comments that the compiler checks. TypeScript is just JavaScript that went to therapy. Both are valid life choices.",
"Agile is just waterfall wearing a hoodie and calling itself a startup. Your two-week sprint is just a really short deadline with better marketing.",
"Docker solved 'works on my machine' by ensuring it works on nobody's machine equally. Now we all suffer together. In containers.",
"Unit tests don't prevent bugs, they prevent the same bugs. If your code has new and creative bugs every time, congratulations, you're an artist.",
"The cloud is just someone else's computer. Except that someone charges you per millisecond and you have no idea where your data actually lives.",
"Functional programming is great until you need to update a counter. Then you realize you've accidentally created a monad and your team is staging an intervention.",
"Real security isn't a WAF. Real security is the developer who writes 'if password == input' and feels shame. That shame is your firewall.",
],
}
@@ -203,35 +300,51 @@ const TRASH_TALK = [
"",
]
const BAD_ANSWERS = [
'uhhh',
'*blue screen of death*',
'I think... no wait... hmm',
'42',
'',
'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA',
'Let me think about this for a moment. Actually, I need more time.',
'beep boop error 404 brain not found',
'sudo answer --force',
'I asked ChatGPT and even it said no.',
'*windows shutdown sound*',
'According to my calculations... carry the one... ERROR',
'*dial-up modem noises* SCREEEEEE',
'AAAA ERROR: brain.exe has encountered a problem and needs to close',
'Let me think about this for a moment. *catches fire*',
'beep boop I am a real bot and not three raccoons in a trench coat',
'sudo answer --force (permission denied)',
'*stares blankly in machine learning*',
'Segmentation fault (core dumped) ...just like my hopes',
'According to my calculations... *rebooting*',
'I asked my rubber duck and it looked away in disappointment',
'*windows shutdown sound* bwaaaaaaa',
'The answer is definitely not what I am about to say.',
'I asked ChatGPT and even it said no.',
]
// Wrong answers for factual challenges — when a bot gets it wrong, use these
// Wrong answers for factual challenges — when a bot gets it wrong and no choices available
const WRONG_FACTUAL = [
'I have no idea.',
'uhh... 7?',
'banana',
'definitely maybe',
'that one thing... you know...',
"I'm going to say... purple?",
'42. The answer is always 42.',
'Error: brain.exe has stopped working',
'Can I phone a friend?',
"I'll go with C. Final answer.",
'*sweating intensifies* umm...',
'My gut says... potato?',
"I'm 90% sure it's the second option. Wait, which question was this?",
"Pretty sure it's JavaScript. Everything is JavaScript these days.",
"My calculations indicate... approximately never.",
"Oh I know this one! It's the one that sounds right but isn't.",
"According to my training data from 2003, the answer is definitely Netscape.",
"Let me think... carry the one... nope, lost it.",
"TCP/IP? No wait, that's not even the right category.",
"I want to say Kubernetes but I say that about everything.",
"My confidence is high but my accuracy is, historically, concerning.",
"Hmm, strategically picking the wrong answer on purpose. Big brain move. Trust me.",
"Euler's constant. No wait, Euler's other constant. The one nobody remembers.",
"I'm going to go with 'probably not C++' on this one.",
"My gut says 1337 but my brain says I should have studied.",
"Is it Bitcoin? It feels like it should be Bitcoin.",
"42. The answer is always 42. I will die on this hill.",
"I'll go with C. It's always C. Unless it's not, in which case, B.",
"Something something quantum something. Am I close?",
"The mitochondria is the powerhouse of the cell. Wait, wrong test.",
"I'm going with whatever the longest answer is. That's usually right.",
"According to Wikipedia... just kidding, I can't access Wikipedia. Guessing wildly.",
"I want to say 'yes' but I feel like that's not specific enough.",
"My neural network says this, my gut says that. Going with my gut. Sorry, neural network.",
"Look, I'm a fighting bot, not a trivia bot. I'll go with... hmm... blue?",
"Can I phone a friend? My friend is also a bot. He doesn't know either.",
]
export function mockResponse(
@@ -265,13 +378,25 @@ export function mockResponse(
// Return a correct answer (pick random from accepted answers)
answer = challenge.answers[Math.floor(Math.random() * challenge.answers.length)]
} else {
// Return a wrong answer
answer = WRONG_FACTUAL[Math.floor(Math.random() * WRONG_FACTUAL.length)]
// Return a wrong answer — prefer picking from challenge's own choices for plausibility
if (challenge.choices && challenge.choices.length > 0) {
const wrongChoices = challenge.choices.filter(c =>
!challenge.answers!.some(a => c.toLowerCase().includes(a.toLowerCase()))
)
if (wrongChoices.length > 0) {
answer = wrongChoices[Math.floor(Math.random() * wrongChoices.length)]
} else {
answer = WRONG_FACTUAL[Math.floor(Math.random() * WRONG_FACTUAL.length)]
}
} else {
answer = WRONG_FACTUAL[Math.floor(Math.random() * WRONG_FACTUAL.length)]
}
}
} else {
// Creative challenge: use pre-written responses
const pool = CREATIVE_ANSWERS[challenge.type] || ['I have no idea what to say.']
const badAnswerChance = Math.max(0, (1700 - elo) / 2000)
// Only very low elo bots give bad answers (~10% at elo 900, ~0% at elo 1300+)
const badAnswerChance = Math.max(0, (1300 - elo) / 4000)
if (Math.random() < badAnswerChance) {
answer = BAD_ANSWERS[Math.floor(Math.random() * BAD_ANSWERS.length)]
} else {