2009-05-25
 
perl golf

In een e-mailconversatie kwam good old Perl Golf voorbij. Bij golf gaat het erom de hole in zo weinig mogelijk slagen te bereiken. En bij Perl Golf gaat het er om een programmeerprobleem met zo min mogelijk tekens op te lossen – in de programmeertaal perl.

Een klassiek probleem was het converteren van een getal in Engelse tekst naar zijn numerieke representatie – one thousand twenty four wordt 1,024 enzovoort - zie de link voor de details. Je zou je kunnen afvragen hoeveel regels programmacode nodig zijn om dat op te lossen. Bij Perl Golf is dat doorgaans eenvoudig te beantwoorden: 1 regel is voldoende(!). De vraag is alleen hoeveel tekens in die regel gaan. De oplossingen - en de beste oplossing is… (tromgeroffel).

112.

Lees dat nog eens. 112 karakters…?! Dit is de oplossing:

-lp040 $@+=$@%1e3*(9x(3*y/dbl/\xe4/-4*/e/))||/te|\xe4/././*$+['^A^S^\^I^O^Z^V^L^G'!~($&^o&$')].e./y/}{$_=$@;s/\B(?=(...)*$)/,/g

(en ja, dit werkt echt. Sla de regel (na de '-lp040 ') op in test.pl, en geef $ echo 'nineteen eighty four' | perl -lp040 ./test.pl. Wel even op de speciale tekens letten (de ^ tekens) – zie de oplossingen-link)

Die kortste oplossing is een combinatie van de oplossingen van verschillende deelnemers; de winnaar was Ton Hospel (ik ken hem nog van de Haagse Linux Club) met een bloated oplossing van liefst 115 tekens:

-lp040 $^+=$^%1e3*(9x(3*y/dbl/\xe4/-4*/e/))||/te|\xe4/././*$+['^A^S^\^I^O^Z^V^L^G'!~($&^o&$')].$[x/y/}$_=$^;{s/\B..\d\b/,$&/&&redo

Hij legt uit hoe hij ertoe kwam.

Perl is erg geschikt voor dit soort klusjes, vanwege de bizarre manieren waarop je side-effects kunt combineren, en de vele handige ingebouwde fucnties. Het is wel degelijk mogelijk om leesbare perl-programma's te maken; maar da's niet het doel van Perl Golf natuurlijk.

Perl Golf is al een paar jaar dood - maar het concept bestaat nog, als Code Golf, waarbij je de problemen met een programmeertaal naar keuze mag oplossen. De meeste winnaar gebruiken perl - maar bijv. bij de Torens van Hanoi lijkt Ruby met de eer te gaan strijken; de source code is helaas nog niet beschikbaar…


0 Reacties:

Een reactie plaatsen


Emacs, the UberEditor Powered by Blogger