Défi de golf à code classique. Écrivez le programme Perl le plus obscur pour imprimer "Juste un autre pirate Perl". Voici l'article Wikipedia à ce sujet. Points bonus s'il tient sur 3 lignes / 70 caractères chacun.
Défi de golf à code classique. Écrivez le programme Perl le plus obscur pour imprimer "Juste un autre pirate Perl". Voici l'article Wikipedia à ce sujet. Points bonus s'il tient sur 3 lignes / 70 caractères chacun.
Réponses:
@ H = @ h = (176.138.140,17,87,54.126.182.217.223.136.130.136.117,73,52.154, 134,161,36,33,92,60,51); pour (; $ j <24; $ j ++) {$ x = 0; pour ($ k = 0; $ k <24; $ k ++) {$ x + = @ h [$ k] << ($ j * $ k% 24); $ x% = 241;} @ H [$ j] = $ x;} pack d'impression ('c *', @ H)
Je ne sais pas si une nouvelle ligne à la fin est requise: si c'est le cas, l'ajout de ."\n"
ne me prend toujours pas jusqu'à la limite de 3 lignes * 70 caractères / ligne.
Si ce n'était pas pour des problèmes d'encodage, l'initialisation pourrait être beaucoup plus petite et extraite avec unpack, donc je m'attends à ce que quelqu'un puisse l'améliorer. Je pense à faire une version plus efficace - c'est O (n ^ 2), et le décodage O (n lg n) est possible.
eval eval '"'.
('['^"\+").(
('[')^ ')').('`'|')').
('`'|'.'). ('['^'/').('{'^'['
).'\\'.'"' .('`'^ '*').('['^'.').('['^
'(').('['^'/').('{'^ '[').('`'|'!').(('`')|
'.').('`'|'/').("\["^ '/').('`'|'(').('`'|'%'
).('['^')').(('{')^ '[').('{'^'+').('`'|'%').(
'['^')').('`'| ',').('{'^'[').('`'|'(').('`'
|'!').('`'|'#' ).('`'|'+').('`'|'%').('['^')').
'\\'.'"'.("\!"^ '+').'"';$:='.'^'~';$~='@'|"\(";$^=
')'^'[';$/='`'| '.';$,='('^'}';$\='`'|'!';$:=')'^"\}";
$~='*'|"\`";$^= '+'^'_';$/='&'|'@';$,='['&'~';$\=','^'|'
;$:='.'^'~';$~ ='@'|'(';$^=')'^'[';$/='`'|'.';$,='('^'}'
;$\='`'|'!';$: =')'^'}';$~='*'|'`';$^='+'^'_';$/='&'|'@';
$,='['&'~';$\=','^'|';$:='.'^'~';$~='@'|'(';$^=')'^'[';$/=
'`'|'.';$,='('^'}';$\='`'|'!';$:=')'^'}';$~='*'|'`';$^='+'^
'_';$/='&'|'@';$,='['&'~';$\=','^'|';$:='.'^'~';$~='@'|'('
;$^=')'^'[';$/='`'|'.';$,='('^'}';$\='`'|'!';$:=')'^'}';$~=
'*'|'`';$^='+'^'_';$/='&'|'@';$,='['&'~';$\=','^'|';$:='.'^
'~';$~='@'|'(';$^=')'^'[';$/='`'|'.';$,='('^'}';$\='`'|'!'
;$:=')'^'}';$~='*'|'`';$^='+'^'_';$/='&'|'@';$,="\["& '~'
;$\=','^'|';$:='.'^'~';$~='@'|'(';$^=')'^'[';$/='`' |((
'.'));$,='('^'}';$\='`'|'!';$:=')'^'}';$~ ='*'|'`' ;$^
='+'^'_';$/='&'|'@';$,='['&'~';$\=','^ '|';$:= '.'
^'~'; $~='@'|'(';$^=')'^'[';$/="\`"| '.';$,= '('
^'}';$\='`'|'!';$:=')'^'}';$~ =('*')| '`'
;$^='+'^ '_';$/='&' |"\@"; $,='[' &+
'~';$\= ','^'|'; $:='.' ^"\~"; $~
=('@')| "\(";$^= "\)"^ "\["; (
($/))= '`'|'.'; ($,) ='('
^"\}"; $\=('`')| '!'; ($:)
=')'^ "\}";$~= '*'| '`';
($^)= '+'^'_' ;$/= '&'|
'@'; $,='[' &'~' ;$\=
','^ '|' ;$:= '.'^
'~'; $~= '@' |((
'(' )); $^= ')'
^(( '[' )); $/=
'`' |(( '.' ))
;( ($,))= ((
(( '(')) ))
^+ "\}";$\= ((
'`' ))|+ "\!"; $:
=(( ')'))^ '}'; $~=
'*'| "\`";$^= '+' ^'_'
;($/)= ('&')|
"\@";$,= '['&'~'
utiliser Time'HiRes "usleep"; $ | = @ q = (a..z, ''); @ w = ('juste un autre pirate perl' = ~ /./ g); while ("@ w" ne "@e") {$ e [$ _] eq $ w [$ _] ou $ e [$ _] = $ q [rand @ q] pour +0 .. $ # w; imprimer "\ r @ e"; usleep + 1e5}
version animée :)
$_=unpack("H21","9Ø
HvÂláµöÂ");s/(.)/" "x(hex$1<3).substr
"AHPJocehtunarslk",hex$1,1/eg;say
Attention: il est codé ISO-8859-1 .
perl -E '$_=unpack("H21","9Ø
HvÂláµöÂ");s/(.)/" "x(hex$1<3).substr
"AHPJocehtunarslk",hex$1,1/eg;say'
Just Another Perl Hacker
Plus de 70 caractères, mais moins de 100!
wc -clL <<< '$_=unpack("H21","9Ø
HvÂláµöÂ");s/(.)/" "x(hex$1<3).substr
"AHPJocehtunarslk",hex$1,1/eg;say'
3 92 37
Et un peu obscurci !
Il existe un script <1'000 perl avec une aide complète et quelques fonctionnalités:
(Il est également encodé ISO-8859-1 ;)
#!/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.$;;
Il y a quelques fonctionnalités:
./japh.pl -h
Usage: ./japh.pl [ -v | -h | -j [-c[=string]] | -k | -p=file.pl ].
Où:
-v
Signature-h
chaîne d'aide-j
invite juste un autre pirate perl.-c
animer la chaîne japh ou une chaîne soumise le cas échéant-k
vider le script lui-même-p
poluter un autre scriptAlors:
./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.
(La dernière chaîne est animée :)
Il y a un joli module B :: Deparse disponible sur CPAN:
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
Eh bien, c'est plus lisible, mais ...
Ok, il y a un pack('v', 27000)
, ce que cela signifie:
perl -E "say pack('v', 27000)";
xi
Hmm. afin que nous puissions essayer de simplifier le travail du parseur:
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
Eh bien, maintenant il est clair que tout le script est contenu qq(...)
sur la ligne 2 et doit être soumis à eval
. Nous pourrions maintenant:
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
Dans l'espoir que le parseur pourrait mieux comprendre, maintenant:
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
Bien! Nous avons maintenant quelque chose de presque lisible. Est-ce que cela donne toujours le même résultat?
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 .
(Et la dernière ligne est animée :)
use strict;*1=*CORE'die,*!=*=,@=='hacker',s??'&1(@!,$/)'?ee;s;;%ENV=~m
,..$,,$&+10;e,@!=(chr.'ust',~~reverse('rehtona'),'Perl',$@);&1("@{=}")
Il fonctionne avec les restrictions activées. Bien que cela ne fonctionne pas sur toutes les machines / perles, à cause de CORE'die
et ~~%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