อีกแค่ Perl Hacker [ปิด]


22

ความท้าทายกอล์ฟรหัสคลาสสิก เขียนโปรแกรม Perl ที่คลุมเครือที่สุดในการพิมพ์ "Just another Perl hacker" นี่คือบทความ Wikipedia ที่มี คะแนนโบนัสหากเหมาะสมกับ 3 บรรทัด / 70 ตัวอักษร


2
สับสนแทนที่จะคลุมเครือ?
Josh

13
รหัสกอล์ฟจะต้องมีรหัสสั้นที่สุดไม่ใช่ "ชัดเจนที่สุด" สั้นที่สุดคือวัตถุประสงค์ "ส่วนใหญ่คลุมเครือ" เป็นอัตนัย
Chris Jester-Young

2
@Chris: นี่ไม่ได้เกี่ยวกับปริศนาการเขียนโปรแกรมทั่วไปใช่ไหม ตกลงพิสูจน์ได้ว่า obfuscation ตกอยู่ภายใต้ว่า แต่เท่าที่ฉันเข้าใจมันไม่ได้เป็นเว็บไซต์รหัสกอล์ฟบริสุทธิ์
Joey

1
@ โจอี้: มันไม่ได้ แต่แพลตฟอร์มสแต็คแลกเปลี่ยนมีประสิทธิภาพมากขึ้นสำหรับคำถามวัตถุประสงค์ไม่ใช่คน "ที่ OP ชอบที่สุด"
Chris Jester-Young

คำตอบ:


8
@ 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) สำหรับ (; $ J <24; $ J ++) {$ x = 0; สำหรับ ($ k = 0; $ k <24; $ k ++) {$ x
+ = @ h [$ k] << ($ j * $ k% 24); $ x% = 241;} @ H [$ j] = $ x;} ชุดพิมพ์ ('c *', @ H)

ฉันไม่แน่ใจว่าจำเป็นต้องมีการขึ้นบรรทัดใหม่ท้าย: ถ้าเป็นเช่นนั้นการเพิ่มขึ้น."\n"ยังไม่ได้นำฉันไปสู่ขีด จำกัด ของ 3 บรรทัด * 70 ตัวอักษร / บรรทัด

หากไม่ใช่เพราะการเข้ารหัสปัญหาการเริ่มต้นอาจน้อยกว่ามากและคลายการบีบอัดดังนั้นฉันคาดว่าจะมีคนสามารถปรับปรุงเรื่องนี้ได้ ฉันกำลังคิดที่จะสร้างรุ่นที่มีประสิทธิภาพมากขึ้น - นี่คือ O (n ^ 2) และการถอดรหัส O (n lg n) เป็นไปได้


+1 สำหรับ <3 ในตอนท้ายของค่าตัวละครของอาร์เรย์ของคุณ!
Ry-

28
eval eval '"'.


                                      ('['^"\+").(
           ('[')^                   ')').('`'|')').
        ('`'|'.').                ('['^'/').('{'^'['
 ).'\\'.'"'  .('`'^              '*').('['^'.').('['^
'(').('['^'/').('{'^            '[').('`'|'!').(('`')|
'.').('`'|'/').("\["^          '/').('`'|'(').('`'|'%'
  ).('['^')').(('{')^        '[').('{'^'+').('`'|'%').(
       '['^')').('`'|      ',').('{'^'[').('`'|'(').('`'
      |'!').('`'|'#'     ).('`'|'+').('`'|'%').('['^')').
     '\\'.'"'.("\!"^   '+').'"';$:='.'^'~';$~='@'|"\(";$^=
    ')'^'[';$/='`'|   '.';$,='('^'}';$\='`'|'!';$:=')'^"\}";
    $~='*'|"\`";$^=  '+'^'_';$/='&'|'@';$,='['&'~';$\=','^'|'
    ;$:='.'^'~';$~  ='@'|'(';$^=')'^'[';$/='`'|'.';$,='('^'}'
    ;$\='`'|'!';$:  =')'^'}';$~='*'|'`';$^='+'^'_';$/='&'|'@';
    $,='['&'~';$\=','^'|';$:='.'^'~';$~='@'|'(';$^=')'^'[';$/=
    '`'|'.';$,='('^'}';$\='`'|'!';$:=')'^'}';$~='*'|'`';$^='+'^
     '_';$/='&'|'@';$,='['&'~';$\=','^'|';$:='.'^'~';$~='@'|'('
     ;$^=')'^'[';$/='`'|'.';$,='('^'}';$\='`'|'!';$:=')'^'}';$~=
      '*'|'`';$^='+'^'_';$/='&'|'@';$,='['&'~';$\=','^'|';$:='.'^
       '~';$~='@'|'(';$^=')'^'[';$/='`'|'.';$,='('^'}';$\='`'|'!'
        ;$:=')'^'}';$~='*'|'`';$^='+'^'_';$/='&'|'@';$,="\["& '~'
         ;$\=','^'|';$:='.'^'~';$~='@'|'(';$^=')'^'[';$/='`'  |((
          '.'));$,='('^'}';$\='`'|'!';$:=')'^'}';$~ ='*'|'`'  ;$^
            ='+'^'_';$/='&'|'@';$,='['&'~';$\=','^  '|';$:=   '.'
             ^'~'; $~='@'|'(';$^=')'^'[';$/="\`"|   '.';$,=   '('
                   ^'}';$\='`'|'!';$:=')'^'}';$~    =('*')|   '`'
                   ;$^='+'^    '_';$/='&' |"\@";     $,='['   &+
                   '~';$\=     ','^'|';   $:='.'     ^"\~";  $~
                   =('@')|     "\(";$^=   "\)"^       "\[";  (
                   ($/))=      '`'|'.';   ($,)         ='('
                   ^"\}";     $\=('`')|   '!';         ($:)
                    =')'^     "\}";$~=    '*'|         '`';
                    ($^)=     '+'^'_'     ;$/=         '&'|
                    '@';     $,='['       &'~'         ;$\=
                    ','^     '|'          ;$:=         '.'^
                    '~';      $~=         '@'          |((
                    '('        ));       $^=           ')'
                    ^((         '['     ));            $/=
                    '`'          |((   '.'              ))
                    ;(             ($,))=               ((
                    ((              '('))               ))
                    ^+             "\}";$\=             ((
                   '`'            ))|+ "\!";            $:
                  =((           ')'))^  '}';           $~=
                 '*'|         "\`";$^=   '+'          ^'_'
               ;($/)=                                ('&')|
             "\@";$,=                               '['&'~'

5
ใช้ Time'HiRes "usleep"; $ | = @ q = (a..z, ''); @ w = ('แฮกเกอร์ perl อีกคนหนึ่ง'
= ~ /./ กรัม) ในขณะที่ ( "W @" ภาคตะวันออกเฉียงเหนือ "@e") {$ E [$ _] EQ $ W [$ _] หรือ $ E [$ _] = $ Q [แรนด์ @ Q] สำหรับ 0 .. $ # W;
พิมพ์ "\ r @ E"; usleep + 1e5}

รุ่นภาพเคลื่อนไหว :)


3

น้อยกว่า 70 ตัวอักษรใน 3 บรรทัด:

$_=unpack("H21","9Ø
HvÂláµöÂ");s/(.)/" "x(hex$1<3).substr
"AHPJocehtunarslk",hex$1,1/eg;say

การดูแล: มันถูกเข้ารหัสด้วย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 

มากกว่า 70 ตัวอักษรทั้งหมด แต่น้อยกว่า100ตัวอักษร!

wc -clL <<< '$_=unpack("H21","9Ø
HvÂláµöÂ");s/(.)/" "x(hex$1<3).substr
"AHPJocehtunarslk",hex$1,1/eg;say'

  3 92  37

และสับสนเล็กน้อย!

ออกไปหน่อย!

มีสคริปต์<1'000 perl พร้อมความช่วยเหลือแบบเต็มและคุณสมบัติบางอย่าง:

(มันเข้ารหัสด้วย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.$;;

มีคุณสมบัติบางอย่าง:

./japh.pl -h
Usage: ./japh.pl [ -v | -h | -j [-c[=string]] | -k | -p=file.pl ].

ที่ไหน:

  • -v ลายเซ็น
  • -h สตริงช่วยเหลือ
  • -jพรอมต์เพียงแฮกเกอร์ Perl อื่น
  • -cเคลื่อนไหวสตริงjaphหรือสตริงที่ส่งถ้ามี
  • -k ทิ้งสคริปต์ของตัวเอง
  • -p polute สคริปต์อื่น

ดังนั้น:

./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.

(สตริงสุดท้ายเป็นภาพเคลื่อนไหว :)

พยายามยกเลิกการทำให้งง

มีB ที่ดี::โมดูลDeparseมีอยู่ใน 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

ดีนี้เป็นมากขึ้นสามารถอ่านได้ แต่ ...

ตกลงมีความpack('v', 27000)หมาย:

perl -E "say pack('v', 27000)";
xi

อืมมม ดังนั้นเราสามารถลองทำให้งานของ deparser ง่ายขึ้น:

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

ดีตอนนี้ก็เป็นที่ชัดเจนว่าสคริปต์ทั้งหมดที่มีอยู่ในqq(...)ในบรรทัดที่ 2 evalและจะต้องมีการยื่นไป ตอนนี้เราสามารถ:

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

ในความหวังdeparserสามารถเข้าใจได้ดีขึ้นตอนนี้:

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

ดี! ตอนนี้เรามีบางอย่างใกล้อ่านแล้ว ทำเช่นนี้เสมอให้ผลเหมือนกันหรือไม่

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 .

(และบรรทัดสุดท้ายเป็นภาพเคลื่อนไหว :)


1
use strict;*1=*CORE'die,*!=*=,@=='hacker',s??'&1(@!,$/)'?ee;s;;%ENV=~m
,..$,,$&+10;e,@!=(chr.'ust',~~reverse('rehtona'),'Perl',$@);&1("@{=}")

มันทำงานด้วยการเปิดใช้งานการ จำกัด แม้ว่ามันจะไม่ทำงานบนเครื่องทั้งหมด / perls เพราะและCORE'die~~%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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.