PyContest 2005 feladat perl-ben

szöget ütött a fejembe ez a téma.

aki nem érti, de véletlenül épp érdekelné, hogy mit makogok: a feladat - ha jól értettem végül - olyan függvény írása minél kevesebb karakterrel, ami tetszőleges pozitív egész számot ha kap, cserébe számológép style-ban mutatja a számjegyeket.

pl.: w(42);

kimenet:

    _ 
|_| _|
  ||_ 

sub w{@p=split'',$_[0];@n=split',',"   , _ , _|,|_ ,|_|,  |,| |";%m=split',',"0,164,1,055,2,123,3,122,4,045,5,132,6,134,7,155,8,144,9,142";for($i=0;$i<3;$i++){print$n[substr$m{$_},$i,1]foreach@p;print$/;}}

ez eddig 205 karakter.

kikuchiyo megoldása:


use 5.010;sub w{for$;(0..2){$_=$_[0];s!(\d)!('    _  _||_ |_|  || |'=~/.../g)[('164055123122045132134155144142'=~/./g)[$;+$1*3]]!ge;say}}

127 (+10) karakter

az eredeti feladat megoldása itt

bárki ne habozzon mondani, ha eszébe jut még valami ezzel kapcsolatban, bár ez már így is elég perverz, ahogy elnézem. sebaj. szeretem a nagy felhajtást, arról nem is beszélve, hogy ebből mennyit lehet tanulni. :)

én például megtanultam többek között azt, hogy a $/ speciális változó alapértelmezett értéke a \n, hogy lehet intervallumot megadni for loop-nak, hogy majdnem bárhol el lehet hagyni a szóközöket, illetve hogy hogyan lehet speciális változót hanyag eleganciával és ötletességgel ciklusváltozónak használni.

Hozzászólások

> paste-elek egy bint inkább

Vagy így:

[code]


sub w{@p=split'',$_[0];@n=split',',"   , _ , _|,|_ ,|_|,  |,| |";%m=split',',"0,164,1,055,2,123,3,122,4,045,5,132,6,134,7,155,8,144,9,142";for($i=0;$i<3;$i++){print$n[substr$m{$_},$i,1]foreach@p;print$/;}}

[/code]

De előbb rövidítsd le, hogy ne kelljen görgetni :-)


sub w{@u=(1011011111,6522433544,4532524542);@p=('    _  _||_ |_|  || |'=~/.../g);for$i(0..2){$_=$_[0];@w=split//,$u[$i];s/(\d)/$p[$w[$1]]/g;say;}}

146 karakter.
Perl 5.10 (és use 5.010 vagy -E) kell neki.

Ebben a nagy "újítás" a tiedhez képest a reguláris kifejezés használata a végső helyettesítésre. A "lookup table" előállítását végző rész is tömörebb egy kicsit.

Az igazi guruk nyilván tudnának még vagy 100 karaktert faragni belőle :)

> akkor az a 146 az 156
ezt hogy számoltad?

> use 5.010 a say miatt kell?
igen, de úgy gondoltam, hogy most már lassan 5.16 a legújabb verzió, ideje az 5.10-ben bevezetett cutting-edge feature-öket szégyenkezés nélkül használni.


sub w{@n=('    _  _||_ |_|  || |'=~/.../g);@m=('164055123122045132134155144142'=~/./g);for$i(0..2){$_=$_[0];s/(\d)/$n[$m[$i+$1*3]]/g;say}}

138

úgy, hogy a "use 5.010;" az 10 karakter.

nekem 5.12.4 van, úgyhogy konkrétan azt nem értem, hogy akkor miért csak akkor működik, ha force-olom a régebbit.

illetve lehet, hogy most hülyeséget kérdeztem, mert ha azt mondom, hogy use 5.012, akkor meg elhalmoz "requires explicit package name" üzenetekkel.

Ez kicsit hülyén van a Perlben.
Az 'use 5.010' nem azt jelenti, hogy az interpreter viselkedését szigorúan az 5.10-ben fennállóval azonosra állítod (amint azt a józan ész alapján várni lehetne), hanem azt, hogy "kedves Perl, ne indulj el, ha a verziószám nem 5.10 vagy nagyobb, egyébként pedig kapcsolj be minden, az 5.10-ben bevezetett új feature-t'.

Az use 5.012 viszont - a verziószám-megszorításon felül - bekapcsolja az use strict-et (egyebek mellett), amivel viszont nem kompatibilis semelyik fenti megoldás. Az összes változót my-jal kéne deklarálni, hogy use strict mellett is menjenek.

Na még egy próbálkozás, aztán megyek:


sub w{for$;(0..2){$_=$_[0];s!(\d)!('    _  _||_ |_|  || |'=~/.../g)[('164055123122045132134155144142'=~/./g)[$;+$1*3]]!ge;say}}

127 karakter.

Ez csak annyiban különbözik az előzőtől, hogy elimináltam a tömb-hozzárendeléseket, amitől a program néhány karakterrel rövidebb, és néhány nagyságrenddel olvashatatlanabb lett. Már majdnem olyan, mint az ideális perl program, amely mint tudjuk, nem más, mint a futtatható line noise. :)

Ja, és ez use strict alatt is jó.

Ha megengednénk nem ASCII karaktereket is, akkor a sztringeket kompaktabb formában is ki lehetne fejezni, azzal lehetne még néhány karaktert spórolni.

ehehehe...!

nos, én amúgy elvileg egész nap matekházit írok, úgyhogy most fogom meginni a nemtomhanyadik kávémat.

frissítem a kiírást.

amúgy megmondom őszintén, itt most elveszítettem a fonalat, ezt majd még meg kell emésztenem, úgyhogy csak örülök neki, ha erre hagysz időt. :D

Ez tetszik, de fáradt is vagyok, meg a perl se áll igazán közel hozzám, de azért feliratkozom (aztán legrosszabb esetben összeütök magamnak egy 4000-5000 karakteres verziót :-) )