A XXI. századi sport: Codegolf
A játék, amihez Donald Trump nem ért.
Mivel játszanak manapság a programozók? Fortnite-tal? Neeem! Pubg-vel? Neeem! Még mindig wow-oznak? Ááá! Akkor maradtak a mudnál? Hülye vagy? A mudról már mindenki leállt, manapság a codegolf dívik. De hogy jön ez össze? Nem nehéz kitalálni: pont olyan, mint a regexgolf volt, csak kóddal. Nem kerültél ezzel sem közelebb fogalomhoz? Pedig… Mi a lényege a golfnak? Minél kevesebb ütésből betalálni a lyukba. Mi a lényege a codegolfnak? Minél kevesebb byte-ból megoldani egy feladatot. Természetesen forráskódból – az asm huszárok most bizonyára hurrognak, de ők le vannak sajnálva. Azért, hogy rögtön megfelezzem az olvasók számát, ide is teszem a mai nevezésemet:
| for((t=$1;++m<${#1};t=$[10#$g])){ g=${t#?} b+=${t/$g}${g//?/0}+;} a=$b$t echo ${a//+0} |
Ezzel a kis 86 byte-os bénázással indultam, miután sikerült nemaludnom az éjjel. Egyébként nem sok mindent csinál: egy decimális számot felbont a 10 hatványaira. Online is megtekintheted, mily’ csodás.
Namost először is: mi értelme van ennek? Semmi. Pont annyi, mint a golfnak. Attól se ment még előrébb a világ, hogy emberek a mezőn botokkal labdákat terelgetnek lyukakba. Pusztán szórakozás, ennyi. Nade a sima golfnál sokkal izgalmasabb, mert egyrészt minden játéknak más szabályrendszere van, így sose unalmas. Az eszközök sem sztandardak – mindenki azzal indul, amit szeret vagy amije van. Olyasmi, mint a sportok között az MMA, ahol különböző harcművészetek csapnak össze. Vagy ilyesmi lehet még a freestyle úszás (magyarul gyorsúszás), ahol bárhogy lehetne kapálózni, de valahogy az utóbbi időben nem túl kreatívak a sportolók. A codegolfban ezzel szemben pedig csak ez számít. Félre kell dobni minden berögzült szokást, minden szép kódot, minden gyors kódot, és pusztán a byte-ok lebegnek a szemek előtt – teljesen más ez, mint amit az iskolában tanul az ember, vagy amit a munkában elvárnak. Se nem szép, se nem gyors, csak kicsi. Minden csúnya megoldás megengedett – ha fut a kód, és csinálja amit kell, nincs para.
A matematikai gondolkozós feladatok között időről-időre felbukkan egy-két nagyon funky feladat. Ez például legendásra sikeredett: ez 2014 újév első napján született, ahol mindössze annyi volt a feladat, hogy írjuk ki a képernyőre azt, hogy 2014. A nehezítés annyi, hogy a kódban egyetlen számjegy (0123456789) sem szerepelhet, se semmi dátum vagy időfüggvény. Ezek nélkül kellett alkotni valamit, ahol a fun-faktor miatt győztest sem hirdettek. A leghagyományosabb produktum így nézett ki:
| U!O! |
Ez konkrétan Mouse-2002 nyelven van írva, ami egy baromi egyszerű nyelv még a ZX-81 Spectrumra a ’70-es évekből. Ez a kód bárki számára érthető lesz: a betűk az angol ábécé szerinti helyüket reprezentálják számokban, ahol az A a nulla, és a Z a 25. Az U itt a 20. betű, az O pedig a 14, a felkiáltójel pedig egyszerűen kiírja mindezt a képernyőre. 4 byte, egész szép munka! Ügyesen választott nyelvet a kolléga.
A következő játékos go-ban dolgozott, ami egy viszonylag friss nyelv a Google gondozásában:
| —
can’t load package: package : |
A látszat csal, mert 1 byte-nak látszik, de mivel utf-8, ezért kettő. Igazából nem is működő kód, de mivel a hibaüzenetben szerepel a 2014-es év, így érvényes indulónak számít. Az nem volt megkötés, hogy mellé nem lehet írni semmit, csak a 2014 jelenjen meg a képernyőn. Ötletes, ötletes…
Lehet ezt még fokozni? Persze, hogy lehet! Itt egy nulla(!) byte-os sportoló, a maga kicsiny python kódjával:
| print int(‘bbc’,ord(“\r”)) |
Hehe, nem is ezt akartam mutatni. De ha már itt vagyunk: ebben annyi a trükk, hogy a bbc 13-mas számrendszerben pont 2014. Nade jöjjön az igazán komisz megoldás!
| % python3.4 Python 3.4.0b2 (v3.4.0b2:ba32913eb13e, Jan 5 2014, 11:02:52) [GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin Type “help”, “copyright”, “credits” or “license” for more information. >>> |
Kis ejnye-bejnye, mert csak január 11-én adta be (megvárta az új python kiadást), és a 0 byte-os kód a verziószám kiírását eredményezi, ami tartalmazza a 2014-es számot. El kell fogadni, ez van!
Most nézzünk valami igazán bravúrosat ugyancsak python-ban:
| print sum(ord(c) for c in ‘Happy new year to you!’) |
Na, na??? Ez már röfi…döfi! Legyen akkor valami könnyed, morzekód:
| ..— —– .—- ….- |
Ebben sincs szám, szóval valid. És mivel kódrendszer, teljesen passzol a kódgold szabályaihoz. Akkor egy nem túl fantáziadús php 7.1-es megoldás:
| ~ $ xxd -r > 2014.php 0000000: 3c3f 3d7e cdcf cecb 3b <?=~….; ~ $ php 2014.php 2014 |
Na, és akkor most kezd elgurulni a gyógyszer:
| =COLUMN(T:T)&COLUMN(N:N) |
Igen, ez Excel. Aztán jött egy versenyző x86 assembly-vel:
| [BITS N] %define L(x) mov dword [eax],’zaza’-x O equ ‘A'<<`\xe` F equ ‘bab’-‘aaa’ M equ `\xFF\xAF\xAA\xFA`-`\xFD\xFF\xFC\xDE` C equ -(M+F) h: dd M dd F dd C dd h+O dd h+O dq ‘a’-‘a’ dd s+O s: mov eax,’\'<<`\r` L(‘HBJB’) add eax,’e’-‘a’ L(‘IBFB’) hlt |
Megint másvalakinek pedig a windows calculator a fegyvere:
![]()
Akkor most egy The Shakespeare Programming Language-ben:
| . Ajax,. Puck,. Act I: Scene I: [Enter Ajax and Puck] Ajax: You is the difference between a fat fat fat fat fat fat fat fat fat fat fat cat and the sum of a fat fat fat fat fat cat and a fat cat!Open thy heart! [Exeunt] |
Elég idióta, nem? Nem annyira, ha nézünk egy Emotinomicon-os versenyzőt is:
| 😭ߞ😲😨 |
A jsfuck használata már egyértelműen nem a méretre gyúrt, hanem csak a just-for-fun faktort erősítette:
| [][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]][([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]]((![]+[])[+!+[]]+(![]+[])[!+[]+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]+(!![]+[])[+[]]+(![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[!+[]+!+[]+[+[]]]+[!+[]+!+[]]+[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[!+[]+!+[]+[+[]]])() |
Ez utóbbi egyébként egy szabványos javascript, a böngésződ konzoljába másolva azonnal működik is – ki lehet próbálni, de csak saját felelősségre! Most pedig jöjjön a jó öreg Commodore 64:
| PRINT ASC(“&”)*(ASC(“V”)-ASC(“!”)) |
Windows-os cmd.exe:
| set/aa=f set/a%a%xAAA-%a%xFF-%a%xFF-%a%xCE |
Végül egy valódi versenyző Braingolfban:
| #ߞ |
Igen, ez a nyelv -ahogy a neve mutatja- csak és kizárólag emiatt a játék miatt jött létre. Nincs ezzel egyedül, az elmúlt években már több tucatnyian írtak saját programozási nyelvet maguknak, hogy a codegolfos versenyeken minél előrébb végezzenek. Naja, ez már nagyon meta-meta – erre Randall Munroe is rácsodálkozott még a regex-golf tündöklésekor pár éve; így örökítette meg:

És a legeslegvégére egy Rockstar-os megoldás – a legutóbbi írásom pont erről szólt, ugye. Aki emlékszik még talán…
| X was up equalizing a word Shout X |
Hogy is működik ez? Az X lesz a 2014, és ezt a shout kirakja a képernyőre. Az első sorban a was egy olyan módot nyit meg a rockstarban, hogy a szavak hosszúságát konvertálja át számokká. Az up 2 karakter, az equalizing 10, a=1, word=4. Viszont mindig van egy maradékos osztás 10-zel, így a 10-ből 0 lesz, és ezzel áll már össze a várva várt 2–0–1–4.



Post Comment
You must be logged in to post a comment.