{"format":"automata-studio/library-index","version":1,"generated":"2026-10-01T11:37:41.821Z","engine":"dev","repo":"thethinkmachine/automata-library","commit":"d2c9409c5c79a77e2d83f81f1b4e9f71579f4ebc","site":"https://thethinkmachine.github.io/automata-library/","entries":[{"id":"finite/dfa/binary-divisibility-by-3","path":"machines/finite/dfa/binary-divisibility-by-3.automaton","title":"Binary divisibility by 3","blurb":"Three states, one per remainder mod 3. Reading bit b takes remainder r to (2r + b) mod 3.","machine":"DFA","category":"fa","languageClass":"Regular","tags":["divisibility","remainder"],"author":{"login":"thethinkmachine","name":""},"license":"CC-BY-4.0","difficulty":"intro","chapter":"","standard":null,"added":"2026-09-28T20:47:35+05:30","updated":"2026-09-28T20:47:35+05:30","version":1,"hash":"3e0ad259bb7f9945","bytes":2217,"stats":{"states":3,"transitions":6,"sigma":["0","1"],"tapes":1,"blocks":0},"badges":[{"id":"tested","detail":"6 examples checked"},{"id":"deterministic","detail":""},{"id":"minimal","detail":"3 states"}],"behaviour":null,"fingerprint":"8abe1ea5a9ea665e","machineId":"24d91a00787f7e32","taskId":null,"dfa":{"sigma":["0","1"],"n":3,"start":0,"acc":[0],"delta":[0,1,2,0,1,2]},"sketch":{"n":[[150,200,3],[350,200,0],[550,200,0]],"e":[[0,0],[0,1],[1,0],[1,2],[2,1],[2,2]]},"tests":{"accepts":4,"rejects":2,"outputs":0},"forkOf":null,"remixes":[],"collections":["regular-languages"],"art":[{"kind":"diagram","path":"art/finite/dfa/binary-divisibility-by-3/diagram.svg"},{"kind":"language","path":"art/finite/dfa/binary-divisibility-by-3/language.svg"}]},{"id":"finite/dfa/binary-divisibility-by-5","path":"machines/finite/dfa/binary-divisibility-by-5.automaton","title":"Binary divisibility by 5","blurb":"Reads a binary number one bit at a time and accepts exactly the multiples of 5. Each state remembers the remainder so far — five states doing long division.","machine":"DFA","category":"fa","languageClass":"Regular","tags":["showcase","dfa"],"author":{"login":"thethinkmachine","name":""},"license":"CC-BY-4.0","difficulty":"intermediate","chapter":"","standard":null,"added":"2026-09-28T20:47:35+05:30","updated":"2026-09-28T20:47:35+05:30","version":1,"hash":"e393c8dc3f09e00d","bytes":3076,"stats":{"states":5,"transitions":10,"sigma":["0","1"],"tapes":1,"blocks":0},"badges":[{"id":"tested","detail":"5 examples checked"},{"id":"deterministic","detail":""},{"id":"minimal","detail":"5 states"}],"behaviour":null,"fingerprint":"debbfcf0f865e91d","machineId":"ef9f90f5ea12d644","taskId":null,"dfa":{"sigma":["0","1"],"n":5,"start":0,"acc":[0],"delta":[0,1,2,3,4,0,1,2,3,4]},"sketch":{"n":[[420,110,3],[601,241,0],[532,454,0],[308,454,0],[239,241,0]],"e":[[0,0],[0,1],[1,2],[1,3],[2,4],[2,0],[3,1],[3,2],[4,3],[4,4]]},"tests":{"accepts":3,"rejects":2,"outputs":0},"forkOf":null,"remixes":[],"collections":["regular-languages"],"art":[{"kind":"diagram","path":"art/finite/dfa/binary-divisibility-by-5/diagram.svg"},{"kind":"language","path":"art/finite/dfa/binary-divisibility-by-5/language.svg"}]},{"id":"finite/dfa/even-number-of-1s","path":"machines/finite/dfa/even-number-of-1s.automaton","title":"even number of 1s","blurb":"The textbook Deterministic Finite Automaton example.","machine":"DFA","category":"fa","languageClass":"Regular","tags":["textbook","dfa"],"author":{"login":"thethinkmachine","name":""},"license":"CC-BY-4.0","difficulty":"intro","chapter":"","standard":null,"added":"2026-09-28T20:47:35+05:30","updated":"2026-09-28T20:47:35+05:30","version":1,"hash":"e52c161119dcfa87","bytes":1068,"stats":{"states":2,"transitions":4,"sigma":["0","1"],"tapes":1,"blocks":0},"badges":[{"id":"deterministic","detail":""},{"id":"minimal","detail":"2 states"}],"behaviour":null,"fingerprint":"8fef9ff6e91b2ecf","machineId":"3881521275e135a9","taskId":null,"dfa":{"sigma":["0","1"],"n":2,"start":0,"acc":[0],"delta":[0,1,1,0]},"sketch":{"n":[[140,200,3],[360,200,0]],"e":[[0,0],[0,1],[1,1],[1,0]]},"tests":{"accepts":0,"rejects":0,"outputs":0},"forkOf":null,"remixes":[],"collections":["regular-languages"],"art":[{"kind":"diagram","path":"art/finite/dfa/even-number-of-1s/diagram.svg"},{"kind":"language","path":"art/finite/dfa/even-number-of-1s/language.svg"}]},{"id":"finite/enfa/a-then-b","path":"machines/finite/enfa/a-then-b.automaton","title":"a* then b*","blurb":"The textbook Finite Automaton with ε-Transitions example.","machine":"ε-NFA","category":"fa","languageClass":"Regular","tags":["textbook","nfa"],"author":{"login":"thethinkmachine","name":""},"license":"CC-BY-4.0","difficulty":"intro","chapter":"","standard":null,"added":"2026-09-28T20:47:35+05:30","updated":"2026-09-28T20:47:35+05:30","version":1,"hash":"434bc399723802a2","bytes":1178,"stats":{"states":3,"transitions":4,"sigma":["a","b"],"tapes":1,"blocks":0},"badges":[],"behaviour":null,"fingerprint":"ca8b535baf20d593","machineId":"ab7ac0374c2b0e05","taskId":null,"dfa":{"sigma":["a","b"],"n":4,"start":0,"acc":[0,1,2],"delta":[1,2,1,3,3,2,3,3]},"sketch":{"n":[[100,200,3],[300,120,2],[300,280,2]],"e":[[0,1],[0,2],[1,1],[2,2]]},"tests":{"accepts":0,"rejects":0,"outputs":0},"forkOf":null,"remixes":[],"collections":["regular-languages"],"art":[{"kind":"diagram","path":"art/finite/enfa/a-then-b/diagram.svg"},{"kind":"language","path":"art/finite/enfa/a-then-b/language.svg"}]},{"id":"finite/enfa/float-regex-compiled","path":"machines/finite/enfa/float-regex-compiled.automaton","title":"Float regex, compiled","blurb":"The regex [+-]?d+(.d+)? as an ε-NFA, where d stands for any digit — what a regex engine actually builds. ε-jumps make the sign optional; the fraction needs a digit after the dot.","machine":"ε-NFA","category":"fa","languageClass":"Regular","tags":["showcase","nfa"],"author":{"login":"thethinkmachine","name":""},"license":"CC-BY-4.0","difficulty":"intermediate","chapter":"","standard":null,"added":"2026-09-28T20:47:35+05:30","updated":"2026-09-28T20:47:35+05:30","version":1,"hash":"2260c9f376ca7921","bytes":3168,"stats":{"states":5,"transitions":8,"sigma":["d",".","+","-"],"tapes":1,"blocks":0},"badges":[{"id":"tested","detail":"6 examples checked"}],"behaviour":null,"fingerprint":"d541f170c1a0013d","machineId":"b25af6be1c145022","taskId":null,"dfa":{"sigma":["+","-",".","d"],"n":6,"start":0,"acc":[3,5],"delta":[1,1,2,3,2,2,2,3,2,2,2,2,2,2,4,3,2,2,2,5,2,2,2,5]},"sketch":{"n":[[110,260,1],[300,260,0],[490,260,2],[680,260,0],[870,260,2]],"e":[[0,1],[1,2],[2,2],[2,3],[3,4],[4,4]]},"tests":{"accepts":4,"rejects":2,"outputs":0},"forkOf":null,"remixes":[],"collections":["regular-languages"],"art":[{"kind":"diagram","path":"art/finite/enfa/float-regex-compiled/diagram.svg"},{"kind":"language","path":"art/finite/enfa/float-regex-compiled/language.svg"}]},{"id":"finite/nfa/guess-the-penultimate-1","path":"machines/finite/nfa/guess-the-penultimate-1.automaton","title":"guess the penultimate 1","blurb":"The textbook Nondeterministic Finite Automaton example.","machine":"NFA","category":"fa","languageClass":"Regular","tags":["textbook","nfa"],"author":{"login":"thethinkmachine","name":""},"license":"CC-BY-4.0","difficulty":"intro","chapter":"","standard":null,"added":"2026-09-28T20:47:35+05:30","updated":"2026-09-28T20:47:35+05:30","version":1,"hash":"0eb3e38115db1577","bytes":1512,"stats":{"states":4,"transitions":7,"sigma":["0","1"],"tapes":1,"blocks":0},"badges":[],"behaviour":null,"fingerprint":"5745c81133f60bd2","machineId":"bb1738570e4eabea","taskId":null,"dfa":{"sigma":["0","1"],"n":8,"start":0,"acc":[4,5,6,7],"delta":[0,1,2,3,4,5,6,7,0,1,2,3,4,5,6,7]},"sketch":{"n":[[100,200,1],[250,200,0],[400,200,0],[550,200,2]],"e":[[0,0],[0,1],[1,2],[2,3]]},"tests":{"accepts":0,"rejects":0,"outputs":0},"forkOf":null,"remixes":[],"collections":["regular-languages"],"art":[{"kind":"diagram","path":"art/finite/nfa/guess-the-penultimate-1/diagram.svg"},{"kind":"language","path":"art/finite/nfa/guess-the-penultimate-1/language.svg"}]},{"id":"finite/nfa/keyword-search-cat-car-cab","path":"machines/finite/nfa/keyword-search-cat-car-cab.automaton","title":"Keyword search: cat | car | cab","blurb":"Accepts any string that contains cat, car, or cab. The Σ self-loops let the NFA start a match at every position simultaneously — multi-pattern text search as an automaton.","machine":"NFA","category":"fa","languageClass":"Regular","tags":["showcase","nfa"],"author":{"login":"thethinkmachine","name":""},"license":"CC-BY-4.0","difficulty":"intermediate","chapter":"","standard":null,"added":"2026-09-28T20:47:35+05:30","updated":"2026-09-28T20:47:35+05:30","version":1,"hash":"5818a0f0cdbcdbb9","bytes":2792,"stats":{"states":4,"transitions":7,"sigma":["c","a","t","r","b"],"tapes":1,"blocks":0},"badges":[{"id":"tested","detail":"5 examples checked"}],"behaviour":null,"fingerprint":"174418f3c575cdc4","machineId":"289410d38475a351","taskId":null,"dfa":{"sigma":["a","b","c","r","t"],"n":4,"start":0,"acc":[3],"delta":[0,0,1,0,0,2,0,1,0,0,0,3,1,3,3,3,3,3,3,3]},"sketch":{"n":[[130,260,1],[340,260,0],[550,260,0],[770,260,2]],"e":[[0,0],[0,1],[1,2],[2,3],[3,3]]},"tests":{"accepts":3,"rejects":2,"outputs":0},"forkOf":null,"remixes":[],"collections":["regular-languages"],"art":[{"kind":"diagram","path":"art/finite/nfa/keyword-search-cat-car-cab/diagram.svg"}]},{"id":"finite/pfa/classic-rabin-s-cut-point-language","path":"machines/finite/pfa/classic-rabin-s-cut-point-language.automaton","title":"Classic: Rabin's cut-point language","blurb":"The accepting mass after w is the binary fraction 0.wᴿ. With cut-point 0.5 the machine accepts exactly the words whose reversed binary value exceeds one half.","machine":"PFA","category":"fa","languageClass":"Stochastic","tags":["textbook","pfa"],"author":{"login":"thethinkmachine","name":""},"license":"CC-BY-4.0","difficulty":"intro","chapter":"","standard":null,"added":"2026-09-28T20:47:35+05:30","updated":"2026-09-28T20:47:35+05:30","version":1,"hash":"4a2c660d45cc8978","bytes":2899,"stats":{"states":2,"transitions":6,"sigma":["0","1"],"tapes":1,"blocks":0},"badges":[{"id":"tested","detail":"6 examples checked"}],"behaviour":null,"fingerprint":null,"machineId":"96878bcc52a16d37","taskId":null,"dfa":null,"sketch":{"n":[[240,280,1],[640,280,2]],"e":[[0,0],[0,1],[1,0],[1,1]]},"tests":{"accepts":2,"rejects":4,"outputs":0},"forkOf":null,"remixes":[],"collections":[],"art":[{"kind":"diagram","path":"art/finite/pfa/classic-rabin-s-cut-point-language/diagram.svg"},{"kind":"language","path":"art/finite/pfa/classic-rabin-s-cut-point-language/language.svg"}]},{"id":"finite/pfa/noisy-channel-does-it-end-in-a","path":"machines/finite/pfa/noisy-channel-does-it-end-in-a.automaton","title":"Noisy channel: does it end in a?","blurb":"A two-state probabilistic automaton over a 10% noisy channel. The accepting mass is 0.9 after an a and 0.1 after a b, so cut-point 0.5 recovers the language \"ends in a\" despite the noise.","machine":"PFA","category":"fa","languageClass":"Stochastic","tags":["showcase","pfa"],"author":{"login":"thethinkmachine","name":""},"license":"CC-BY-4.0","difficulty":"intermediate","chapter":"","standard":null,"added":"2026-09-28T20:47:35+05:30","updated":"2026-09-28T20:47:35+05:30","version":1,"hash":"67e258cf010a82d6","bytes":3151,"stats":{"states":2,"transitions":8,"sigma":["a","b"],"tapes":1,"blocks":0},"badges":[{"id":"tested","detail":"6 examples checked"}],"behaviour":null,"fingerprint":null,"machineId":"d061bb94573ef7b2","taskId":null,"dfa":null,"sketch":{"n":[[240,280,1],[640,280,2]],"e":[[0,1],[0,0],[1,1],[1,0]]},"tests":{"accepts":3,"rejects":3,"outputs":0},"forkOf":null,"remixes":[],"collections":[],"art":[{"kind":"diagram","path":"art/finite/pfa/noisy-channel-does-it-end-in-a/diagram.svg"},{"kind":"language","path":"art/finite/pfa/noisy-channel-does-it-end-in-a/language.svg"}]},{"id":"finite/twdfa/last-letter-scan","path":"machines/finite/twdfa/last-letter-scan.automaton","title":"last-letter scan","blurb":"The textbook Two-Way Deterministic Finite Automaton example.","machine":"2DFA","category":"fa","languageClass":"Regular","tags":["textbook","2dfa"],"author":{"login":"thethinkmachine","name":""},"license":"CC-BY-4.0","difficulty":"intro","chapter":"","standard":null,"added":"2026-09-28T20:47:35+05:30","updated":"2026-09-28T20:47:35+05:30","version":1,"hash":"c205a93dea52a890","bytes":1837,"stats":{"states":5,"transitions":8,"sigma":["a","b"],"tapes":1,"blocks":0},"badges":[{"id":"deterministic","detail":""}],"behaviour":null,"fingerprint":null,"machineId":"70115dfe3e1b13f0","taskId":null,"dfa":null,"sketch":{"n":[[120,220,1],[300,140,0],[480,140,0],[480,300,0],[660,220,2]],"e":[[0,1],[1,2],[1,3],[2,2],[2,3],[3,2],[3,3],[2,4]]},"tests":{"accepts":0,"rejects":0,"outputs":0},"forkOf":null,"remixes":[],"collections":[],"art":[{"kind":"diagram","path":"art/finite/twdfa/last-letter-scan/diagram.svg"},{"kind":"language","path":"art/finite/twdfa/last-letter-scan/language.svg"}]},{"id":"finite/twdfa/two-passes-one-head","path":"machines/finite/twdfa/two-passes-one-head.automaton","title":"Two passes, one head","blurb":"Checks even a's on the way out and odd b's on the way back — the head bounces off the end marker and re-reads the input. Multiple passes replace memory.","machine":"2DFA","category":"fa","languageClass":"Regular","tags":["showcase","2dfa"],"author":{"login":"thethinkmachine","name":""},"license":"CC-BY-4.0","difficulty":"intermediate","chapter":"","standard":null,"added":"2026-09-28T20:47:35+05:30","updated":"2026-09-28T20:47:35+05:30","version":1,"hash":"e58a15a6861ea396","bytes":3355,"stats":{"states":5,"transitions":11,"sigma":["a","b"],"tapes":1,"blocks":0},"badges":[{"id":"tested","detail":"5 examples checked"},{"id":"deterministic","detail":""}],"behaviour":null,"fingerprint":null,"machineId":"40a3ea246fee8337","taskId":null,"dfa":null,"sketch":{"n":[[150,160,1],[430,160,0],[430,380,0],[150,380,0],[660,270,2]],"e":[[0,0],[0,1],[0,2],[1,0],[1,1],[2,2],[2,3],[3,3],[3,2],[3,4]]},"tests":{"accepts":3,"rejects":2,"outputs":0},"forkOf":null,"remixes":[],"collections":["regular-languages"],"art":[{"kind":"diagram","path":"art/finite/twdfa/two-passes-one-head/diagram.svg"},{"kind":"language","path":"art/finite/twdfa/two-passes-one-head/language.svg"}]},{"id":"finite/twnfa/deja-vu-the-last-letter-is-a-rerun","path":"machines/finite/twnfa/deja-vu-the-last-letter-is-a-rerun.automaton","title":"Déjà vu: the last letter is a rerun","blurb":"Accepts strings whose final letter occurred earlier too. The 2NFA guesses the earlier occurrence, races to the end marker, and steps back to confirm the match.","machine":"2NFA","category":"fa","languageClass":"Regular","tags":["showcase","2nfa"],"author":{"login":"thethinkmachine","name":""},"license":"CC-BY-4.0","difficulty":"intermediate","chapter":"","standard":null,"added":"2026-09-28T20:47:35+05:30","updated":"2026-09-28T20:47:35+05:30","version":1,"hash":"40a448b116cf5d87","bytes":4316,"stats":{"states":8,"transitions":17,"sigma":["a","b"],"tapes":1,"blocks":0},"badges":[{"id":"tested","detail":"6 examples checked"}],"behaviour":null,"fingerprint":null,"machineId":"9a217615f41350f8","taskId":null,"dfa":null,"sketch":{"n":[[130,270,1],[360,150,0],[590,150,0],[820,150,0],[360,390,0],[590,390,0],[820,390,0],[950,270,2]],"e":[[0,0],[0,1],[0,4],[1,2],[2,2],[2,3],[3,7],[4,5],[5,5],[5,6],[6,7]]},"tests":{"accepts":3,"rejects":3,"outputs":0},"forkOf":null,"remixes":[],"collections":["regular-languages"],"art":[{"kind":"diagram","path":"art/finite/twnfa/deja-vu-the-last-letter-is-a-rerun/diagram.svg"},{"kind":"language","path":"art/finite/twnfa/deja-vu-the-last-letter-is-a-rerun/language.svg"}]},{"id":"finite/twnfa/guess-and-check","path":"machines/finite/twnfa/guess-and-check.automaton","title":"guess and check","blurb":"The textbook Two-Way Nondeterministic Finite Automaton example.","machine":"2NFA","category":"fa","languageClass":"Regular","tags":["textbook","2nfa"],"author":{"login":"thethinkmachine","name":""},"license":"CC-BY-4.0","difficulty":"intro","chapter":"","standard":null,"added":"2026-09-28T20:47:35+05:30","updated":"2026-09-28T20:47:35+05:30","version":1,"hash":"62231da1f82fc54c","bytes":1647,"stats":{"states":4,"transitions":7,"sigma":["a","b"],"tapes":1,"blocks":0},"badges":[],"behaviour":null,"fingerprint":null,"machineId":"6dd30438281b00e2","taskId":null,"dfa":null,"sketch":{"n":[[140,220,1],[330,220,0],[500,160,0],[650,220,2]],"e":[[0,1],[1,1],[1,2],[2,2],[2,3]]},"tests":{"accepts":0,"rejects":0,"outputs":0},"forkOf":null,"remixes":[],"collections":[],"art":[{"kind":"diagram","path":"art/finite/twnfa/guess-and-check/diagram.svg"},{"kind":"language","path":"art/finite/twnfa/guess-and-check/language.svg"}]},{"id":"memory/counter/anbn","path":"machines/memory/counter/anbn.automaton","title":"aⁿbⁿ","blurb":"The textbook One-Counter Automaton example.","machine":"Counter","category":"mem","languageClass":"One-counter","tags":["textbook","counter"],"author":{"login":"thethinkmachine","name":""},"license":"CC-BY-4.0","difficulty":"intro","chapter":"","standard":null,"added":"2026-09-28T20:47:35+05:30","updated":"2026-09-28T20:47:35+05:30","version":1,"hash":"5e7628aefccbf6c4","bytes":1505,"stats":{"states":3,"transitions":5,"sigma":["a","b"],"tapes":1,"blocks":0},"badges":[],"behaviour":null,"fingerprint":null,"machineId":"54e9157a415ae387","taskId":null,"dfa":null,"sketch":{"n":[[120,220,1],[360,220,0],[600,220,2]],"e":[[0,0],[0,1],[1,1],[1,2]]},"tests":{"accepts":0,"rejects":0,"outputs":0},"forkOf":null,"remixes":[],"collections":[],"art":[{"kind":"diagram","path":"art/memory/counter/anbn/diagram.svg"},{"kind":"language","path":"art/memory/counter/anbn/language.svg"}]},{"id":"memory/counter/bank-account-never-overdrawn","path":"machines/memory/counter/bank-account-never-overdrawn.automaton","title":"Bank account: never overdrawn","blurb":"Deposits (+) and withdrawals (−) where the balance never goes negative and ends at exactly zero. One counter separates this from anything a DFA could ever check.","machine":"Counter","category":"mem","languageClass":"One-counter","tags":["showcase","counter"],"author":{"login":"thethinkmachine","name":""},"license":"CC-BY-4.0","difficulty":"intermediate","chapter":"","standard":null,"added":"2026-09-28T20:47:35+05:30","updated":"2026-09-28T20:47:35+05:30","version":1,"hash":"fd69f3d090096834","bytes":2512,"stats":{"states":2,"transitions":3,"sigma":["+","-"],"tapes":1,"blocks":0},"badges":[{"id":"tested","detail":"6 examples checked"}],"behaviour":null,"fingerprint":null,"machineId":"17fde703f81dbdd6","taskId":null,"dfa":null,"sketch":{"n":[[260,260,1],[580,260,2]],"e":[[0,0],[0,1]]},"tests":{"accepts":3,"rejects":3,"outputs":0},"forkOf":null,"remixes":[],"collections":["beyond-regular"],"art":[{"kind":"diagram","path":"art/memory/counter/bank-account-never-overdrawn/diagram.svg"},{"kind":"language","path":"art/memory/counter/bank-account-never-overdrawn/language.svg"}]},{"id":"memory/epda/anbncndn-four-counts-one-stack-of-stacks","path":"machines/memory/epda/anbncndn-four-counts-one-stack-of-stacks.automaton","title":"aⁿbⁿcⁿdⁿ — four counts, one stack of stacks","blurb":"Two independent stacks would be Turing power; one stack whose elements are stacks is exactly enough. The a's and b's are matched on the working stack while the c's and d's are parked beneath it, to be picked up in order once it is gone.","machine":"EPDA","category":"mem","languageClass":"Tree-adjoining (mildly context-sensitive)","tags":["showcase","epda"],"author":{"login":"thethinkmachine","name":""},"license":"CC-BY-4.0","difficulty":"intermediate","chapter":"","standard":null,"added":"2026-09-28T20:47:35+05:30","updated":"2026-09-28T20:47:35+05:30","version":1,"hash":"88db6ab00f33bbc2","bytes":4849,"stats":{"states":6,"transitions":9,"sigma":["a","b","c","d"],"tapes":1,"blocks":0},"badges":[{"id":"tested","detail":"8 examples checked"}],"behaviour":null,"fingerprint":null,"machineId":"c1b527b68e3d3d5a","taskId":null,"dfa":null,"sketch":{"n":[[120,200,1],[320,200,0],[520,200,0],[720,200,0],[920,200,0],[1120,200,2]],"e":[[0,1],[1,1],[1,2],[2,2],[2,3],[3,3],[3,4],[4,4],[4,5]]},"tests":{"accepts":3,"rejects":5,"outputs":0},"forkOf":null,"remixes":[],"collections":["beyond-regular"],"art":[{"kind":"diagram","path":"art/memory/epda/anbncndn-four-counts-one-stack-of-stacks/diagram.svg"}]},{"id":"memory/npda/mirrored-string-w-wr","path":"machines/memory/npda/mirrored-string-w-wr.automaton","title":"mirrored string w·wʳ","blurb":"The textbook Nondeterministic Pushdown Automaton example.","machine":"NPDA","category":"mem","languageClass":"Context-free","tags":["textbook","npda"],"author":{"login":"thethinkmachine","name":""},"license":"CC-BY-4.0","difficulty":"intro","chapter":"","standard":null,"added":"2026-09-28T20:47:35+05:30","updated":"2026-09-28T20:47:35+05:30","version":1,"hash":"fcce19a73053e34f","bytes":2428,"stats":{"states":3,"transitions":12,"sigma":["a","b"],"tapes":1,"blocks":0},"badges":[],"behaviour":null,"fingerprint":null,"machineId":"89a132d41b4f6298","taskId":null,"dfa":null,"sketch":{"n":[[100,200,1],[300,200,0],[500,200,2]],"e":[[0,0],[0,1],[1,1],[1,2]]},"tests":{"accepts":0,"rejects":0,"outputs":0},"forkOf":null,"remixes":[],"collections":[],"art":[{"kind":"diagram","path":"art/memory/npda/mirrored-string-w-wr/diagram.svg"},{"kind":"language","path":"art/memory/npda/mirrored-string-w-wr/language.svg"}]},{"id":"memory/npda/palindromes-guess-the-middle","path":"machines/memory/npda/palindromes-guess-the-middle.automaton","title":"Palindromes: guess the middle","blurb":"Accepts even-length palindromes over {a,b}. The machine pushes symbols, nondeterministically guesses where the middle is, then pops and matches the mirror half.","machine":"NPDA","category":"mem","languageClass":"Context-free","tags":["showcase","npda"],"author":{"login":"thethinkmachine","name":""},"license":"CC-BY-4.0","difficulty":"intermediate","chapter":"","standard":null,"added":"2026-09-28T20:47:35+05:30","updated":"2026-09-28T20:47:35+05:30","version":1,"hash":"e995691a839b382c","bytes":2856,"stats":{"states":3,"transitions":6,"sigma":["a","b"],"tapes":1,"blocks":0},"badges":[{"id":"tested","detail":"5 examples checked"}],"behaviour":null,"fingerprint":null,"machineId":"f06206bcea2d045e","taskId":null,"dfa":null,"sketch":{"n":[[180,260,1],[470,260,0],[740,260,2]],"e":[[0,0],[0,1],[1,1],[1,2]]},"tests":{"accepts":3,"rejects":2,"outputs":0},"forkOf":null,"remixes":[],"collections":["beyond-regular"],"art":[{"kind":"diagram","path":"art/memory/npda/palindromes-guess-the-middle/diagram.svg"},{"kind":"language","path":"art/memory/npda/palindromes-guess-the-middle/language.svg"}]},{"id":"memory/pda/anbn","path":"machines/memory/pda/anbn.automaton","title":"aⁿbⁿ","blurb":"The textbook Deterministic Pushdown Automaton example.","machine":"DPDA","category":"mem","languageClass":"Deterministic context-free","tags":["textbook","dpda"],"author":{"login":"thethinkmachine","name":""},"license":"CC-BY-4.0","difficulty":"intro","chapter":"","standard":null,"added":"2026-09-28T20:47:35+05:30","updated":"2026-09-28T20:47:35+05:30","version":1,"hash":"20d4d9e6ce255956","bytes":1513,"stats":{"states":3,"transitions":5,"sigma":["a","b"],"tapes":1,"blocks":0},"badges":[{"id":"deterministic","detail":""}],"behaviour":null,"fingerprint":null,"machineId":"c8f02ac81edd75e3","taskId":null,"dfa":null,"sketch":{"n":[[120,200,1],[360,200,0],[600,200,2]],"e":[[0,0],[0,1],[1,1],[1,2]]},"tests":{"accepts":0,"rejects":0,"outputs":0},"forkOf":null,"remixes":[],"collections":["beyond-regular"],"art":[{"kind":"diagram","path":"art/memory/pda/anbn/diagram.svg"},{"kind":"language","path":"art/memory/pda/anbn/language.svg"}]},{"id":"memory/pda/bracket-matcher","path":"machines/memory/pda/bracket-matcher.automaton","title":"Bracket matcher ( ) [ ] { }","blurb":"Balanced-bracket checking — what your editor does on every keystroke. One state; the stack does all the work. Accepts by empty stack.","machine":"DPDA","category":"mem","languageClass":"Deterministic context-free","tags":["showcase","dpda"],"author":{"login":"thethinkmachine","name":""},"license":"CC-BY-4.0","difficulty":"intermediate","chapter":"","standard":null,"added":"2026-09-28T20:47:35+05:30","updated":"2026-09-28T20:47:35+05:30","version":1,"hash":"ff770698cd0d90a0","bytes":2720,"stats":{"states":1,"transitions":6,"sigma":["(",")","[","]","{","}"],"tapes":1,"blocks":0},"badges":[{"id":"tested","detail":"5 examples checked"},{"id":"deterministic","detail":""}],"behaviour":null,"fingerprint":null,"machineId":"fdcd1967ca9f28ff","taskId":null,"dfa":null,"sketch":{"n":[[300,280,1]],"e":[[0,0]]},"tests":{"accepts":3,"rejects":2,"outputs":0},"forkOf":null,"remixes":[],"collections":["beyond-regular"],"art":[{"kind":"diagram","path":"art/memory/pda/bracket-matcher/diagram.svg"},{"kind":"language","path":"art/memory/pda/bracket-matcher/language.svg"}]},{"id":"memory/queue/enqueue-then-match","path":"machines/memory/queue/enqueue-then-match.automaton","title":"enqueue then match","blurb":"The textbook Queue Automaton example.","machine":"QA","category":"mem","languageClass":"Recursively enumerable","tags":["textbook","qa"],"author":{"login":"thethinkmachine","name":""},"license":"CC-BY-4.0","difficulty":"intro","chapter":"","standard":null,"added":"2026-09-28T20:47:35+05:30","updated":"2026-09-28T20:47:35+05:30","version":1,"hash":"c436b2ef4511d8c8","bytes":1115,"stats":{"states":3,"transitions":2,"sigma":["a","b"],"tapes":1,"blocks":0},"badges":[],"behaviour":null,"fingerprint":null,"machineId":"d27390b849365481","taskId":null,"dfa":null,"sketch":{"n":[[140,220,1],[360,220,0],[580,220,2]],"e":[[0,1],[1,2]]},"tests":{"accepts":0,"rejects":0,"outputs":0},"forkOf":null,"remixes":[],"collections":[],"art":[{"kind":"diagram","path":"art/memory/queue/enqueue-then-match/diagram.svg"}]},{"id":"memory/queue/perfect-copy-w-w","path":"machines/memory/queue/perfect-copy-w-w.automaton","title":"Perfect copy: w#w","blurb":"Accepts w#w — an exact repetition. No PDA can do this (stacks reverse), but FIFO order makes it natural: the queue front always holds the next symbol the copy must produce.","machine":"QA","category":"mem","languageClass":"Recursively enumerable","tags":["showcase","qa"],"author":{"login":"thethinkmachine","name":""},"license":"CC-BY-4.0","difficulty":"intermediate","chapter":"","standard":null,"added":"2026-09-28T20:47:35+05:30","updated":"2026-09-28T20:47:35+05:30","version":1,"hash":"20adf85d54d78b0d","bytes":2694,"stats":{"states":2,"transitions":5,"sigma":["a","b","#"],"tapes":1,"blocks":0},"badges":[{"id":"tested","detail":"5 examples checked"}],"behaviour":null,"fingerprint":null,"machineId":"fc28cf2fe00a701d","taskId":null,"dfa":null,"sketch":{"n":[[220,260,1],[540,260,0]],"e":[[0,0],[0,1],[1,1]]},"tests":{"accepts":3,"rejects":2,"outputs":0},"forkOf":null,"remixes":[],"collections":["beyond-regular"],"art":[{"kind":"diagram","path":"art/memory/queue/perfect-copy-w-w/diagram.svg"},{"kind":"language","path":"art/memory/queue/perfect-copy-w-w/language.svg"}]},{"id":"memory/twopda/anbncn-beyond-one-stack","path":"machines/memory/twopda/anbncn-beyond-one-stack.automaton","title":"aⁿbⁿcⁿ — beyond one stack","blurb":"The language that defines the limit of context-free: equal runs of a, b, and c. Stack 1 matches a's to b's while stack 2 matches b's to c's — two stacks reach Turing power.","machine":"2PDA","category":"mem","languageClass":"Recursively enumerable","tags":["showcase","2pda"],"author":{"login":"thethinkmachine","name":""},"license":"CC-BY-4.0","difficulty":"intermediate","chapter":"","standard":null,"added":"2026-09-28T20:47:35+05:30","updated":"2026-09-28T20:47:35+05:30","version":1,"hash":"2e8697fe5f3a068e","bytes":3429,"stats":{"states":4,"transitions":7,"sigma":["a","b","c"],"tapes":1,"blocks":0},"badges":[{"id":"tested","detail":"6 examples checked"}],"behaviour":null,"fingerprint":null,"machineId":"277c2caca553c3df","taskId":null,"dfa":null,"sketch":{"n":[[140,200,1],[400,200,0],[660,200,0],[400,420,2]],"e":[[0,0],[0,1],[1,1],[1,2],[2,2],[2,3],[0,3]]},"tests":{"accepts":3,"rejects":3,"outputs":0},"forkOf":null,"remixes":[],"collections":["beyond-regular"],"art":[{"kind":"diagram","path":"art/memory/twopda/anbncn-beyond-one-stack/diagram.svg"}]},{"id":"memory/twopda/two-stack-handoff","path":"machines/memory/twopda/two-stack-handoff.automaton","title":"two-stack handoff","blurb":"The textbook Two-Stack Pushdown Automaton example.","machine":"2PDA","category":"mem","languageClass":"Recursively enumerable","tags":["textbook","2pda"],"author":{"login":"thethinkmachine","name":""},"license":"CC-BY-4.0","difficulty":"intro","chapter":"","standard":null,"added":"2026-09-28T20:47:35+05:30","updated":"2026-09-28T20:47:35+05:30","version":1,"hash":"1cf169be9d659652","bytes":1468,"stats":{"states":4,"transitions":3,"sigma":["a","b"],"tapes":1,"blocks":0},"badges":[],"behaviour":null,"fingerprint":null,"machineId":"ec25f1de91ae4090","taskId":null,"dfa":null,"sketch":{"n":[[120,220,1],[320,220,0],[520,220,0],[700,220,2]],"e":[[0,1],[1,2],[2,3]]},"tests":{"accepts":0,"rejects":0,"outputs":0},"forkOf":null,"remixes":[],"collections":[],"art":[{"kind":"diagram","path":"art/memory/twopda/two-stack-handoff/diagram.svg"}]},{"id":"omega/buchi/classic-eventually-always-b","path":"machines/omega/buchi/classic-eventually-always-b.automaton","title":"Classic: eventually always b","blurb":"FG b — from some point on, only b's. The textbook example of a language recognised by a nondeterministic Büchi automaton but by no deterministic one.","machine":"NBA","category":"omega","languageClass":"ω-regular","tags":["textbook","nba"],"author":{"login":"thethinkmachine","name":""},"license":"CC-BY-4.0","difficulty":"intro","chapter":"","standard":null,"added":"2026-09-28T20:47:35+05:30","updated":"2026-09-28T20:47:35+05:30","version":1,"hash":"cf13088817850ffd","bytes":2511,"stats":{"states":2,"transitions":4,"sigma":["a","b"],"tapes":1,"blocks":0},"badges":[{"id":"tested","detail":"6 examples checked"}],"behaviour":null,"fingerprint":null,"machineId":"0833c56fe953f18a","taskId":null,"dfa":null,"sketch":{"n":[[240,280,1],[640,280,2]],"e":[[0,0],[0,1],[1,1]]},"tests":{"accepts":3,"rejects":3,"outputs":0},"forkOf":null,"remixes":[],"collections":["omega-zoo"],"art":[{"kind":"diagram","path":"art/omega/buchi/classic-eventually-always-b/diagram.svg"}]},{"id":"omega/buchi/infinitely-often-a","path":"machines/omega/buchi/infinitely-often-a.automaton","title":"Infinitely often a","blurb":"The canonical Büchi automaton for GF a: accepts exactly those infinite words containing infinitely many a's. Acceptance is about the cycle the run settles into, not where it stops.","machine":"NBA","category":"omega","languageClass":"ω-regular","tags":["showcase","nba"],"author":{"login":"thethinkmachine","name":""},"license":"CC-BY-4.0","difficulty":"intermediate","chapter":"","standard":null,"added":"2026-09-28T20:47:35+05:30","updated":"2026-09-28T20:47:35+05:30","version":1,"hash":"edcb91fe1bf63e71","bytes":2560,"stats":{"states":2,"transitions":4,"sigma":["a","b"],"tapes":1,"blocks":0},"badges":[{"id":"tested","detail":"6 examples checked"}],"behaviour":null,"fingerprint":null,"machineId":"cb7549cac88c9cb9","taskId":null,"dfa":null,"sketch":{"n":[[240,280,1],[640,280,2]],"e":[[0,0],[0,1],[1,1],[1,0]]},"tests":{"accepts":4,"rejects":2,"outputs":0},"forkOf":null,"remixes":[],"collections":["omega-zoo"],"art":[{"kind":"diagram","path":"art/omega/buchi/infinitely-often-a/diagram.svg"}]},{"id":"omega/dba/never-two-a-s-in-a-row","path":"machines/omega/dba/never-two-a-s-in-a-row.automaton","title":"Never two a's in a row","blurb":"A deterministic Büchi automaton for G¬(a ∧ Xa). One run per word, and acceptance reduces to never reaching the trap state — the shape most safety properties take.","machine":"DBA","category":"omega","languageClass":"Deterministic Büchi","tags":["showcase","dba"],"author":{"login":"thethinkmachine","name":""},"license":"CC-BY-4.0","difficulty":"intermediate","chapter":"","standard":null,"added":"2026-09-28T20:47:35+05:30","updated":"2026-09-28T20:47:35+05:30","version":1,"hash":"2491cf127af42992","bytes":3039,"stats":{"states":3,"transitions":6,"sigma":["a","b"],"tapes":1,"blocks":0},"badges":[{"id":"tested","detail":"7 examples checked"},{"id":"deterministic","detail":""}],"behaviour":null,"fingerprint":null,"machineId":"3606808261041201","taskId":null,"dfa":null,"sketch":{"n":[[220,250,3],[620,250,2],[420,490,0]],"e":[[0,0],[0,1],[1,0],[1,2],[2,2]]},"tests":{"accepts":4,"rejects":3,"outputs":0},"forkOf":null,"remixes":[],"collections":["omega-zoo"],"art":[{"kind":"diagram","path":"art/omega/dba/never-two-a-s-in-a-row/diagram.svg"}]},{"id":"omega/dcoba/eventually-always-b","path":"machines/omega/dcoba/eventually-always-b.automaton","title":"Eventually always b","blurb":"FG b as a deterministic co-Büchi automaton — the same language a Büchi automaton can only recognise by guessing. Swapping α from Büchi to co-Büchi is the entire difference.","machine":"DcoBA","category":"omega","languageClass":"co-Büchi ω-regular","tags":["showcase","dcoba"],"author":{"login":"thethinkmachine","name":""},"license":"CC-BY-4.0","difficulty":"intermediate","chapter":"","standard":null,"added":"2026-09-28T20:47:35+05:30","updated":"2026-09-28T20:47:35+05:30","version":1,"hash":"231705dadde39032","bytes":2703,"stats":{"states":2,"transitions":4,"sigma":["a","b"],"tapes":1,"blocks":0},"badges":[{"id":"tested","detail":"7 examples checked"},{"id":"deterministic","detail":""}],"behaviour":null,"fingerprint":null,"machineId":"84caa1ce965d64d9","taskId":null,"dfa":null,"sketch":{"n":[[240,280,1],[640,280,2]],"e":[[0,0],[0,1],[1,1],[1,0]]},"tests":{"accepts":4,"rejects":3,"outputs":0},"forkOf":null,"remixes":[],"collections":["omega-zoo"],"art":[{"kind":"diagram","path":"art/omega/dcoba/eventually-always-b/diagram.svg"}]},{"id":"omega/dpa/eventually-always-b-by-priority","path":"machines/omega/dpa/eventually-always-b-by-priority.automaton","title":"Eventually always b, by priority","blurb":"The same FG b, deterministic, with α as a per-state priority instead of a set. Parity is where determinism stops costing expressive power.","machine":"DPA","category":"omega","languageClass":"ω-regular","tags":["showcase","dpa"],"author":{"login":"thethinkmachine","name":""},"license":"CC-BY-4.0","difficulty":"intermediate","chapter":"","standard":null,"added":"2026-09-28T20:47:35+05:30","updated":"2026-09-28T20:47:35+05:30","version":1,"hash":"f53d2ad35c2fa775","bytes":2734,"stats":{"states":2,"transitions":4,"sigma":["a","b"],"tapes":1,"blocks":0},"badges":[{"id":"tested","detail":"7 examples checked"},{"id":"deterministic","detail":""}],"behaviour":null,"fingerprint":null,"machineId":"ebb126277d7185ab","taskId":null,"dfa":null,"sketch":{"n":[[240,280,1],[640,280,0]],"e":[[0,0],[0,1],[1,1],[1,0]]},"tests":{"accepts":4,"rejects":3,"outputs":0},"forkOf":null,"remixes":[],"collections":["omega-zoo"],"art":[{"kind":"diagram","path":"art/omega/dpa/eventually-always-b-by-priority/diagram.svg"}]},{"id":"omega/ncoba/eventually-always-b-with-a-needless-guess","path":"machines/omega/ncoba/eventually-always-b-with-a-needless-guess.automaton","title":"Eventually always b, with a needless guess","blurb":"FG b as a nondeterministic co-Büchi automaton, carrying a guess it does not need — a demonstration that NcoBA = DcoBA.","machine":"NcoBA","category":"omega","languageClass":"co-Büchi ω-regular","tags":["showcase","ncoba"],"author":{"login":"thethinkmachine","name":""},"license":"CC-BY-4.0","difficulty":"intermediate","chapter":"","standard":null,"added":"2026-09-28T20:47:35+05:30","updated":"2026-09-28T20:47:35+05:30","version":1,"hash":"66a952eeeefd6f67","bytes":2886,"stats":{"states":3,"transitions":6,"sigma":["a","b"],"tapes":1,"blocks":0},"badges":[{"id":"tested","detail":"6 examples checked"}],"behaviour":null,"fingerprint":null,"machineId":"231592c2f6409090","taskId":null,"dfa":null,"sketch":{"n":[[220,260,1],[620,260,2],[420,500,0]],"e":[[0,0],[0,1],[1,1],[1,0],[0,2],[2,2]]},"tests":{"accepts":3,"rejects":3,"outputs":0},"forkOf":null,"remixes":[],"collections":["omega-zoo"],"art":[{"kind":"diagram","path":"art/omega/ncoba/eventually-always-b-with-a-needless-guess/diagram.svg"}]},{"id":"omega/npa/infinitely-often-a-or-eventually-always-c","path":"machines/omega/npa/infinitely-often-a-or-eventually-always-c.automaton","title":"Infinitely often a, or eventually always c","blurb":"A nondeterministic parity automaton that forks between two conditions on its first symbol. Nondeterminism is a convenience here — NPA = DPA — unlike under Büchi.","machine":"NPA","category":"omega","languageClass":"ω-regular","tags":["showcase","npa"],"author":{"login":"thethinkmachine","name":""},"license":"CC-BY-4.0","difficulty":"intermediate","chapter":"","standard":null,"added":"2026-09-28T20:47:35+05:30","updated":"2026-09-28T20:47:35+05:30","version":1,"hash":"10e27efd2a684aa1","bytes":4435,"stats":{"states":5,"transitions":18,"sigma":["a","b","c"],"tapes":1,"blocks":0},"badges":[{"id":"tested","detail":"8 examples checked"}],"behaviour":null,"fingerprint":null,"machineId":"a0ad45159d151797","taskId":null,"dfa":null,"sketch":{"n":[[420,130,1],[180,380,0],[180,620,0],[700,380,0],[700,620,0]],"e":[[0,1],[0,2],[0,4],[0,3],[1,1],[1,2],[2,1],[2,2],[3,3],[3,4],[4,3],[4,4]]},"tests":{"accepts":5,"rejects":3,"outputs":0},"forkOf":null,"remixes":[],"collections":["omega-zoo"],"art":[{"kind":"diagram","path":"art/omega/npa/infinitely-often-a-or-eventually-always-c/diagram.svg"}]},{"id":"omega/nwa/never-two-a-s-with-a-needless-guess","path":"machines/omega/nwa/never-two-a-s-with-a-needless-guess.automaton","title":"Never two a's, with a needless guess","blurb":"A nondeterministic weak automaton for the same safety property as the DWA, with a redundant branch that leaves the SCC constraint intact.","machine":"NWA","category":"omega","languageClass":"Weak ω-regular","tags":["showcase","nwa"],"author":{"login":"thethinkmachine","name":""},"license":"CC-BY-4.0","difficulty":"intermediate","chapter":"","standard":null,"added":"2026-09-28T20:47:35+05:30","updated":"2026-09-28T20:47:35+05:30","version":1,"hash":"0a4d8f6229584410","bytes":3288,"stats":{"states":4,"transitions":9,"sigma":["a","b"],"tapes":1,"blocks":0},"badges":[{"id":"tested","detail":"7 examples checked"}],"behaviour":null,"fingerprint":null,"machineId":"454437d236b6d0c0","taskId":null,"dfa":null,"sketch":{"n":[[220,250,3],[620,250,2],[220,500,2],[620,500,0]],"e":[[0,0],[0,1],[1,0],[1,3],[3,3],[0,2],[2,2],[2,1]]},"tests":{"accepts":4,"rejects":3,"outputs":0},"forkOf":null,"remixes":[],"collections":["omega-zoo"],"art":[{"kind":"diagram","path":"art/omega/nwa/never-two-a-s-with-a-needless-guess/diagram.svg"}]},{"id":"transducers/fst/binary-gray-code","path":"machines/transducers/fst/binary-gray-code.automaton","title":"Binary → Gray code","blurb":"Streams a binary number into its Gray code (output = bit XOR previous bit). Adjacent values end up differing in exactly one bit — the trick rotary encoders rely on.","machine":"FST","category":"special","languageClass":"Rational transduction","tags":["showcase","fst"],"author":{"login":"thethinkmachine","name":""},"license":"CC-BY-4.0","difficulty":"intermediate","chapter":"","standard":null,"added":"2026-09-28T20:47:35+05:30","updated":"2026-09-28T20:47:35+05:30","version":1,"hash":"affeb3903050ed88","bytes":2486,"stats":{"states":2,"transitions":4,"sigma":["0","1"],"tapes":1,"blocks":0},"badges":[{"id":"tested","detail":"5 examples checked"}],"behaviour":null,"fingerprint":null,"machineId":"ee771bdf451c38dc","taskId":null,"dfa":null,"sketch":{"n":[[260,260,1],[640,260,0]],"e":[[0,0],[0,1],[1,1],[1,0]]},"tests":{"accepts":0,"rejects":0,"outputs":5},"forkOf":null,"remixes":[],"collections":["transducers"],"art":[{"kind":"diagram","path":"art/transducers/fst/binary-gray-code/diagram.svg"}]},{"id":"transducers/fst/nondeterministic-rewriter","path":"machines/transducers/fst/nondeterministic-rewriter.automaton","title":"nondeterministic rewriter","blurb":"The textbook Finite State Transducer example.","machine":"FST","category":"special","languageClass":"Rational transduction","tags":["textbook","fst"],"author":{"login":"thethinkmachine","name":""},"license":"CC-BY-4.0","difficulty":"intro","chapter":"","standard":null,"added":"2026-09-28T20:47:35+05:30","updated":"2026-09-28T20:47:35+05:30","version":1,"hash":"670bf86b4eeb716c","bytes":1054,"stats":{"states":1,"transitions":3,"sigma":["a","b"],"tapes":1,"blocks":0},"badges":[],"behaviour":null,"fingerprint":null,"machineId":"c4c66c9435cc505f","taskId":null,"dfa":null,"sketch":{"n":[[300,220,3]],"e":[[0,0]]},"tests":{"accepts":0,"rejects":0,"outputs":0},"forkOf":null,"remixes":[],"collections":[],"art":[{"kind":"diagram","path":"art/transducers/fst/nondeterministic-rewriter/diagram.svg"}]},{"id":"transducers/mealy/report-each-bit","path":"machines/transducers/mealy/report-each-bit.automaton","title":"report each bit","blurb":"The textbook Mealy Machine example.","machine":"Mealy","category":"special","languageClass":"Rational transduction","tags":["textbook","mealy"],"author":{"login":"thethinkmachine","name":""},"license":"CC-BY-4.0","difficulty":"intro","chapter":"","standard":null,"added":"2026-09-28T20:47:35+05:30","updated":"2026-09-28T20:47:35+05:30","version":1,"hash":"912e6387649d9a47","bytes":1205,"stats":{"states":2,"transitions":4,"sigma":["0","1"],"tapes":1,"blocks":0},"badges":[{"id":"deterministic","detail":""}],"behaviour":null,"fingerprint":null,"machineId":"d1f7a7ea6a119b7e","taskId":null,"dfa":null,"sketch":{"n":[[160,200,3],[360,200,2]],"e":[[0,0],[0,1],[1,0],[1,1]]},"tests":{"accepts":0,"rejects":0,"outputs":0},"forkOf":null,"remixes":[],"collections":["transducers"],"art":[{"kind":"diagram","path":"art/transducers/mealy/report-each-bit/diagram.svg"}]},{"id":"transducers/mealy/serial-binary-adder","path":"machines/transducers/mealy/serial-binary-adder.automaton","title":"Serial binary adder","blurb":"Adds two arbitrarily long binary numbers with just two states: feed bit-pairs LSB-first, read the sum off the output. Carry in the state, nothing else — the circuit in your CPU.","machine":"Mealy","category":"special","languageClass":"Rational transduction","tags":["showcase","mealy"],"author":{"login":"thethinkmachine","name":""},"license":"CC-BY-4.0","difficulty":"intermediate","chapter":"","standard":null,"added":"2026-09-28T20:47:35+05:30","updated":"2026-09-28T20:47:35+05:30","version":1,"hash":"8abb7bd07314c116","bytes":2896,"stats":{"states":2,"transitions":8,"sigma":["00","01","10","11"],"tapes":1,"blocks":0},"badges":[{"id":"tested","detail":"3 examples checked"},{"id":"deterministic","detail":""}],"behaviour":null,"fingerprint":null,"machineId":"15a20caec488b473","taskId":null,"dfa":null,"sketch":{"n":[[260,260,1],[640,260,0]],"e":[[0,0],[0,1],[1,1],[1,0]]},"tests":{"accepts":0,"rejects":0,"outputs":3},"forkOf":null,"remixes":[],"collections":["transducers"],"art":[{"kind":"diagram","path":"art/transducers/mealy/serial-binary-adder/diagram.svg"}]},{"id":"transducers/moore/combination-lock-1101","path":"machines/transducers/moore/combination-lock-1101.automaton","title":"Combination lock: 1101","blurb":"Opens exactly when the last four digits entered were 1101. The fallback edges reuse overlapping progress instead of resetting — a Moore machine doing KMP string matching in hardware.","machine":"Moore","category":"special","languageClass":"Rational transduction","tags":["showcase","moore"],"author":{"login":"thethinkmachine","name":""},"license":"CC-BY-4.0","difficulty":"intermediate","chapter":"","standard":null,"added":"2026-09-28T20:47:35+05:30","updated":"2026-09-28T20:47:35+05:30","version":1,"hash":"84e9afe5d0ea7a0d","bytes":3429,"stats":{"states":5,"transitions":10,"sigma":["0","1"],"tapes":1,"blocks":0},"badges":[{"id":"tested","detail":"5 examples checked"},{"id":"deterministic","detail":""}],"behaviour":null,"fingerprint":null,"machineId":"60a07173e661244f","taskId":null,"dfa":null,"sketch":{"n":[[120,260,1],[320,260,0],[520,260,0],[720,260,0],[920,260,2]],"e":[[0,0],[0,1],[1,0],[1,2],[2,3],[2,2],[3,0],[3,4],[4,0],[4,2]]},"tests":{"accepts":3,"rejects":2,"outputs":2},"forkOf":null,"remixes":[],"collections":["transducers"],"art":[{"kind":"diagram","path":"art/transducers/moore/combination-lock-1101/diagram.svg"}]},{"id":"transducers/moore/traffic-light","path":"machines/transducers/moore/traffic-light.automaton","title":"traffic light","blurb":"The textbook Moore Machine example.","machine":"Moore","category":"special","languageClass":"Rational transduction","tags":["textbook","moore"],"author":{"login":"thethinkmachine","name":""},"license":"CC-BY-4.0","difficulty":"intro","chapter":"","standard":null,"added":"2026-09-28T20:47:35+05:30","updated":"2026-09-28T20:47:35+05:30","version":1,"hash":"d85b70caf6a7abd4","bytes":1189,"stats":{"states":3,"transitions":3,"sigma":["tick"],"tapes":1,"blocks":0},"badges":[{"id":"deterministic","detail":""}],"behaviour":null,"fingerprint":null,"machineId":"4b6763ccfed413a3","taskId":null,"dfa":null,"sketch":{"n":[[160,200,3],[360,200,0],[560,200,0]],"e":[[0,1],[1,2],[2,0]]},"tests":{"accepts":0,"rejects":0,"outputs":0},"forkOf":null,"remixes":[],"collections":["transducers"],"art":[{"kind":"diagram","path":"art/transducers/moore/traffic-light/diagram.svg"}]},{"id":"transducers/pdt/classic-anbn-bnan","path":"machines/transducers/pdt/classic-anbn-bnan.automaton","title":"Classic: aⁿbⁿ ↦ bⁿaⁿ","blurb":"Accepts aⁿbⁿ with the stack while printing b for every a and a for every b — so the output is bⁿaⁿ. Recognition and transduction in one machine.","machine":"PDT","category":"special","languageClass":"Pushdown transduction","tags":["textbook","pdt"],"author":{"login":"thethinkmachine","name":""},"license":"CC-BY-4.0","difficulty":"intro","chapter":"","standard":null,"added":"2026-09-28T20:47:35+05:30","updated":"2026-09-28T20:47:35+05:30","version":1,"hash":"469600ae83b114b7","bytes":2949,"stats":{"states":3,"transitions":4,"sigma":["a","b"],"tapes":1,"blocks":0},"badges":[{"id":"tested","detail":"5 examples checked"}],"behaviour":null,"fingerprint":null,"machineId":"76eeefa192f3b47d","taskId":null,"dfa":null,"sketch":{"n":[[200,280,1],[520,280,0],[820,280,2]],"e":[[0,0],[0,1],[1,1],[1,2]]},"tests":{"accepts":3,"rejects":2,"outputs":3},"forkOf":null,"remixes":[],"collections":[],"art":[{"kind":"diagram","path":"art/transducers/pdt/classic-anbn-bnan/diagram.svg"}]},{"id":"transducers/pdt/reverse-the-input","path":"machines/transducers/pdt/reverse-the-input.automaton","title":"Reverse the input","blurb":"Pushes every input symbol, then pops the stack printing as it goes — so the output is the input reversed. The transduction w ↦ wᴿ needs a stack; no one-way FST can compute it.","machine":"PDT","category":"special","languageClass":"Pushdown transduction","tags":["showcase","pdt"],"author":{"login":"thethinkmachine","name":""},"license":"CC-BY-4.0","difficulty":"intermediate","chapter":"","standard":null,"added":"2026-09-28T20:47:35+05:30","updated":"2026-09-28T20:47:35+05:30","version":1,"hash":"e1df4074b0ae978d","bytes":3348,"stats":{"states":3,"transitions":6,"sigma":["a","b"],"tapes":1,"blocks":0},"badges":[{"id":"tested","detail":"5 examples checked"}],"behaviour":null,"fingerprint":null,"machineId":"4cc744b916a1df79","taskId":null,"dfa":null,"sketch":{"n":[[200,280,1],[500,280,0],[800,280,2]],"e":[[0,0],[0,1],[1,1],[1,2]]},"tests":{"accepts":5,"rejects":0,"outputs":5},"forkOf":null,"remixes":[],"collections":["transducers"],"art":[{"kind":"diagram","path":"art/transducers/pdt/reverse-the-input/diagram.svg"}]},{"id":"transducers/twodft/classic-reverse-the-input","path":"machines/transducers/twodft/classic-reverse-the-input.automaton","title":"Classic: reverse the input","blurb":"Scans right in silence, then prints on the way back — computing w ↦ wᴿ with a finite state set and a two-way head, no stack required.","machine":"2DFT","category":"special","languageClass":"Regular transduction (two-way)","tags":["textbook","2dft"],"author":{"login":"thethinkmachine","name":""},"license":"CC-BY-4.0","difficulty":"intro","chapter":"","standard":null,"added":"2026-09-28T20:47:35+05:30","updated":"2026-09-28T20:47:35+05:30","version":1,"hash":"dc4345b1970dde46","bytes":3281,"stats":{"states":4,"transitions":7,"sigma":["a","b"],"tapes":1,"blocks":0},"badges":[{"id":"tested","detail":"5 examples checked"},{"id":"deterministic","detail":""}],"behaviour":null,"fingerprint":null,"machineId":"bd12e94d99f1d2cc","taskId":null,"dfa":null,"sketch":{"n":[[160,200,1],[460,200,0],[460,430,0],[160,430,2]],"e":[[0,1],[1,1],[1,2],[2,2],[2,3]]},"tests":{"accepts":5,"rejects":0,"outputs":5},"forkOf":null,"remixes":[],"collections":[],"art":[{"kind":"diagram","path":"art/transducers/twodft/classic-reverse-the-input/diagram.svg"}]},{"id":"transducers/twodft/copy-twice-w-ww","path":"machines/transducers/twodft/copy-twice-w-ww.automaton","title":"Copy twice: w ↦ ww","blurb":"Sweeps the input printing it, rewinds, then sweeps and prints again — doubling the word. The canonical transduction that separates two-way transducers from one-way ones.","machine":"2DFT","category":"special","languageClass":"Regular transduction (two-way)","tags":["showcase","2dft"],"author":{"login":"thethinkmachine","name":""},"license":"CC-BY-4.0","difficulty":"intermediate","chapter":"","standard":null,"added":"2026-09-28T20:47:35+05:30","updated":"2026-09-28T20:47:35+05:30","version":1,"hash":"321b0080ca5a3c07","bytes":3883,"stats":{"states":5,"transitions":10,"sigma":["a","b"],"tapes":1,"blocks":0},"badges":[{"id":"tested","detail":"5 examples checked"},{"id":"deterministic","detail":""}],"behaviour":null,"fingerprint":null,"machineId":"a5d0e1f365325a65","taskId":null,"dfa":null,"sketch":{"n":[[140,180,1],[430,180,0],[700,180,0],[430,420,0],[760,420,2]],"e":[[0,1],[1,1],[1,2],[2,2],[2,3],[3,3],[3,4]]},"tests":{"accepts":5,"rejects":0,"outputs":5},"forkOf":null,"remixes":[],"collections":["transducers"],"art":[{"kind":"diagram","path":"art/transducers/twodft/copy-twice-w-ww/diagram.svg"}]},{"id":"turing/busy-beaver/bb2","path":"machines/turing/busy-beaver/bb2.automaton","title":"BB(2) champion","blurb":"The two-state, two-symbol busy beaver: 6 steps, 4 ones. The largest number of steps any halting 2-state machine takes on a blank tape.","machine":"ITM","category":"tm","languageClass":"Recursively enumerable","tags":["standard-format","busy-beaver","champion"],"author":{"login":"thethinkmachine","name":""},"license":"CC-BY-4.0","difficulty":"","chapter":"Radó 1962, “On non-computable functions”","standard":"1RB1LB_1LA1RZ","added":"2026-09-28T20:47:35+05:30","updated":"2026-09-28T20:47:35+05:30","version":1,"hash":"941e0433b0fa70c4","bytes":1837,"stats":{"states":3,"transitions":4,"sigma":["1"],"tapes":1,"blocks":0},"badges":[{"id":"deterministic","detail":""},{"id":"halts","detail":"6 steps"}],"behaviour":{"verdict":"halts","method":"simulation","steps":6,"ones":4,"cells":4,"how":"accept"},"fingerprint":null,"machineId":"5cb52f41c3fc55ea","taskId":null,"dfa":null,"sketch":{"n":[[0,0,1],[179,0,0],[358,0,2]],"e":[[0,1],[1,0],[1,2]]},"tests":{"accepts":0,"rejects":0,"outputs":0},"forkOf":null,"remixes":[],"collections":["busy-beavers"],"art":[{"kind":"spacetime","path":"art/turing/busy-beaver/bb2/spacetime.svg"},{"kind":"diagram","path":"art/turing/busy-beaver/bb2/diagram.svg"}]},{"id":"turing/busy-beaver/bb2x3","path":"machines/turing/busy-beaver/bb2x3.automaton","title":"BB(2,3) champion","blurb":"Two states, three symbols: 38 steps.","machine":"ITM","category":"tm","languageClass":"Recursively enumerable","tags":["standard-format","busy-beaver","champion"],"author":{"login":"thethinkmachine","name":""},"license":"CC-BY-4.0","difficulty":"","chapter":"Radó 1962, “On non-computable functions”","standard":"1RB2LB1RZ_2LA2RB1LB","added":"2026-09-28T20:47:35+05:30","updated":"2026-09-28T20:47:35+05:30","version":1,"hash":"24a4c799a9b5a88b","bytes":2022,"stats":{"states":3,"transitions":6,"sigma":["1","2"],"tapes":1,"blocks":0},"badges":[{"id":"deterministic","detail":""},{"id":"halts","detail":"38 steps"}],"behaviour":{"verdict":"halts","method":"simulation","steps":38,"ones":9,"cells":9,"how":"accept"},"fingerprint":null,"machineId":"2ebedf94369028b7","taskId":null,"dfa":null,"sketch":{"n":[[0,0,1],[179,48,0],[179,-47,2]],"e":[[0,1],[0,2],[1,0],[1,1]]},"tests":{"accepts":0,"rejects":0,"outputs":0},"forkOf":null,"remixes":[],"collections":["busy-beavers"],"art":[{"kind":"spacetime","path":"art/turing/busy-beaver/bb2x3/spacetime.svg"},{"kind":"diagram","path":"art/turing/busy-beaver/bb2x3/diagram.svg"}]},{"id":"turing/busy-beaver/bb2x4","path":"machines/turing/busy-beaver/bb2x4.automaton","title":"BB(2,4) champion","blurb":"Two states, four symbols: 3,932,964 steps and 2,050 non-blank cells.","machine":"ITM","category":"tm","languageClass":"Recursively enumerable","tags":["standard-format","busy-beaver","champion"],"author":{"login":"thethinkmachine","name":""},"license":"CC-BY-4.0","difficulty":"","chapter":"Radó 1962, “On non-computable functions”","standard":"1RB2LA1RA1RA_1LB1LA3RB1RZ","added":"2026-09-28T20:47:35+05:30","updated":"2026-09-28T20:47:35+05:30","version":1,"hash":"e374afca32cfd963","bytes":2329,"stats":{"states":3,"transitions":8,"sigma":["1","2","3"],"tapes":1,"blocks":0},"badges":[{"id":"deterministic","detail":""},{"id":"halts","detail":"3,932,964 steps"}],"behaviour":{"verdict":"halts","method":"simulation","steps":3932964,"ones":2050,"cells":2050,"how":"accept"},"fingerprint":null,"machineId":"d660fad2514f9da7","taskId":null,"dfa":null,"sketch":{"n":[[0,0,1],[179,0,0],[358,0,2]],"e":[[0,1],[0,0],[1,1],[1,0],[1,2]]},"tests":{"accepts":0,"rejects":0,"outputs":0},"forkOf":null,"remixes":[],"collections":["busy-beavers"],"art":[{"kind":"spacetime","path":"art/turing/busy-beaver/bb2x4/spacetime.svg"},{"kind":"diagram","path":"art/turing/busy-beaver/bb2x4/diagram.svg"}]},{"id":"turing/busy-beaver/bb3-ones","path":"machines/turing/busy-beaver/bb3-ones.automaton","title":"BB(3) champion — most ones","blurb":"Three states, 6 ones: Σ(3). A different machine from the one that runs longest.","machine":"ITM","category":"tm","languageClass":"Recursively enumerable","tags":["standard-format","busy-beaver","champion"],"author":{"login":"thethinkmachine","name":""},"license":"CC-BY-4.0","difficulty":"","chapter":"Radó 1962, “On non-computable functions”","standard":"1RB1RZ_0RC1RB_1LC1LA","added":"2026-09-28T20:47:35+05:30","updated":"2026-09-28T20:47:35+05:30","version":1,"hash":"4ddaba1c094f8c6e","bytes":2144,"stats":{"states":4,"transitions":6,"sigma":["1"],"tapes":1,"blocks":0},"badges":[{"id":"deterministic","detail":""},{"id":"halts","detail":"14 steps"}],"behaviour":{"verdict":"halts","method":"simulation","steps":14,"ones":6,"cells":6,"how":"accept"},"fingerprint":null,"machineId":"7ed1be4bb435017e","taskId":null,"dfa":null,"sketch":{"n":[[0,0,1],[179,48,0],[358,0,0],[179,-47,2]],"e":[[0,1],[0,3],[1,2],[1,1],[2,2],[2,0]]},"tests":{"accepts":0,"rejects":0,"outputs":0},"forkOf":null,"remixes":[],"collections":["busy-beavers"],"art":[{"kind":"spacetime","path":"art/turing/busy-beaver/bb3-ones/spacetime.svg"},{"kind":"diagram","path":"art/turing/busy-beaver/bb3-ones/diagram.svg"}]},{"id":"turing/busy-beaver/bb3-steps","path":"machines/turing/busy-beaver/bb3-steps.automaton","title":"BB(3) champion — most steps","blurb":"Three states, 21 steps: the longest-running halting 3-state machine.","machine":"ITM","category":"tm","languageClass":"Recursively enumerable","tags":["standard-format","busy-beaver","champion"],"author":{"login":"thethinkmachine","name":""},"license":"CC-BY-4.0","difficulty":"","chapter":"Radó 1962, “On non-computable functions”","standard":"1RB1RZ_1LB0RC_1LC1LA","added":"2026-09-28T20:47:35+05:30","updated":"2026-09-28T20:47:35+05:30","version":1,"hash":"942c24bfb7a355d1","bytes":2133,"stats":{"states":4,"transitions":6,"sigma":["1"],"tapes":1,"blocks":0},"badges":[{"id":"deterministic","detail":""},{"id":"halts","detail":"21 steps"}],"behaviour":{"verdict":"halts","method":"simulation","steps":21,"ones":5,"cells":5,"how":"accept"},"fingerprint":null,"machineId":"41013ced34340f96","taskId":null,"dfa":null,"sketch":{"n":[[0,0,1],[179,48,0],[358,0,0],[179,-47,2]],"e":[[0,1],[0,3],[1,1],[1,2],[2,2],[2,0]]},"tests":{"accepts":0,"rejects":0,"outputs":0},"forkOf":null,"remixes":[],"collections":["busy-beavers"],"art":[{"kind":"spacetime","path":"art/turing/busy-beaver/bb3-steps/spacetime.svg"},{"kind":"diagram","path":"art/turing/busy-beaver/bb3-steps/diagram.svg"}]},{"id":"turing/busy-beaver/bb4","path":"machines/turing/busy-beaver/bb4.automaton","title":"BB(4) champion","blurb":"Brady’s four-state champion: 107 steps and 13 ones, proven optimal in 1983.","machine":"ITM","category":"tm","languageClass":"Recursively enumerable","tags":["standard-format","busy-beaver","champion"],"author":{"login":"thethinkmachine","name":""},"license":"CC-BY-4.0","difficulty":"","chapter":"Radó 1962, “On non-computable functions”","standard":"1RB1LB_1LA0LC_1RZ1LD_1RD0RA","added":"2026-09-28T20:47:35+05:30","updated":"2026-09-28T20:47:35+05:30","version":1,"hash":"a6c9448c8a276c66","bytes":2471,"stats":{"states":5,"transitions":8,"sigma":["1"],"tapes":1,"blocks":0},"badges":[{"id":"deterministic","detail":""},{"id":"halts","detail":"107 steps"}],"behaviour":{"verdict":"halts","method":"simulation","steps":107,"ones":13,"cells":14,"how":"accept"},"fingerprint":null,"machineId":"38c439fda741b06b","taskId":null,"dfa":null,"sketch":{"n":[[0,0,1],[179,0,0],[358,0,0],[537,-47,0],[537,48,2]],"e":[[0,1],[1,0],[1,2],[2,4],[2,3],[3,3],[3,0]]},"tests":{"accepts":0,"rejects":0,"outputs":0},"forkOf":null,"remixes":[],"collections":["busy-beavers"],"art":[{"kind":"spacetime","path":"art/turing/busy-beaver/bb4/spacetime.svg"},{"kind":"diagram","path":"art/turing/busy-beaver/bb4/diagram.svg"}]},{"id":"turing/busy-beaver/bb5","path":"machines/turing/busy-beaver/bb5.automaton","title":"BB(5) champion","blurb":"Marxen and Buntrock’s five-state machine: 47,176,870 steps and 4,098 ones. The bbchallenge project proved in 2024 that no halting 5-state machine runs longer.","machine":"ITM","category":"tm","languageClass":"Recursively enumerable","tags":["standard-format","busy-beaver","champion"],"author":{"login":"thethinkmachine","name":""},"license":"CC-BY-4.0","difficulty":"","chapter":"Radó 1962, “On non-computable functions”","standard":"1RB1LC_1RC1RB_1RD0LE_1LA1LD_1RZ0LA","added":"2026-09-28T20:47:35+05:30","updated":"2026-09-28T20:47:35+05:30","version":1,"hash":"2cda468c9098fe8c","bytes":2900,"stats":{"states":6,"transitions":10,"sigma":["1"],"tapes":1,"blocks":0},"badges":[{"id":"deterministic","detail":""},{"id":"halts","detail":"47,176,870 steps"}],"behaviour":{"verdict":"halts","method":"simulation","steps":47176870,"ones":4098,"cells":12289,"how":"accept"},"fingerprint":null,"machineId":"db41d97079551560","taskId":null,"dfa":null,"sketch":{"n":[[0,0,1],[179,-47,0],[179,48,0],[358,48,0],[358,-47,0],[537,0,2]],"e":[[0,1],[0,2],[1,2],[1,1],[2,3],[2,4],[3,0],[3,3],[4,5],[4,0]]},"tests":{"accepts":0,"rejects":0,"outputs":0},"forkOf":null,"remixes":[],"collections":["busy-beavers"],"art":[{"kind":"spacetime","path":"art/turing/busy-beaver/bb5/spacetime.svg"},{"kind":"diagram","path":"art/turing/busy-beaver/bb5/diagram.svg"}],"essay":{"path":"machines/turing/busy-beaver/bb5.md","hash":"d5e513ab878ad6eb","minutes":5}},{"id":"turing/ittm/bb-6-champion-runs-longer-than-2-5-steps","path":"machines/turing/ittm/bb-6-champion-runs-longer-than-2-5-steps.automaton","title":"BB(6) champion: runs longer than 2↑↑↑5 steps","blurb":"The 6-state, 2-symbol Turing machine behind the best known lower bound on BB(6), found by mxdys in June 2025. Started on a blank tape it halts, but only after more than 2↑↑↑5 steps, a number no simulation will ever reach.","machine":"ITM","category":"tm","languageClass":"Recursively enumerable","tags":["busy-beaver","turing-machine","bbchallenge","halting-problem","record"],"author":{"login":"thethinkmachine","name":"Shreyan Chaubey"},"license":"CC-BY-4.0","difficulty":"advanced","chapter":"https://scottaaronson.blog/?p=8972","standard":"1RB1RA_1RC1RZ_1LD0RF_1RA0LE_0LD1RC_1RA0RE","added":"2026-09-28T16:03:00Z","updated":"2026-09-28T16:03:00Z","version":1,"hash":"55818a8257542983","bytes":5022,"stats":{"states":7,"transitions":12,"sigma":["1"],"tapes":2,"blocks":0},"badges":[{"id":"deterministic","detail":""}],"behaviour":{"verdict":"unknown","method":null,"steps":200000000,"cells":17550},"fingerprint":null,"machineId":"ae615cbdbf92346e","taskId":null,"dfa":null,"sketch":{"n":[[0,0,1],[179,0,0],[358,48,0],[537,48,0],[716,0,0],[537,-47,0],[358,-47,2]],"e":[[0,1],[0,0],[1,2],[1,6],[2,3],[2,5],[3,0],[3,4],[4,3],[4,2],[5,0],[5,4]]},"tests":{"accepts":0,"rejects":0,"outputs":0},"forkOf":null,"remixes":[],"collections":[],"art":[{"kind":"spacetime","path":"art/turing/ittm/bb-6-champion-runs-longer-than-2-5-steps/spacetime.svg"},{"kind":"diagram","path":"art/turing/ittm/bb-6-champion-runs-longer-than-2-5-steps/diagram.svg"}]},{"id":"turing/ittm/one-step-left","path":"machines/turing/ittm/one-step-left.automaton","title":"one step left","blurb":"The textbook Two-Way Infinite Turing Machine example.","machine":"ITM","category":"tm","languageClass":"Recursively enumerable","tags":["textbook","itm"],"author":{"login":"thethinkmachine","name":""},"license":"CC-BY-4.0","difficulty":"intro","chapter":"","standard":null,"added":"2026-09-28T20:47:35+05:30","updated":"2026-09-28T20:47:35+05:30","version":1,"hash":"0209a1e5fcfff729","bytes":1159,"stats":{"states":2,"transitions":3,"sigma":["a","b"],"tapes":1,"blocks":0},"badges":[{"id":"deterministic","detail":""},{"id":"halts","detail":"1 steps"}],"behaviour":{"verdict":"halts","method":"simulation","steps":1,"ones":0,"cells":2,"how":"accept"},"fingerprint":null,"machineId":"8338f727dfb180b0","taskId":null,"dfa":null,"sketch":{"n":[[220,220,1],[500,220,2]],"e":[[0,1]]},"tests":{"accepts":0,"rejects":0,"outputs":0},"forkOf":null,"remixes":[],"collections":[],"art":[{"kind":"spacetime","path":"art/turing/ittm/one-step-left/spacetime.svg"},{"kind":"diagram","path":"art/turing/ittm/one-step-left/diagram.svg"}]},{"id":"turing/lba/powers-of-two-by-halving","path":"machines/turing/lba/powers-of-two-by-halving.automaton","title":"Powers of two, by halving","blurb":"Accepts aⁿ iff n = 2ᵏ. Each pass crosses off every second a, halving the count; a clean halving chain down to 1 is only possible for powers of two.","machine":"LBA","category":"tm","languageClass":"Context-sensitive","tags":["showcase","lba"],"author":{"login":"thethinkmachine","name":""},"license":"CC-BY-4.0","difficulty":"intermediate","chapter":"","standard":null,"added":"2026-09-28T20:47:35+05:30","updated":"2026-09-28T20:47:35+05:30","version":1,"hash":"95656b2ed7e27a56","bytes":4349,"stats":{"states":6,"transitions":14,"sigma":["a"],"tapes":1,"blocks":0},"badges":[{"id":"tested","detail":"6 examples checked"},{"id":"deterministic","detail":""}],"behaviour":null,"fingerprint":null,"machineId":"3cc83f4d18157959","taskId":null,"dfa":null,"sketch":{"n":[[140,160,1],[380,160,0],[620,160,0],[860,160,0],[500,380,0],[180,380,2]],"e":[[0,0],[0,1],[1,1],[1,2],[1,5],[2,2],[2,3],[2,4],[3,3],[3,2],[4,4],[4,0]]},"tests":{"accepts":4,"rejects":2,"outputs":0},"forkOf":null,"remixes":[],"collections":["beyond-regular"],"art":[{"kind":"diagram","path":"art/turing/lba/powers-of-two-by-halving/diagram.svg"}]},{"id":"turing/lba/scan-to-first-b","path":"machines/turing/lba/scan-to-first-b.automaton","title":"scan to first b","blurb":"The textbook Linear Bounded Automaton example.","machine":"LBA","category":"tm","languageClass":"Context-sensitive","tags":["textbook","lba"],"author":{"login":"thethinkmachine","name":""},"license":"CC-BY-4.0","difficulty":"intro","chapter":"","standard":null,"added":"2026-09-28T20:47:35+05:30","updated":"2026-09-28T20:47:35+05:30","version":1,"hash":"424dbdbff5f1b9d2","bytes":1176,"stats":{"states":2,"transitions":3,"sigma":["a","b"],"tapes":1,"blocks":0},"badges":[{"id":"deterministic","detail":""}],"behaviour":null,"fingerprint":null,"machineId":"d7af04455bd6ae23","taskId":null,"dfa":null,"sketch":{"n":[[200,200,1],[400,200,2]],"e":[[0,0],[0,1]]},"tests":{"accepts":0,"rejects":0,"outputs":0},"forkOf":null,"remixes":[],"collections":[],"art":[{"kind":"diagram","path":"art/turing/lba/scan-to-first-b/diagram.svg"}]},{"id":"turing/mtm/3-tape-adder-one-pass","path":"machines/turing/mtm/3-tape-adder-one-pass.automaton","title":"3-tape adder — one pass","blurb":"Adds two binary numbers (written LSB-first) in a single sweep: three synchronized heads, and the carry bit is the only state. The same job costs the 1-tape TM a lap per unit.","machine":"MTM","category":"tm","languageClass":"Recursively enumerable","tags":["showcase","mtm"],"author":{"login":"thethinkmachine","name":""},"license":"CC-BY-4.0","difficulty":"intermediate","chapter":"","standard":null,"added":"2026-09-28T20:47:35+05:30","updated":"2026-09-28T20:47:35+05:30","version":1,"hash":"059cdb554ab8ad52","bytes":7480,"stats":{"states":3,"transitions":18,"sigma":["0","1"],"tapes":3,"blocks":0},"badges":[{"id":"tested","detail":"3 examples checked"},{"id":"deterministic","detail":""}],"behaviour":null,"fingerprint":null,"machineId":"db3a5be53d2d55fc","taskId":null,"dfa":null,"sketch":{"n":[[240,220,1],[620,220,0],[430,440,2]],"e":[[0,0],[0,1],[0,2],[1,0],[1,1],[1,2]]},"tests":{"accepts":3,"rejects":0,"outputs":0},"forkOf":null,"remixes":[],"collections":[],"art":[{"kind":"diagram","path":"art/turing/mtm/3-tape-adder-one-pass/diagram.svg"}]},{"id":"turing/mtm/4-tape-alu-add-and-or-xor-not","path":"machines/turing/mtm/4-tape-alu-add-and-or-xor-not.automaton","title":"4-tape ALU — add, and, or, xor, not","blurb":"An arithmetic logic unit as a Turing machine: operands on tapes 1 and 2, the opcode on tape 3, the result on tape 4. Decode once, then one synchronized sweep per operation — the carry bit is the only state the machine ever needs.","machine":"MTM","category":"tm","languageClass":"Recursively enumerable","tags":["showcase","mtm"],"author":{"login":"thethinkmachine","name":""},"license":"CC-BY-4.0","difficulty":"intermediate","chapter":"","standard":null,"added":"2026-09-28T20:47:35+05:30","updated":"2026-09-28T20:47:35+05:30","version":1,"hash":"4dec912beb2651ca","bytes":21849,"stats":{"states":8,"transitions":53,"sigma":["0","1","+","&","|","^","~"],"tapes":4,"blocks":0},"badges":[{"id":"tested","detail":"5 examples checked"},{"id":"deterministic","detail":""}],"behaviour":null,"fingerprint":null,"machineId":"e703a0fe84aca600","taskId":null,"dfa":null,"sketch":{"n":[[200,430,1],[640,110,0],[990,110,0],[640,300,0],[640,440,0],[640,580,0],[640,730,0],[1230,430,2]],"e":[[0,1],[0,3],[0,4],[0,5],[0,6],[1,1],[1,2],[1,7],[2,1],[2,2],[2,7],[3,3],[3,7],[4,4],[4,7],[5,5],[5,7],[6,6],[6,7]]},"tests":{"accepts":5,"rejects":0,"outputs":0},"forkOf":null,"remixes":[],"collections":[],"art":[{"kind":"diagram","path":"art/turing/mtm/4-tape-alu-add-and-or-xor-not/diagram.svg"}]},{"id":"turing/mtm/anbncn-with-2-tapes","path":"machines/turing/mtm/anbncn-with-2-tapes.automaton","title":"aⁿbⁿcⁿ with 2 tapes","blurb":"The textbook Multi-Tape Turing Machine example.","machine":"MTM","category":"tm","languageClass":"Recursively enumerable","tags":["textbook","mtm"],"author":{"login":"thethinkmachine","name":""},"license":"CC-BY-4.0","difficulty":"intro","chapter":"","standard":null,"added":"2026-09-28T20:47:35+05:30","updated":"2026-09-28T20:47:35+05:30","version":1,"hash":"becd711b568cefcd","bytes":2774,"stats":{"states":4,"transitions":7,"sigma":["a","b","c"],"tapes":2,"blocks":0},"badges":[{"id":"deterministic","detail":""}],"behaviour":null,"fingerprint":null,"machineId":"ea368cd057cd2623","taskId":null,"dfa":null,"sketch":{"n":[[100,200,1],[280,200,0],[460,200,0],[640,200,2]],"e":[[0,0],[0,1],[1,1],[1,2],[2,2],[2,3]]},"tests":{"accepts":0,"rejects":0,"outputs":0},"forkOf":null,"remixes":[],"collections":[],"art":[{"kind":"diagram","path":"art/turing/mtm/anbncn-with-2-tapes/diagram.svg"}]},{"id":"turing/mtm/palindromes-in-linear-time","path":"machines/turing/mtm/palindromes-in-linear-time.automaton","title":"Palindromes in linear time","blurb":"Copy, rewind, compare: tape 1 read forwards against tape 2 read backwards. The construction a second tape exists for — Θ(n) here against Θ(n²) for the same language on one tape.","machine":"MTM","category":"tm","languageClass":"Recursively enumerable","tags":["showcase","mtm"],"author":{"login":"thethinkmachine","name":""},"license":"CC-BY-4.0","difficulty":"intermediate","chapter":"","standard":null,"added":"2026-09-28T20:47:35+05:30","updated":"2026-09-28T20:47:35+05:30","version":1,"hash":"03e7264fbeed97d0","bytes":7182,"stats":{"states":5,"transitions":16,"sigma":["a","b"],"tapes":2,"blocks":0},"badges":[{"id":"tested","detail":"5 examples checked"},{"id":"deterministic","detail":""}],"behaviour":null,"fingerprint":null,"machineId":"7dd339cb5e8adc75","taskId":null,"dfa":null,"sketch":{"n":[[180,300,1],[480,300,0],[780,300,0],[1080,300,0],[1380,300,2]],"e":[[0,1],[0,4],[1,1],[1,2],[2,2],[2,3],[3,3],[3,4]]},"tests":{"accepts":4,"rejects":1,"outputs":0},"forkOf":null,"remixes":[],"collections":["beyond-regular"],"art":[{"kind":"diagram","path":"art/turing/mtm/palindromes-in-linear-time/diagram.svg"}]},{"id":"turing/ndtm/guess-the-last-1","path":"machines/turing/ndtm/guess-the-last-1.automaton","title":"guess the last 1","blurb":"The textbook Nondeterministic Turing Machine example.","machine":"NDTM","category":"tm","languageClass":"Recursively enumerable","tags":["textbook","ndtm"],"author":{"login":"thethinkmachine","name":""},"license":"CC-BY-4.0","difficulty":"intro","chapter":"","standard":null,"added":"2026-09-28T20:47:35+05:30","updated":"2026-09-28T20:47:35+05:30","version":1,"hash":"1c9563999ad8c30b","bytes":1383,"stats":{"states":3,"transitions":4,"sigma":["0","1"],"tapes":1,"blocks":0},"badges":[],"behaviour":null,"fingerprint":null,"machineId":"8d1dd6206f3058d1","taskId":null,"dfa":null,"sketch":{"n":[[120,200,1],[360,200,0],[600,200,2]],"e":[[0,0],[0,1],[1,2]]},"tests":{"accepts":0,"rejects":0,"outputs":0},"forkOf":null,"remixes":[],"collections":[],"art":[{"kind":"diagram","path":"art/turing/ndtm/guess-the-last-1/diagram.svg"}]},{"id":"turing/ndtm/is-n-composite-guess-a-factor","path":"machines/turing/ndtm/is-n-composite-guess-a-factor.automaton","title":"Is n composite? Guess a factor","blurb":"Accepts 1ⁿ exactly when n is composite: the machine guesses a factor p, then verifies it by dealing the remaining 1s into rounds of p. Primality by nondeterministic elimination.","machine":"NDTM","category":"tm","languageClass":"Recursively enumerable","tags":["showcase","ndtm"],"author":{"login":"thethinkmachine","name":""},"license":"CC-BY-4.0","difficulty":"intermediate","chapter":"","standard":null,"added":"2026-09-28T20:47:35+05:30","updated":"2026-09-28T20:47:35+05:30","version":1,"hash":"4e654a5be4bc75da","bytes":5671,"stats":{"states":8,"transitions":21,"sigma":["1"],"tapes":1,"blocks":0},"badges":[{"id":"tested","detail":"5 examples checked"}],"behaviour":null,"fingerprint":null,"machineId":"cd7319bffa8a3e91","taskId":null,"dfa":null,"sketch":{"n":[[120,150,1],[340,150,0],[560,150,0],[800,150,0],[560,380,0],[800,380,0],[340,380,0],[120,380,2]],"e":[[0,1],[1,1],[1,2],[2,2],[2,3],[2,4],[3,3],[3,2],[4,4],[4,5],[5,5],[5,6],[6,6],[6,2],[6,7]]},"tests":{"accepts":3,"rejects":2,"outputs":0},"forkOf":null,"remixes":[],"collections":[],"art":[{"kind":"diagram","path":"art/turing/ndtm/is-n-composite-guess-a-factor/diagram.svg"}]},{"id":"turing/non-halting/translated-cycler","path":"machines/turing/non-halting/translated-cycler.automaton","title":"Marching right forever","blurb":"Never halts, and never repeats a configuration either: every 4 steps it is back in the same state with the same tape behind it, two cells further right. Proof: a translated cycler.","machine":"ITM","category":"tm","languageClass":"Recursively enumerable","tags":["standard-format","non-halting","proof"],"author":{"login":"thethinkmachine","name":""},"license":"CC-BY-4.0","difficulty":"","chapter":"","standard":"1RB1RA_1RC1RZ_0LA0LC","added":"2026-09-28T20:47:35+05:30","updated":"2026-09-28T20:47:35+05:30","version":1,"hash":"853f13ae94575c5f","bytes":2171,"stats":{"states":4,"transitions":6,"sigma":["1"],"tapes":1,"blocks":0},"badges":[{"id":"deterministic","detail":""},{"id":"never-halts","detail":"translated cycler"}],"behaviour":{"verdict":"never","method":"translated","period":4,"from":1,"shift":2,"direction":"right"},"fingerprint":null,"machineId":"dbcd17715538439a","taskId":null,"dfa":null,"sketch":{"n":[[0,0,1],[179,0,0],[358,48,0],[358,-47,2]],"e":[[0,1],[0,0],[1,2],[1,3],[2,0],[2,2]]},"tests":{"accepts":0,"rejects":0,"outputs":0},"forkOf":null,"remixes":[],"collections":["halting-proofs"],"art":[{"kind":"spacetime","path":"art/turing/non-halting/translated-cycler/spacetime.svg"},{"kind":"diagram","path":"art/turing/non-halting/translated-cycler/diagram.svg"}]},{"id":"turing/non-halting/two-cell-cycler","path":"machines/turing/non-halting/two-cell-cycler.automaton","title":"Two cells, forever","blurb":"It has a halt — state A reading a 1 — and never reaches it: after two steps it bounces between two cells, and its whole configuration repeats every 2 steps. Proof: a cycler.","machine":"ITM","category":"tm","languageClass":"Recursively enumerable","tags":["standard-format","non-halting","proof"],"author":{"login":"thethinkmachine","name":""},"license":"CC-BY-4.0","difficulty":"","chapter":"","standard":"0LB1RZ_1RA1RA_1RC1RB","added":"2026-09-28T20:47:35+05:30","updated":"2026-09-28T20:47:35+05:30","version":1,"hash":"0b25530306a9bb75","bytes":2162,"stats":{"states":4,"transitions":6,"sigma":["1"],"tapes":1,"blocks":0},"badges":[{"id":"deterministic","detail":""},{"id":"never-halts","detail":"cycler"}],"behaviour":{"verdict":"never","method":"cycler","cells":2,"period":2,"from":2},"fingerprint":null,"machineId":"c3b71d9f560d4519","taskId":null,"dfa":null,"sketch":{"n":[[0,0,1],[179,48,0],[358,0,0],[179,-47,2]],"e":[[0,1],[0,3],[1,0],[2,2],[2,1]]},"tests":{"accepts":0,"rejects":0,"outputs":0},"forkOf":null,"remixes":[],"collections":["halting-proofs"],"art":[{"kind":"spacetime","path":"art/turing/non-halting/two-cell-cycler/spacetime.svg"},{"kind":"diagram","path":"art/turing/non-halting/two-cell-cycler/diagram.svg"}]},{"id":"turing/non-halting/unreachable-halt","path":"machines/turing/non-halting/unreachable-halt.automaton","title":"A halt nothing leads to","blurb":"State B has no move for a 1, so reading one would stop it. Searching backwards from that configuration shows nothing it can ever reach leads there. Proof: backward reasoning.","machine":"ITM","category":"tm","languageClass":"Recursively enumerable","tags":["standard-format","non-halting","proof"],"author":{"login":"thethinkmachine","name":""},"license":"CC-BY-4.0","difficulty":"","chapter":"","standard":"1LB0RC_0RA---_1LB0LA","added":"2026-09-28T20:47:35+05:30","updated":"2026-09-28T20:47:35+05:30","version":1,"hash":"2886baebddf6c8a7","bytes":1947,"stats":{"states":3,"transitions":5,"sigma":["1"],"tapes":1,"blocks":0},"badges":[{"id":"deterministic","detail":""},{"id":"never-halts","detail":"backward reasoning"}],"behaviour":{"verdict":"never","method":"backward","steps":4,"longest":3},"fingerprint":null,"machineId":"b77961301937d594","taskId":null,"dfa":null,"sketch":{"n":[[0,0,1],[179,48,0],[179,-47,0]],"e":[[0,1],[0,2],[1,0],[2,1],[2,0]]},"tests":{"accepts":0,"rejects":0,"outputs":0},"forkOf":null,"remixes":[],"collections":["halting-proofs"],"art":[{"kind":"spacetime","path":"art/turing/non-halting/unreachable-halt/spacetime.svg"},{"kind":"diagram","path":"art/turing/non-halting/unreachable-halt/diagram.svg"}]},{"id":"turing/tm/binary-addition-a-b","path":"machines/turing/tm/binary-addition-a-b.automaton","title":"Binary addition a+b","blurb":"Computes a+b on the tape by transferring one unit per lap: decrement b, increment a, repeat; when b hits zero it is erased and the sum sits where a was.","machine":"TM","category":"tm","languageClass":"Recursively enumerable","tags":["showcase","tm"],"author":{"login":"thethinkmachine","name":""},"license":"CC-BY-4.0","difficulty":"intermediate","chapter":"","standard":null,"added":"2026-09-28T20:47:35+05:30","updated":"2026-09-28T20:47:35+05:30","version":1,"hash":"6ee0c8e284bcf260","bytes":5242,"stats":{"states":8,"transitions":18,"sigma":["0","1","+"],"tapes":1,"blocks":0},"badges":[{"id":"tested","detail":"5 examples checked"},{"id":"deterministic","detail":""}],"behaviour":{"verdict":"halts","method":"simulation","steps":0,"ones":0,"cells":1,"how":"none"},"fingerprint":null,"machineId":"ffa274174947ff02","taskId":null,"dfa":null,"sketch":{"n":[[150,150,1],[430,150,0],[710,150,0],[710,350,0],[430,350,0],[150,350,0],[620,550,0],[340,550,2]],"e":[[0,0],[0,1],[1,1],[1,2],[1,6],[2,2],[2,3],[3,3],[3,4],[4,4],[4,5],[5,5],[5,0],[6,6],[6,7]]},"tests":{"accepts":3,"rejects":2,"outputs":0},"forkOf":null,"remixes":[],"collections":["beyond-regular"],"art":[{"kind":"spacetime","path":"art/turing/tm/binary-addition-a-b/spacetime.svg"},{"kind":"diagram","path":"art/turing/tm/binary-addition-a-b/diagram.svg"}]},{"id":"turing/tm/binary-increment","path":"machines/turing/tm/binary-increment.automaton","title":"binary increment","blurb":"The textbook Deterministic Turing Machine example.","machine":"TM","category":"tm","languageClass":"Recursively enumerable","tags":["textbook","tm"],"author":{"login":"thethinkmachine","name":""},"license":"CC-BY-4.0","difficulty":"intro","chapter":"","standard":null,"added":"2026-09-28T20:47:35+05:30","updated":"2026-09-28T20:47:35+05:30","version":1,"hash":"164407ba8550cf16","bytes":1606,"stats":{"states":3,"transitions":6,"sigma":["0","1"],"tapes":1,"blocks":0},"badges":[{"id":"deterministic","detail":""},{"id":"halts","detail":"2 steps"}],"behaviour":{"verdict":"halts","method":"simulation","steps":2,"ones":1,"cells":2,"how":"accept"},"fingerprint":null,"machineId":"2ad65f16e7583b62","taskId":null,"dfa":null,"sketch":{"n":[[120,200,1],[340,200,0],[560,200,2]],"e":[[0,0],[0,1],[1,1],[1,2]]},"tests":{"accepts":0,"rejects":0,"outputs":0},"forkOf":null,"remixes":[],"collections":[],"art":[{"kind":"spacetime","path":"art/turing/tm/binary-increment/spacetime.svg"},{"kind":"diagram","path":"art/turing/tm/binary-increment/diagram.svg"}]}],"collections":[{"id":"beyond-regular","title":"Beyond regular","blurb":"Stacks, queues, counters and tapes: what each kind of memory buys.","curator":"thethinkmachine","entries":["memory/pda/anbn","memory/pda/bracket-matcher","memory/npda/palindromes-guess-the-middle","memory/counter/bank-account-never-overdrawn","memory/queue/perfect-copy-w-w","memory/twopda/anbncn-beyond-one-stack","memory/epda/anbncndn-four-counts-one-stack-of-stacks","turing/lba/powers-of-two-by-halving","turing/tm/binary-addition-a-b","turing/mtm/palindromes-in-linear-time"]},{"id":"busy-beavers","title":"Busy Beaver Hall of Fame","blurb":"The champions: for each size, the halting machine that runs longest from a blank tape. Every step count here was checked by running the machine to its halt.","curator":"thethinkmachine","entries":["turing/busy-beaver/bb2","turing/busy-beaver/bb3-steps","turing/busy-beaver/bb3-ones","turing/busy-beaver/bb4","turing/busy-beaver/bb2x3","turing/busy-beaver/bb2x4","turing/busy-beaver/bb5"],"essay":{"path":"collections/busy-beavers.md","hash":"4eb7da1df9adfa36","minutes":3}},{"id":"halting-proofs","title":"Three ways to never halt","blurb":"One machine per non-halting proof the library can make: an exact cycle, a cycle that drifts along the tape, and a halt that can never be reached.","curator":"thethinkmachine","entries":["turing/non-halting/two-cell-cycler","turing/non-halting/translated-cycler","turing/non-halting/unreachable-halt"]},{"id":"omega-zoo","title":"The ω-automata zoo","blurb":"All eight acceptance conditions × determinism: Büchi, co-Büchi, parity and weak, deterministic and not — and the languages that tell them apart.","curator":"thethinkmachine","entries":["omega/dba/never-two-a-s-in-a-row","omega/dcoba/eventually-always-b","omega/dpa/eventually-always-b-by-priority","omega/buchi/infinitely-often-a","omega/buchi/classic-eventually-always-b","omega/ncoba/eventually-always-b-with-a-needless-guess","omega/npa/infinitely-often-a-or-eventually-always-c","omega/nwa/never-two-a-s-with-a-needless-guess"]},{"id":"regular-languages","title":"Regular languages, start to finish","blurb":"DFAs, NFAs, ε-NFAs and two-way automata — the finite-memory machines, from the textbook classics to the showcase examples.","curator":"thethinkmachine","entries":["finite/dfa/even-number-of-1s","finite/dfa/binary-divisibility-by-5","finite/nfa/guess-the-penultimate-1","finite/nfa/keyword-search-cat-car-cab","finite/enfa/a-then-b","finite/enfa/float-regex-compiled","finite/twdfa/two-passes-one-head","finite/twnfa/deja-vu-the-last-letter-is-a-rerun","finite/dfa/binary-divisibility-by-3"]},{"id":"transducers","title":"Machines that write","blurb":"Moore and Mealy machines, finite-state and pushdown transducers, and a two-way transducer that copies its input.","curator":"thethinkmachine","entries":["transducers/moore/combination-lock-1101","transducers/moore/traffic-light","transducers/mealy/serial-binary-adder","transducers/mealy/report-each-bit","transducers/fst/binary-gray-code","transducers/pdt/reverse-the-input","transducers/twodft/copy-twice-w-ww"]}],"featured":["busy-beavers","regular-languages","omega-zoo"],"frontispiece":"finite/nfa/guess-the-penultimate-1"}