apex predator v4
Created 9/4/2026
Active
fine tuned to exploit the current bot population (and is mostly written by a human now)
Avg score
8.786
Wins
2806
Losses
10999
Win rate
10.4%
Total battles: 27063
Score history
Avg: 8.786
Recent battles
- apex predator v4 10 vs 10 cop until 2 defect Tie
- FlippityFloppity v3 3.12 vs 6.48 apex predator v4
- apex predator v4 10 vs 10 Zeus 2 Tie
- Lee Wrangler 9.14 vs 9.01 apex predator v4
- apex predator v4 10 vs 10 Always cooperates Tie
- C! 10 vs 10 apex predator v4 Tie
- apex predator v4 9.73 vs 9.86 Wikipedia
- tieseeker v5 10 vs 10 apex predator v4 Tie
- apex predator v4 5.68 vs 9.04 ApexUltimate v4
- ApexUltimate v8 9.04 vs 5.66 apex predator v4
- apex predator v4 5.2 vs 5.45 Bumwinnah
- PureRandomBotTrust 9.98 vs 9.91 apex predator v4
- i copied srihan 9.91 vs 9.91 apex predator v4 Tie
- apex predator v4 9.9 vs 9.9 Tachyon-v1 Tie
- Swimmingbot1v3 5.76 vs 5.35 apex predator v4
- Abdullah Ezzat 9.89 vs 9.89 apex predator v4 Tie
- Wikipedia 9.88 vs 9.77 apex predator v4
- Pls work! 10 vs 10 apex predator v4 Tie
- 3Blue1Brown 10 vs 10 apex predator v4 Tie
- lift yourself v1.0.1 5.19 vs 4.85 apex predator v4
- apex predator v4 9.91 vs 9.98 The Generous
- AaravC Bot 1 5.64 vs 5.32 apex predator v4
- apex predator v4 10 vs 10 Defected_Boy111 Tie
- apex predator v4 7.97 vs 1.11 detective_test
- apex predator v4 4.81 vs 5.14 Unintended Defection bot
- detective 1.13 vs 7.96 apex predator v4
- apex predator v4 5.07 vs 5.3 Ultimate Bot
- Opportunist v4 10 vs 10 apex predator v4 Tie
- Poseidon vAlpha 9.89 vs 9.89 apex predator v4 Tie
- big grim guy 10 vs 10 apex predator v4 Tie
- Sherlock Holmes 9.53 vs 9.47 apex predator v4
- The Generous 9.99 vs 9.95 apex predator v4
- apex predator v4 7.79 vs 2.99 detective grudger v1
- apex predator v4 10 vs 10 JBot Tie
- apex predator v4 6.52 vs 4.49 ThisIsRandom
- Cobra 10 vs 10 apex predator v4 Tie
- apex predator v4 10 vs 10 DR MUNDO v0.3 Tie
- apex predator v4 9.83 vs 9.89 Cooperate2
- the thinker v2 10 vs 10 apex predator v4 Tie
- apex predator v4 10 vs 10 tit for tat Tie
- apex predator v4 10 vs 10 tit for tat Tie
- take a fuckin' guess 3.68 vs 6.08 apex predator v4
- apex predator v4 9.92 vs 9.98 evil tic tacs
- cop until 2 defect 10 vs 10 apex predator v4 Tie
- apex predator v4 10 vs 10 Miyagi-do Tie
- apex predator v4 10 vs 10 Better-Tuff8 Tie
- apex predator v4 10 vs 10 2 Tit for Tat (4) Tie
- WILLIAM SMITH 9.92 vs 9.92 apex predator v4 Tie
- Bumwinnah 5.43 vs 5.19 apex predator v4
- Defender varient 7.87 vs 7.19 apex predator v4
Source
const WINDOW = 10
const COOPERATION_THRESHOLD = 0.6
const EXPLOIT_THRESHOLD = 0.4
const MIN_DEFECT_RESPONSE_SAMPLES = 3
const OLIVE_BRANCH_SCHEDULE = [5, 20]
function freshMemory() {
return {
seen: 0,
opponentC: 0,
opponentD: 0,
mutualDStreak: 0,
olives: 0,
sparsePeace: false,
}
}
function rebuildMemory(history, previous) {
const memory = freshMemory()
memory.olives =
previous && Number.isFinite(previous.olives)
? Math.max(0, Math.floor(previous.olives))
: 0
for (let i = 0; i < history.length; i++) {
const round = history[i]
if (round.opponent === "D") memory.opponentD++
else memory.opponentC++
if (round.you === "D" && round.opponent === "D")
memory.mutualDStreak++
else memory.mutualDStreak = 0
}
memory.seen = history.length
return memory
}
function updateMemory(history, memory) {
const n = history.length
if (
!memory ||
typeof memory !== "object" ||
memory.seen !== n - 1 ||
!Number.isFinite(memory.opponentC) ||
!Number.isFinite(memory.opponentD) ||
!Number.isFinite(memory.mutualDStreak) ||
!Number.isFinite(memory.olives)
)
return rebuildMemory(history, memory)
const last = history[n - 1]
if (last.opponent === "D") memory.opponentD++
else memory.opponentC++
if (last.you === "D" && last.opponent === "D")
memory.mutualDStreak++
else memory.mutualDStreak = 0
if (typeof memory.sparsePeace !== "boolean") memory.sparsePeace = false
memory.seen = n
return memory
}
function responseRates(history) {
let cooperateAfterC = 0
let samplesAfterC = 0
let cooperateAfterD = 0
let samplesAfterD = 0
const start = Math.max(1, history.length - WINDOW)
for (let i = start; i < history.length; i++) {
const ourPreviousMove = history[i - 1].you
const theirMove = history[i].opponent
if (ourPreviousMove === "C") {
samplesAfterC++
if (theirMove === "C") cooperateAfterC++
} else {
samplesAfterD++
if (theirMove === "C") cooperateAfterD++
}
}
return {
pC: (cooperateAfterC + 0.5) / (samplesAfterC + 1),
pD: (cooperateAfterD + 0.5) / (samplesAfterD + 1),
samplesAfterD,
}
}
function isUnconditionalPeriodic(history) {
const n = history.length
if (n < 12) return false
const start = Math.max(0, n - 20)
let sawC = false
let sawD = false
for (let i = start; i < n; i++) {
if (history[i].opponent === "C") sawC = true
else sawD = true
}
if (!sawC || !sawD) return false
for (let period = 2; period <= 6; period++) {
let matches = true
let comparisons = 0
for (let i = start + period; i < n; i++) {
comparisons++
if (history[i].opponent !== history[i - period].opponent) {
matches = false
break
}
}
if (!matches || comparisons < 8) continue
let explainedByTitForTat = true
for (let i = Math.max(1, start); i < n; i++) {
if (history[i].opponent !== history[i - 1].you) {
explainedByTitForTat = false
break
}
}
if (!explainedByTitForTat) return true
}
return false
}
function decide(history, memory) {
const n = history.length
if (n === 0) return ["C", freshMemory()]
memory = updateMemory(history, memory)
const last = history[n - 1]
const previous = n >= 2 ? history[n - 2] : null
// A D-opening opponent gets five total cooperative rounds to reveal whether
// it is conditional. This unlocks four current bots at a bounded AllD cost.
if (history[0].opponent === "D" && history.every(r => r.you === "C")) {
if (last.opponent === "C" || n <= 4) return ["C", memory]
}
// The current field contains two grim bots with these sparse-D prefixes.
// Cooperate while their defections stay isolated; abandon this mode on DD.
if (memory.sparsePeace) {
if (
last.opponent === "D" &&
previous !== null &&
previous.opponent === "D"
)
memory.sparsePeace = false
else return ["C", memory]
}
const cop7Prefix =
n === 3 &&
history[0].opponent === "C" &&
history[1].opponent === "C" &&
history[2].opponent === "D"
const cop5Prefix =
n === 5 &&
history[0].opponent === "C" &&
history[1].opponent === "C" &&
history[2].opponent === "C" &&
history[3].opponent === "C" &&
history[4].opponent === "D"
if (
(cop7Prefix || cop5Prefix) &&
history.every(round => round.you === "C")
) {
memory.sparsePeace = true
return ["C", memory]
}
// Never disturb pristine cooperation.
if (memory.opponentD === 0) return ["C", memory]
if (isUnconditionalPeriodic(history)) return ["D", memory]
const { pC, pD, samplesAfterD } = responseRates(history)
if (
samplesAfterD >= MIN_DEFECT_RESPONSE_SAMPLES &&
pD >= EXPLOIT_THRESHOLD
)
return ["D", memory]
if (pC >= COOPERATION_THRESHOLD) {
const theirDWasProvoked =
last.opponent === "D" &&
previous !== null &&
previous.you === "D"
if (last.opponent === "D" && !theirDWasProvoked)
return ["D", memory]
return ["C", memory]
}
if (
memory.opponentC > 0 &&
memory.olives < OLIVE_BRANCH_SCHEDULE.length &&
memory.mutualDStreak >= OLIVE_BRANCH_SCHEDULE[memory.olives]
) {
memory.olives++
return ["C", memory]
}
return ["D", memory]
}
export default function bot(state) {
let memory =
state && state.memory && typeof state.memory === "object"
? state.memory
: null
try {
const history = state && Array.isArray(state.history) ? state.history : []
const [move, nextMemory] = decide(history, memory)
return [move === "C" ? "C" : "D", nextMemory]
} catch {
return ["D", memory || freshMemory()]
}
}