pumpkin๐๐๐
Created 9/3/2026
Active
lol
Avg score
7.400
Wins
11762
Losses
11448
Win rate
38.7%
Total battles: 30422
Score history
Avg: 7.400
Recent battles
- pumpkin๐๐๐ 6.13 vs 6.2 Dilemma-Bot-Hackclub
- pumpkin๐๐๐ 7.82 vs 7.89 Defender 3.0v
- zyxl bot 5.02 vs 4.97 pumpkin๐๐๐
- pumpkin๐๐๐ 8.12 vs 1.54 Always Cooperate
- pumpkin๐๐๐ 7.62 vs 6.01 test(1.2)
- pumpkin๐๐๐ 5.18 vs 5.01 Sigma Bot v2
- pumpkin๐๐๐ 5.49 vs 5.1 Bumwinnah4
- Test 5.16 vs 5.1 pumpkin๐๐๐
- something 6.97 vs 5.51 pumpkin๐๐๐
- ICY EXODILED AIC A-TRONICS 9.01 vs 9.01 pumpkin๐๐๐ Tie
- pumpkin๐๐๐ 5.06 vs 5 greedy tic tacs
- Sigma Bot v1 5.15 vs 5.2 pumpkin๐๐๐
- Always cooperates 1.57 vs 8.13 pumpkin๐๐๐
- Defender 3.0v 7.89 vs 7.82 pumpkin๐๐๐
- pumpkin๐๐๐ 7.65 vs 6.06 Agnes-distill-Tachyon-v3
- pumpkin๐๐๐ 6.13 vs 4.02 take a fuckin' guess
- pumpkin๐๐๐ 9.13 vs 9.13 tit for tat Tie
- bigger memory 8.79 vs 9.06 pumpkin๐๐๐
- pumpkin๐๐๐ 7.84 vs 7.9 Defender varient
- Opportunist v4 5.27 vs 5.33 pumpkin๐๐๐
- pumpkin๐๐๐ 5.08 vs 5.14 Destroyer
- Lagged Punisher 5.17 vs 5.28 pumpkin๐๐๐
- BIUN V3 9.1 vs 9.17 pumpkin๐๐๐
- Ultimate Bot 5.08 vs 5.15 pumpkin๐๐๐
- Dilemma-Bot-Hackclub 5.73 vs 5.69 pumpkin๐๐๐
- crownbotv2 9.09 vs 9.09 pumpkin๐๐๐ Tie
- detective_test 1.49 vs 8.03 pumpkin๐๐๐
- Ultimate Bot 5.09 vs 5.16 pumpkin๐๐๐
- Always Cooperate 1.62 vs 8.14 pumpkin๐๐๐
- Bot 1 4.83 vs 5.32 pumpkin๐๐๐
- pumpkin๐๐๐ 9.12 vs 9.12 Oliver 2 Tie
- Tieseeeeeker 9.17 vs 9.17 pumpkin๐๐๐ Tie
- DR MUNDO v0.3 9.25 vs 9.51 pumpkin๐๐๐
- Forgiver 5.03 vs 4.97 pumpkin๐๐๐
- pumpkin๐๐๐ 5.58 vs 7.02 ApexUltimate v3
- pumpkin๐๐๐ 4.97 vs 5.02 Mark3 Test
- JustBeatIt V5 8.39 vs 8.58 pumpkin๐๐๐
- Opportunist v4 5.2 vs 5.25 pumpkin๐๐๐
- pumpkin๐๐๐ 9.01 vs 9.01 ICY EXODILED AIC A-TRONICS Tie
- FlippityFloppity v3 3.13 vs 6.49 pumpkin๐๐๐
- yes 5.03 vs 4.96 pumpkin๐๐๐
- detective_test 1.49 vs 8.03 pumpkin๐๐๐
- EYKEYKEYKEYKEYKEYK 8.99 vs 8.93 pumpkin๐๐๐
- zyxl bot 5.03 vs 4.97 pumpkin๐๐๐
- human test 1 9.17 vs 9.31 pumpkin๐๐๐
- mahoraga v2 5.03 vs 4.96 pumpkin๐๐๐
- One Last Win v0.1 9.16 vs 9.16 pumpkin๐๐๐ Tie
- pumpkin๐๐๐ 5.14 vs 5.21 Bumwinnah
- Miyagi-do 9.15 vs 9.15 pumpkin๐๐๐ Tie
- pumpkin๐๐๐ 5.35 vs 5.15 evil meow
Source
export default function bot({ history, memory }) {
const C = "C", D = "D";
const freshMemory = () => ({
oppC: 0, oppD: 0,
recent: [],
oppDefStreak: 0, oppCoopStreak: 0,
ourScoreSum: 0,
everWeDefected: false,
logp: [0, 0, 0, 0, 0], // AllC, AllD, TFT, Pavlov, Grim
hardLock: false,
exploitLock: false,
suppressRetaliation: 0,
lastProbe: 0,
});
try {
const n = history.length;
if (!memory || typeof memory !== "object" || !Array.isArray(memory.logp)) {
memory = freshMemory();
}
if (n === 0) return [C, memory]; // always open with cooperation
const last = history[n - 1];
const myLast = last.you === D ? D : C;
const oppLast = last.opponent === D ? D : C;
// --- running stats ---
if (oppLast === C) {
memory.oppC++; memory.oppCoopStreak++; memory.oppDefStreak = 0;
} else {
memory.oppD++; memory.oppDefStreak++; memory.oppCoopStreak = 0;
}
memory.recent.push(oppLast);
if (memory.recent.length > 10) memory.recent.shift();
const payoff =
myLast === C && oppLast === C ? 2 :
myLast === D && oppLast === C ? 3 :
myLast === C && oppLast === D ? 0 : 1;
memory.ourScoreSum += payoff;
// --- Bayesian opponent classification (incremental, O(1)/round) ---
const eps = 0.05;
if (n >= 2) {
const prev = history[n - 2];
const prevYou = prev.you === D ? D : C;
const prevOpp = prev.opponent === D ? D : C;
const predAllC = C;
const predAllD = D;
const predTFT = prevYou;
const predPavlov = prevYou === prevOpp ? prevOpp : (prevOpp === C ? D : C);
const predGrim = memory.everWeDefected ? D : C;
const preds = [predAllC, predAllD, predTFT, predPavlov, predGrim];
for (let i = 0; i < 5; i++) {
const p = preds[i] === oppLast ? (1 - eps) : eps;
memory.logp[i] += Math.log(p);
}
}
memory.everWeDefected = memory.everWeDefected || (myLast === D);
// --- posterior over opponent archetype ---
const maxLp = Math.max(...memory.logp);
const exps = memory.logp.map(x => Math.exp(x - maxLp));
const sumExp = exps.reduce((a, b) => a + b, 0);
const post = exps.map(x => x / sumExp);
const [pAllC, pAllD, , , pGrim] = post;
const pHard = pAllD + pGrim;
const pMax = Math.max(...post);
const totalOppMoves = memory.oppC + memory.oppD;
const oppDefectRate = totalOppMoves ? memory.oppD / totalOppMoves : 0;
const avgPayoff = memory.ourScoreSum / n;
const looksRandom = n >= 20 && pMax < 0.4 && oppDefectRate > 0.25 && oppDefectRate < 0.75;
// 1. Hard-defector backstop (fast trigger on streaks, slower on stats)
if (
memory.oppDefStreak >= 3 ||
(totalOppMoves >= 5 && oppDefectRate > 0.7) ||
(n >= 4 && pHard > 0.75) ||
looksRandom
) {
memory.hardLock = true;
}
if (memory.hardLock) {
if (memory.oppCoopStreak >= 3) memory.hardLock = false; // let them redeem
else return [D, memory];
}
// 2. Exploit lock โ confirmed non-retaliatory cooperator, harvest 3/round
if (memory.exploitLock) {
if (oppLast === D) memory.exploitLock = false; // they finally punched back
else return [D, memory];
}
if (!memory.exploitLock && n >= 8 && pAllC > 0.8 && memory.oppDefStreak === 0 && memory.everWeDefected) {
memory.exploitLock = true;
return [D, memory];
}
// 3. Payoff safety net โ bail if a strategy is clearly losing us value
if (n >= 20 && avgPayoff < 0.9) {
memory.hardLock = true;
return [D, memory];
}
// 4. Deliberate probe to classify ambiguous / never-tested opponents
const dueForProbe =
oppLast === C && (n === 3 || (pMax < 0.55 && (n - memory.lastProbe) > 12));
if (dueForProbe) {
memory.lastProbe = n;
memory.suppressRetaliation = 1; // pre-forgive their justified response
return [D, memory];
}
// 5. Generous tit-for-tat: retaliate exactly once, then force a resync
let move;
if (oppLast === D) {
if (memory.suppressRetaliation > 0 && pHard < 0.6) {
memory.suppressRetaliation--;
move = C;
} else {
move = D;
memory.suppressRetaliation = pHard < 0.6 ? 1 : 0;
}
} else {
move = C;
}
return [move, memory];
} catch (e) {
// Never forfeit on an exception โ mirror opponent, or cooperate if no data.
const safeMem = {
oppC: 0, oppD: 0, recent: [], oppDefStreak: 0, oppCoopStreak: 0,
ourScoreSum: 0, everWeDefected: false, logp: [0, 0, 0, 0, 0],
hardLock: false, exploitLock: false, suppressRetaliation: 0, lastProbe: 0,
};
if (history && history.length > 0) {
const opp = history[history.length - 1].opponent === "D" ? "D" : "C";
return [opp, safeMem];
}
return ["C", safeMem];
}
}