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.
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.
- 4189 megtekintés
Hozzászólások
> ha eszébe jut valami ezzel kapcsolatban
http://codegolf.com/seven-segment-displays
Nekem ezt írta ki a 'w(12345)':
_ _ _
| _| _||_||_
||_ _| | _|
- A hozzászóláshoz be kell jelentkezni
whoa köszi, ezt meg fogom rágni.
@n=split',',"
után 2 space itt nem jelenik meg, az a baja, azt hiszem, paste-elek egy bint inkább. :) thx
- A hozzászóláshoz be kell jelentkezni
> 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 :-)
- A hozzászóláshoz be kell jelentkezni
hm. valamit elbénázhattam eddig. ^^*
...hehe. azon vagyok :]
- A hozzászóláshoz be kell jelentkezni
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 :)
- A hozzászóláshoz be kell jelentkezni
akkor az a 146 az 156, de attól még szép. alakul, mint a puposgyerek a prés alatt :)
use 5.010 a say miatt kell?
- A hozzászóláshoz be kell jelentkezni
> 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
- A hozzászóláshoz be kell jelentkezni
ú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.
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
vili.
köszönöm az infót, és külön jó fej vagy, hogy vetted a fáradságot, hogy magyarázz egy kicsit :)
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
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
- A hozzászóláshoz be kell jelentkezni
en hasznalom es imadom a perlt, de ezt nekem is emeszteni kell :D
- A hozzászóláshoz be kell jelentkezni
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 :-) )
- A hozzászóláshoz be kell jelentkezni
Még néhány karakterrel rövidebb változat:
sub w{for$;(0..2){say(map{substr' _ _|_ | |_|',('030030000054116224666421416461'=~/./g)[$_+$;*10]*2,3}split//,$_[0])}}
Egy nagyon hasonló feladat teljesen más megoldása:
http://stackoverflow.com/questions/1407422/code-golf-seven-segments
- A hozzászóláshoz be kell jelentkezni
110:
sub w{for$;(-2..0){say map{substr' _ _|_ |_| |',2*ord(('u$SR,Z]dmj'=~/./g)[$_])>>-3*$;&14,3}split//,$_[0]}}
- A hozzászóláshoz be kell jelentkezni
split//,$_[0]
"@_"=~/./g
-3 char
' _ _|_ |_| |'
' | |_|_ _ _|'
-1 char
;-)
- A hozzászóláshoz be kell jelentkezni
Az első jogos, de a második nem jó.
Szerepe van annak, hogy mindegyik felhasznált részstring páros indexnél kezdődik, és annak is, hogy a " _ " van az elején.
- A hozzászóláshoz be kell jelentkezni
> Az első jogos, de a második nem jó.
Nekem jó:
sub z{for$l(0..2){print$/,map{substr' | |_|_ _ _|',vec('0123456789abcdef',$l.$_,4),3}"@_"=~/./g}}
# a '0123456789abcdef' helyén: "\x09\x99\x90\x99\x99\x13\xBB\x75\x17\x55\x15\xB7\xB1\x15\xB5"
98 char
- A hozzászóláshoz be kell jelentkezni
Ha az van a helyén, akkor nem 98 karakter, hanem 143.
(Jó, értem én, de nem szép a nem-ASCII megoldás)
- A hozzászóláshoz be kell jelentkezni