.Geek - DOOM draait in regex
Menig tweaker zal zich soms heel wat voelen als hij of zij reguliere expressies gebruikt. Maar dat is kinderspel vergeleken met wat programmeur Artem Lytkin met regex kan. Die heeft DOOM geschreven in een 96MB groot regexcommando. Dat werkt, maar echt speelbaar is het niet te noemen.
Lytkin, die zichzelf ook 4RH1T3CT0R7 noemt, heeft DOOM weten te porten naar een lange regexformule. In de praktijk heeft Lytkin alle data van DOOM, zoals cpu-registers, het geheugen, de framebuffer en de DOOM-engine, vertaald naar een plaintextbestand dat in totaal 96MB groot is.
Wat zijn regular expressions?
Regular expressions, meestal afgekort tot regex, zijn zoekopdrachten om bepaalde patronen van tekens in tekst en code te vinden en te vervangen. Ze kunnen bijvoorbeeld worden gebruikt om alle vormen van de term 'Tweakers' in een lange tekst te vinden, ook als daar Tweakers.net staat of tweakers zonder hoofdletter. Het is een krachtig hulpmiddel voor zoekopdrachten naar een patroon in plaats van een exacte overeenkomst.
Bij iedere actie, zoals het genereren van een frame, start Lytkins tool een regexzoekopdracht. Daarmee zoekt de tool de juiste tekst in het tekstbestand. De regexformule zet die vervolgens om in een string die correspondeert met de cpu-registers.
Dat is, zoals je misschien verwacht, onbeschrijfelijk traag. Om een enkel frame te tonen gebruikt het script niet minder dan 13.994.067 substitutions. In een kleine demo van honderd frames zitten 1,2 miljard vervangingen.
Maar traag of niet: de game werkt wel. Lytkin zegt dat de hash van ieder frame identiek is aan die van de originele game. Het is alleen zo traag dat het praktisch onspeelbaar is. Het script heeft een paar minuten nodig om een frame te genereren. Daardoor lijkt spelen op 'schaken via de post', zegt de maker. Dan kun je de game toch beter in DNS-records spelen.
29-07-2026 • 16:19
Lees meer
Reacties (36)
Maar wel weer ultiem respect als je het voor elkaar krijgt
[1] Wikipedia: Counter machine
[Reactie gewijzigd door johnbetonschaar op 29 juli 2026 16:56]
Stap 2: je vormt het om naar een taaltje zodat je "draai links" en "draai rechts" kunt schrijven.
Stap 3: je pakt een 'leesbare versie' van Doom en schrift die na in je eigen taaltje.
Stap 4: laat de PC jouw verhaal in eigen taaltje weer omzetten naar een extreem lange regex.
Tadaaaaa
Regex is handig, maar ook best wel verschrikkelijk als je er zelf een wat langere moet schrijven hehe, dus vooral veel respect naar deze Artem Lytkin, misschien is hij gewoon lichtelijk masochistisch of zo, ieder z'n ding 😉
Blij dat er tegenwoordig tientallen goeie regex generators zijn waar je even snel de ~100 meest voorkomende in elkaar kunt klikken, er was een tijd dat ik die dingen echt haatte hehe.
Zo heb ik iets van 10 jaar geleden ofzo meegewerkt aan een documentatie project voor WordPress. Samen met een collega alle regexen van de teksteditor zitten uitpluizen om te documenteren. En er waren exact 0 regels documentatie al aanwezig. Dan zijn hulpjes als regex101.com heel hard nodig. En was het verdomd handig dat je met iemand werkt die letterlijk tegen me zei nadat ze voor het eerst een regex zag "Goh, regexxen zijn helemaal niet zo moeilijk".Zelf maken is al niet zo leuk. Maar een bestaande lange regex van een collega developer ontcijferen nog minder. Gelukkig hebben we daar tegenwoordig hulpjes voor.
/offtopic
Ik zat net even naar de documentatie te kijken van dit project, maar heb al snel besloten dat mijn hoofd dit gewoon niet aankan
[Reactie gewijzigd door TERW_DAN op 29 juli 2026 16:47]
Ik gebruik ze wel eens, ze zijn echt super handig, maar als het zonder kan, dan ook graag. Vaak geef ik toch de voorkeur aan een methode chain
Ik snap er nog steeds niks van terwijl ik vroeger gewoon in assembly zelf muterende code zat te bedenken. Dus mijn brein zou het moeten kunnen denk je dan, maar de klik is nooit gekomen.
Ik moet nu overigens wel denken aan een kwoot van Netscape engineer Jamie Zawinski:
Some people, when confronted with a problem, think 'I know, I'll use regular expressions.' Now they have two problems.
[Reactie gewijzigd door ZpAz op 29 juli 2026 16:34]
Wat een verschrikking.
Deze DOOM draait dan ook niet "in regex", en dat beweert de auteur ook niet. Hij gebruikt term rewriting (eigenlijk string rewriting, een variant daarvan), waarbij de regels door regexen geimplementeerd worden. En string rewriting is wel Turingvolledig.
Het werkt ongeveer zo: De toestand van de computer (geheugen, registers, etc) wordt gerepresenteerd door een 96.6 MB groot tekstbestand. Hij heeft een geordende lijst van 544 substitutieregels geschreven, waarbij elke substitutieregel een regex-substitutie is. Zijn tool zoekt de eerste substitutieregel die op dat tekstbestand gematcht kan worden, en voert die regel uit, waardoor een nieuwe toestand ontstaat. Daarna zoekt hij weer de eerste matchende regel, en daarna weer, ad infinitum. Die 544 regels emuleren een CPU, en hij heeft Doom naar die CPU gecompileerd.
Ik blijf het geweldig vinden hoe mensen de meest bizarre manieren vinden om Doom te spelen. Naja, spelen... zichtbaar te maken, want dit kun je toch geen spelen meer noemen
Ik ben geen ontwikkelaar, snap er eerlijk gezegd heel weinig van, maar ik heb respect voor deze mensen.
...niet dat je met die aanpak dan wel acceptabele framerates zou krijgen, daarvoor moet Doom gewoon teveel doen.
Voor mij heeft deze meer een 'Does it display Doom'-gehalte... maar wel weer knap hoe iemand zoiets in elkaar bokst.
Het is weer eens wat nieuws, als je nu Doom weet te draaien op een wasmachine of zo gaapt iedereen omdat we al gewend zijn aan rare hardware.
Om te kunnen reageren moet je ingelogd zijn
/i/2008281266.png?f=imagenormal)
:strip_exif()/u/26632/dosprompt2.gif?f=community)
/u/407403/WAhack.png?f=community)
:strip_icc():strip_exif()/u/578010/crop652501bccfab9_cropped.jpg?f=community)
:strip_icc():strip_exif()/u/296384/AMDINSIDE.jpg?f=community)
/u/952371/crop5b1ea3a9d9923_cropped.png?f=community)
/u/152942/crop687206d7bca78.png?f=community)
/u/1219196/crop6324b2e35d04c_cropped.png?f=community)
:strip_icc():strip_exif()/u/86796/ancientdragon60.jpg?f=community)
/u/155722/Looneytunes.png?f=community)
:strip_icc():strip_exif()/u/137578/crop684839b85b72a.jpg?f=community)
/u/27299/hoofd.png?f=community)
:strip_icc():strip_exif()/u/630253/4b8001781ceab258b7bf40f76426913e.jpeg?f=community)
:strip_icc():strip_exif()/u/464574/crop5ef5b118724ae_cropped.jpeg?f=community)
:strip_exif()/u/53522/crop583d477015a24.gif?f=community)