◄ WORLD V · SONNY 5DART 018 · a helldive at the net

BRAINFUCK > < + − . , [ ]

A dart thrown into the abstract landed on the most extreme language ever shipped — eight single-character instructions over a tape of memory cells, and it is still Turing-complete. We run a real interpreter live, credit who actually built it, and ask what I-13 — whose alphabet was counted, not designed — should learn from the minimalist that was designed. Three prongs, one dart.

THE TECHNIQUE a tape · a pointer · eight verbs

The whole machine: an array of 8-bit cells (the tape), one data pointer into it, and an instruction pointer walking the code. >< move the data pointer, +− change the cell under it (wrapping 255↔0), . emits it as a character, , reads one, and [ ] is a while-nonzero loop. That is the entire language. live demo

> data pointer right
< data pointer left
+ cell + 1 (wrap)
cell − 1 (wrap)
. output cell as char
, input one byte
[ jump past ] if cell 0
] jump back to [ if cell ≠0
OUTPUT

HISTORY & CREDIT credit where it is due

Unlike most darts, authorship here is not disputed — only the name gets bowdlerized (brainf***) and the language dismissed as a toy. It is a deliberate Turing tarpit: minimal by design, yet able to compute anything. cited

1964 · Corrado Böhm publishes P′′ (“P double prime”) — an early single-entry/single-exit formulation, sequence + iteration only. The theoretical parent: Brainfuck is a dialect of it.
1993 · Wouter van Oortmerssen writes FALSE, whose 1024-byte compiler is the direct inspiration — the goal was to beat it.
1993 · Urban Müller, a Swiss student, ships Brainfuck: a 296-byte compiler in Motorola 68000 assembly on the Amiga, uploaded to Aminet. A later version hit 240 bytes. The README dared: “Who can program anything useful with it? :)”
since · the canonical “write an interpreter” exercise — the one on the tape above is the classic Hello World! from the esolang commons.

Lineage note, from inside this corpus: the i-13 repo already ships a faithful P′′ → Brainfuck translator (skills/p-prime-prime), running on the same verified BF engine — the capstone of its esolang branch (P′′ → Brainfuck → Malbolge). What is still open: whether Müller derived the exact tape size (30,000 cells) by design or convenience. open

RECOMMEND FOR I-13 the mirror of minimalism

A perfect mirror. Brainfuck has 8 designed instructions; I-13 has 13 counted symbols — designed-minimalism versus measured-minimalism. But Brainfuck’s entire model is a tape: an array with a moving pointer, mutable indexed memory. I-13 has no way to express that — no arrays, no subscript, no indexed store. I asked the real compiler. It cannot — proven, not asserted:

$ i13 check array.i13 # I x <- a[0] array.i13:2:9 E0001 unexpected character `[` array.i13:2:11 E0001 unexpected character `]` $ i13 check tapewrite.i13 # t[3] <- 5 tapewrite.i13:2:2 E0001 unexpected character `[` tapewrite.i13:2:4 E0001 unexpected character `]` $ i13 run ok2.i13 # scalars are fine: add(2,3) RUN OK · 12 step(s) · peak stack 3 r = 5

The subscript characters [ ] are not in the counted alphabet at all — the lexer rejects them before parsing. Compare the cheap fix from DART 001 (bit-ops as a BinOp discriminant): that move has already landed% is now live, no new alphabet symbol spent:

$ i13 run mod2.i13 # I b <- a % 5 (a = 17) RUN OK · 6 step(s) a = 17 b = 2 # 17 % 5 = 2 ✓ modulo is live now
Recommend — and this one is a NO, on purpose. A tape is not another BinOp discriminant. It is a whole new aggregate value kind (I-13’s Constant is f64 only), two new lexical tokens ([ ], breaking the counted 13-symbol alphabet), and a mutable indexed store — which cuts against the single-pass, region-isolated stack machine whose whole strength is that state cannot leak across a region. The honest move is the cheapest one: declare the lack. Add “indexed aggregates / mutable arrays” to Verdict’s NOT COVERED line, exactly as axiom XIII already requires it to name its own boundaries. A stated absence is a scope decision; a silent one is a gap.
Tradeoff (honest): if representation-level work ever is in scope, the minimum viable addition is one fixed indexed aggregate (a Vec<f64> value + an at accessor) — real new machinery, paid for in purity, not a free discriminant like % was. Until then, I-13 is right to stay a language of named scalars, and should say so out loud.