×

A XXI. századi sport: Codegolf

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 :
prog.go:1:1: illegal character U+2014 ‘—’

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 2014.

 

You May Have Missed