Klassische Code Golf Challenge. Schreiben Sie das dunkelste Perl-Programm, um "Just another Perl hacker" zu drucken. Hier ist der Wikipedia-Artikel dazu. Bonuspunkte, wenn es in 3 Zeilen à 70 Zeichen passt.
Klassische Code Golf Challenge. Schreiben Sie das dunkelste Perl-Programm, um "Just another Perl hacker" zu drucken. Hier ist der Wikipedia-Artikel dazu. Bonuspunkte, wenn es in 3 Zeilen à 70 Zeichen passt.
Antworten:
@ H = @ h = (176,138,140,17,87,54,126,182,217,223,136,136,117,73,52,154, 134,161,36,33,92,60,51); für (; $ j <24; $ j ++) {$ x = 0; für ($ k = 0; $ k <24; $ k ++) {$ x + = @ h [$ k] << ($ j * $ k% 24); $ x% = 241;} @ H [$ j] = $ x;} Druckpaket ('c *', @ H)
Ich bin mir nicht sicher, ob eine neue Zeile am Ende erforderlich ist. Wenn ja, führt die Hinzufügung von ."\n"
immer noch nicht zu einer Beschränkung von 3 Zeilen * 70 Zeichen / Zeile.
Wenn es keine Kodierungsprobleme gäbe, könnte die Initialisierung viel kleiner sein und mit Unpack extrahiert werden. Ich gehe also davon aus, dass jemand dies verbessern kann. Ich denke über eine effizientere Version nach - dies ist O (n ^ 2) und O (n lg n) -Decodierung ist möglich.
eval eval '"'.
('['^"\+").(
('[')^ ')').('`'|')').
('`'|'.'). ('['^'/').('{'^'['
).'\\'.'"' .('`'^ '*').('['^'.').('['^
'(').('['^'/').('{'^ '[').('`'|'!').(('`')|
'.').('`'|'/').("\["^ '/').('`'|'(').('`'|'%'
).('['^')').(('{')^ '[').('{'^'+').('`'|'%').(
'['^')').('`'| ',').('{'^'[').('`'|'(').('`'
|'!').('`'|'#' ).('`'|'+').('`'|'%').('['^')').
'\\'.'"'.("\!"^ '+').'"';$:='.'^'~';$~='@'|"\(";$^=
')'^'[';$/='`'| '.';$,='('^'}';$\='`'|'!';$:=')'^"\}";
$~='*'|"\`";$^= '+'^'_';$/='&'|'@';$,='['&'~';$\=','^'|'
;$:='.'^'~';$~ ='@'|'(';$^=')'^'[';$/='`'|'.';$,='('^'}'
;$\='`'|'!';$: =')'^'}';$~='*'|'`';$^='+'^'_';$/='&'|'@';
$,='['&'~';$\=','^'|';$:='.'^'~';$~='@'|'(';$^=')'^'[';$/=
'`'|'.';$,='('^'}';$\='`'|'!';$:=')'^'}';$~='*'|'`';$^='+'^
'_';$/='&'|'@';$,='['&'~';$\=','^'|';$:='.'^'~';$~='@'|'('
;$^=')'^'[';$/='`'|'.';$,='('^'}';$\='`'|'!';$:=')'^'}';$~=
'*'|'`';$^='+'^'_';$/='&'|'@';$,='['&'~';$\=','^'|';$:='.'^
'~';$~='@'|'(';$^=')'^'[';$/='`'|'.';$,='('^'}';$\='`'|'!'
;$:=')'^'}';$~='*'|'`';$^='+'^'_';$/='&'|'@';$,="\["& '~'
;$\=','^'|';$:='.'^'~';$~='@'|'(';$^=')'^'[';$/='`' |((
'.'));$,='('^'}';$\='`'|'!';$:=')'^'}';$~ ='*'|'`' ;$^
='+'^'_';$/='&'|'@';$,='['&'~';$\=','^ '|';$:= '.'
^'~'; $~='@'|'(';$^=')'^'[';$/="\`"| '.';$,= '('
^'}';$\='`'|'!';$:=')'^'}';$~ =('*')| '`'
;$^='+'^ '_';$/='&' |"\@"; $,='[' &+
'~';$\= ','^'|'; $:='.' ^"\~"; $~
=('@')| "\(";$^= "\)"^ "\["; (
($/))= '`'|'.'; ($,) ='('
^"\}"; $\=('`')| '!'; ($:)
=')'^ "\}";$~= '*'| '`';
($^)= '+'^'_' ;$/= '&'|
'@'; $,='[' &'~' ;$\=
','^ '|' ;$:= '.'^
'~'; $~= '@' |((
'(' )); $^= ')'
^(( '[' )); $/=
'`' |(( '.' ))
;( ($,))= ((
(( '(')) ))
^+ "\}";$\= ((
'`' ))|+ "\!"; $:
=(( ')'))^ '}'; $~=
'*'| "\`";$^= '+' ^'_'
;($/)= ('&')|
"\@";$,= '['&'~'
benutze Time'HiRes "usleep"; $ | = @ q = (a..z, ''); @ w = ('nur ein weiterer Perl-Hacker' = ~ /./ g); while ("@ w" ne "@e") {$ e [$ _] eq $ w [$ _] oder $ e [$ _] = $ q [rand @ q] für +0 .. $ # w; print "\ r @ e"; usleep + 1e5}
animierte version :)
$_=unpack("H21","9Ø
HvÂláµöÂ");s/(.)/" "x(hex$1<3).substr
"AHPJocehtunarslk",hex$1,1/eg;say
Pflege: Es ist ISO-8859-1 kodiert.
perl -E '$_=unpack("H21","9Ø
HvÂláµöÂ");s/(.)/" "x(hex$1<3).substr
"AHPJocehtunarslk",hex$1,1/eg;say'
Just Another Perl Hacker
Über 70 Zeichen, aber weniger als 100!
wc -clL <<< '$_=unpack("H21","9Ø
HvÂláµöÂ");s/(.)/" "x(hex$1<3).substr
"AHPJocehtunarslk",hex$1,1/eg;say'
3 92 37
Und ein bisschen verschleiert !
Es gibt ein <1'000 Perl-Skript mit einer vollständigen Hilfe und einigen Funktionen:
(Es ist auch ISO-8859-1 codiert;)
#!/usr/bin/perl -s
$;=$/;$_=q=sub'O{un=."\144e".q[f}sub'l{$#_==-1?leng].q[th:leng].'t'.q[h&a}sub'u{($.=
q;?02:;)=~y+0-@+a-q+;$. =~s/^/&a?"un].q[":""/mxe;$..=' "b';$..=do{$.].q[=~m+^u+?&a:1
}<<3;$..='","';$..=do{$.].q[=~m+^u+?"\44_":&a};eval $.."\42"}s].q[ub'a{pop}sub'b{$.=
"Hauri Félix, ";$v?do{$_=$.;y+?-^+_-~+;].q[s/\s.*/.ch/mgx;$_=do{$0=~m-j\w+-?$&.q.@.:
(q.w.x3).q,.,}.q qf-q].q[.$_;$..$_}:sub].q[str("lockpents ".$.,&a,1)}sub'p{pr]."in".
q<t do{$#_+1?&a."\n":do{/\n/?$_:$_.".\n"}}};sub'x{e>.pack("v",27000).q<t}sub't{sel>.
"ec".q<t O,&O,O,&a};$v&&{p $0." \251".(30*67)." ".b}&&x;$j&&do{$_="Îx¹\26§ÕIÕ\220º".
"2Õ";$_=>.q<u 12,1;s/.{4}/b ord u O,"$&",O/meg;tr+@-[+`-{+;s/./($.=$&)=~y.^-{.?-\\>.
q<\\.;$./xe;p;$c&&do{$c!=1&&do{$_=$c." ";p};fo>."reac".q<h$=(1..2*l){s/.//m;$_.=$&;p
"\33[A\r".$_;t.1}};x};$/=O;o>.chr(0x38*2).q-en$_,$0;$_=<$_>;$k&&p&&x||$p&&do{p;op-.q
len$p,$p;p<$p>;x};$h&&do{$_="Usal.q lge: ".$0." [ -v | -h | -j [-c[=string]] | -k |l
.q+ -p=file.pl ]";p;x};1+;eval||die+No.$;;
Es gibt einige Funktionen:
./japh.pl -h
Usage: ./japh.pl [ -v | -h | -j [-c[=string]] | -k | -p=file.pl ].
Woher:
-v
Unterschrift-h
Hilfe Zeichenfolge-j
Eingabeaufforderung Nur ein weiterer Perl-Hacker.-c
Animieren Sie die Japh- Zeichenfolge oder eine übermittelte Zeichenfolge, falls vorhanden-k
Dump das Skript selbst-p
Beschreibe ein anderes SkriptSo:
./japh.pl -j
Just another perl hacker.
./japh.pl -k | wc -lcL
14 998 84
./japh.pl -p=$(which perldoc) >japhedPerldoc
chmod +x japhedPerldoc
./japhedPerldoc perl | head
PERL(1) User Contributed Perl Documentation PERL(1)
NAME
perl - The Perl 5 language interpreter
SYNOPSIS
perl [ -sTtuUWX ] [ -hv ] [ -V[:configvar] ]
[ -cw ] [ -d[t][:debugger] ] [ -D[number/list] ]
./japhedPerldoc -j -c
Just another perl hacker.
(Die letzte Saite ist animiert :)
Auf CPAN ist ein nettes B :: Deparse- Modul verfügbar:
perl -MO=Deparse japh.pl
$; = $/;
$_ = qq[sub'O{undef}sub'l{\$#_==-1?length:length&a}sub'u{(\$.=\nq;?02:;)=~y+0-\@+a-q+;\$. =~s/^/&a?"un":""/mxe;\$..=' "b';\$..=do{\$.=~m+^u+?&a:1\n}<<3;\$..='","';\$..=do{\$.=~m+^u+?"\\44_":&a};eval\$.."\\42"}sub'a{pop}sub'b{\$.=\n"Hauri F\351lix, ";\$v?do{\$_=\$.;y+?-^+_-~+;s/\\s.*/.ch/mgx;\$_=do{\$0=~m-j\\w+-?\$&.q.\@.:\n(q.w.x3).q,.,}.q qf-q.\$_;\$..\$_}:substr("lockpents ".\$.,&a,1)}sub'p{print do{\$#_+1?&a."\\n":do{/\\n/?\$_:\$_.".\\n"}}};sub'x{e] . pack('v', 27000) . q[t}sub't{sel] . 'ec' . qq[t O,&O,O,&a};\$v&&{p \$0." \\251".(30*67)." ".b}&&x;\$j&&do{\$_="\316x\271\\26\247\325I\325\\220\272".\n"2\325";\$_=] . 'u 12,1;s/.{4}/b ord u O,"$&",O/meg;tr+@-[+`-{+;s/./($.=$&)=~y.^-{.?-\\' . '\\.;$./xe;p;$c&&do{$c!=1&&do{$_=$c." ";p};fo' . 'reac' . qq(h\$=(1..2*l){s/.//m;\$_.=\$&;p\n"\\33[A\\r".\$_;t.1}};x};\$/=O;o) . 'p' . 'en$_,$0;$_=<$_>;$k&&p&&x||$p&&do{p;op' . 'en$p,$p;p<$p>;x};$h&&do{$_="Usa' . 'ge: ".$0." [ -v | -h | -j [-c[=string]] | -k |' . ' -p=file.pl ]";p;x};1';
die 'No' . $; unless eval $_;
japh.pl syntax OK
Nun, das ist besser lesbar, aber ...
Ok, es gibt eine pack('v', 27000)
, was es bedeutet:
perl -E "say pack('v', 27000)";
xi
Hmm. so könnten wir versuchen, die arbeit von deparser zu vereinfachen:
perl -MO=Deparse <(sed -e <japh.pl 's/pack("v",27000)/"xi"/')
$; = $/;
$_ = qq(sub'O{undef}sub'l{\$#_==-1?length:length&a}sub'u{(\$.=\nq;?02:;)=~y+0-\@+a-q+;\$. =~s/^/&a?"un":""/mxe;\$..=' "b';\$..=do{\$.=~m+^u+?&a:1\n}<<3;\$..='","';\$..=do{\$.=~m+^u+?"\\44_":&a};eval \$.."\\42"}sub'a{pop}sub'b{\$.=\n"Hauri F\351lix, ";\$v?do{\$_=\$.;y+?-^+_-~+;s/\\s.*/.ch/mgx;\$_=do{\$0=~m-j\\w+-?\$&.q.\@.:\n(q.w.x3).q,.,}.q qf-q.\$_;\$..\$_}:substr("lockpents ".\$.,&a,1)}sub'p{print do{\$#_+1?&a."\\n":do{/\\n/?\$_:\$_.".\\n"}}};sub'x{exit}sub't{select O,&O,O,&a};\$v&&{p \$0." \\251".(30*67)." ".b}&&x;\$j&&do{\$_="\316x\271\\26\247\325I\325\\220\272".\n"2\325";\$_=u 12,1;s/.{4}/b ord u O,"\$&",O/meg;tr+\@-[+`-{+;s/./(\$.=\$&)=~y.^-{.?-\\\\.;\$./xe;p;\$c&&do{\$c!=1&&do{\$_=\$c." ";p};foreach\$=(1..2*l){s/.//m;\$_.=\$&;p\n"\\33[A\\r".\$_;t.1}};x};\$/=O;open\$_,\$0;\$_=<\$_>;\$k&&p&&x||\$p&&do{p;open\$p,\$p;p<\$p>;x};\$h&&do{\$_="Usage: ".\$0." [ -v | -h | -j [-c[=string]] | -k | -p=file.pl ]";p;x};1);
die 'No' . $; unless eval $_;
/dev/fd/63 syntax OK
Nun ist klar, dass das gesamte Skript in qq(...)
Zeile 2 enthalten ist und eingereicht werden muss eval
. Wir könnten jetzt:
perl -MO=Deparse <(sed -e <japh.pl 's/pack("v",27000)/"xi"/') |
sed -ne 's/$_ = \(qq(.*)\);/print \1/p' |
perl
/dev/fd/63 syntax OK
sub'O{undef}sub'l{$#_==-1?length:length&a}sub'u{($.=
q;?02:;)=~y+0-@+a-q+;$. =~s/^/&a?"un":""/mxe;$..=' "b';$..=do{$.=~m+^u+?&a:1
}<<3;$..='","';$..=do{$.=~m+^u+?"\44_":&a};eval $.."\42"}sub'a{pop}sub'b{$.=
"Hauri Félix, ";$v?do{$_=$.;y+?-^+_-~+;s/\s.*/.ch/mgx;$_=do{$0=~m-j\w+-?$&.q.@.:
(q.w.x3).q,.,}.q qf-q.$_;$..$_}:substr("lockpents ".$.,&a,1)}sub'p{print do{$#_+1?&a."\n":do{/\n/?$_:$_.".\n"}}};sub'x{exit}sub't{select O,&O,O,&a};$v&&{p $0." \251".(30*67)." ".b}&&x;$j&&do{$_="Îx¹\26§ÕIÕ\220º".
"2Õ";$_=u 12,1;s/.{4}/b ord u O,"$&",O/meg;tr+@-[+`-{+;s/./($.=$&)=~y.^-{.?-\\.;$./xe;p;$c&&do{$c!=1&&do{$_=$c." ";p};foreach$=(1..2*l){s/.//m;$_.=$&;p
"\33[A\r".$_;t.1}};x};$/=O;open$_,$0;$_=<$_>;$k&&p&&x||$p&&do{p;open$p,$p;p<$p>;x};$h&&do{$_="Usage: ".$0." [ -v | -h | -j [-c[=string]] | -k | -p=file.pl ]";p;x};1
In der Hoffnung, Deparser könnte jetzt besser verstehen:
perl -MO=Deparse <(sed -e <japh.pl 's/pack("v",27000)/"xi"/') |
sed -ne 's/$_ = \(qq(.*)\);/print \1/p' |
perl |
perl -MO=Deparse
/dev/fd/63 syntax OK
sub O {
undef;
}
sub l {
$#_ == -1 ? length $_ : length &a;
}
sub u {
($. = '?02:') =~ tr/0-@/a-q/;
$. =~ s/^/&a ? 'un' : '';/emx;
$. .= ' "b';
$. .= do {
$. =~ /^u/ ? &a : 1
} << 3;
$. .= '","';
$. .= do {
$. =~ /^u/ ? '$_' : &a
};
eval $. . '"';
}
sub a {
pop();
}
sub b {
$. = "Hauri F\351lix, ";
$v ? do {
$_ = $.;
tr/?-^/_-~/;
s/\s.*/.ch/gmx;
$_ = do {
$0 =~ /j\w+/ ? $& . '@' : 'w' x 3 . '.'
} . 'f-' . $_;
$. . $_
} : substr('lockpents ' . $., &a, 1);
}
sub p {
print do {
$#_ + 1 ? &a . "\n" : do {
/\n/ ? $_ : $_ . ".\n"
}
};
}
sub x {
exit;
}
sub t {
select O(), &O, O(), &a;
}
x if $v and {p($0 . " \251" . 2010 . ' ' . b())};
if ($j) {
$_ = "\316x\271\cV\247\325I\325\220\2722\325";
$_ = u(12, 1);
s/.{4}/b ord u(O(), "$&", O());/egm;
tr/@-[/`-{/;
s[.][($. = $&) =~ tr/^-{/?-\\/;
$.;]ex;
p ;
if ($c) {
if ($c != 1) {
$_ = $c . ' ';
p ;
}
foreach $= (1 .. 2 * l()) {
s/.//m;
$_ .= $&;
p "\e[A\r" . $_;
t 0.1;
}
}
x ;
}
$/ = O();
open $_, $0;
$_ = <$_>;
$p and do {
p ;
open $p, $p;
p <$p>;
x
} unless $k and p and x ;
if ($h) {
$_ = 'Usage: ' . $0 . ' [ -v | -h | -j [-c[=string]] | -k | -p=file.pl ]';
p ;
x ;
}
'???';
- syntax OK
Gut! Wir haben jetzt etwas fast Lesbares. Gibt dies immer das gleiche Ergebnis?
perl -MO=Deparse <(sed -e <japh.pl 's/pack("v",27000)/"xi"/') |
sed -ne 's/$_ = \(qq(.*)\);/print \1/p' |
perl |
perl -MO=Deparse |
perl -s /dev/stdin -j -c="That's all folks"
/dev/fd/63 syntax OK
- syntax OK
Just another perl hacker.
That's all folks .
(Und die letzte Zeile ist animiert :)
use strict;*1=*CORE'die,*!=*=,@=='hacker',s??'&1(@!,$/)'?ee;s;;%ENV=~m
,..$,,$&+10;e,@!=(chr.'ust',~~reverse('rehtona'),'Perl',$@);&1("@{=}")
Es funktioniert mit aktivierten Strikturen. Obwohl es aufgrund von CORE'die
und nicht auf allen Rechnern / Perls funktioniert ~~%ENV
.
$ perl
use strict;*1=*CORE'die,*!=*=,@=='hacker',s??'&1(@!,$/)'?ee;s;;%ENV=~m
,..$,,$&+10;e,@!=(chr.'ust',~~reverse('rehtona'),'Perl',$@);&1("@{=}")
^Z
Just another Perl hacker