Chỉ cần một Hacker Perl [đóng]


22

Thử thách golf mã cổ điển. Viết chương trình Perl khó hiểu nhất để in "Chỉ là một hacker Perl khác". Đây là bài viết Wikipedia về nó. Điểm thưởng nếu phù hợp với 3 dòng / 70 ký tự mỗi dòng.


2
Bị che khuất thay vì tối nghĩa?
Josh

13
Code golf phải là về mã ngắn nhất, không phải "tối nghĩa nhất". Ngắn nhất là khách quan. "Hầu hết tối nghĩa" là chủ quan.
Chris Jester-Young

2
@Chris: Đây cũng không phải là về câu đố lập trình chung sao? Ok, có thể tranh cãi liệu obfuscation có rơi vào đó hay không nhưng theo tôi hiểu thì đây không phải là một trang web chơi gôn thuần túy .
Joey

1
@Joey: Không phải, nhưng, nền tảng Stack Exchange hiệu quả hơn nhiều cho các câu hỏi khách quan, không phải câu hỏi "mà OP thích nhất".
Chris Jester-Young

Câu trả lời:


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); cho (; $ j <24; $ j ++) {$ x = 0; cho ($ k = 0; $ k <24; $ k ++) {$ x
+ = @ h [$ k] << ($ j * $ k% 24); $ x% = 241;} @ H [$ j] = $ x;} gói in ('c *', @ H)

Tôi không chắc chắn liệu một dòng mới ở cuối có được yêu cầu hay không: nếu vậy, việc bổ sung ."\n"vẫn không đưa tôi đến giới hạn 3 dòng * 70 ký tự / dòng.

Nếu không có vấn đề về mã hóa, việc khởi tạo có thể nhỏ hơn nhiều và được giải nén bằng giải nén, vì vậy tôi hy vọng ai đó có thể cải thiện vấn đề này. Tôi đang suy nghĩ về việc tạo ra một phiên bản hiệu quả hơn - đây là O (n ^ 2) và giải mã O (n lg n) là có thể.


+1 cho <3 ở cuối giá trị ký tự của mảng của bạn!
Ry-

28
eval eval '"'.


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

5
sử dụng Time'HiRes "us ngủ"; $ | = @ q = (a..z, ''); @ w = ('chỉ là một hacker perl'
= ~ /./ g); while ("@ w" ne "@e") {$ e [$ _] eq $ w [$ _] hoặc $ e [$ _] = $ q [rand @ q] cho +0 .. $ # w;
in "\ r @ e"; us ngủ + 1e5}

phiên bản hoạt hình :)


3

Ít hơn 70 ký tự trên 3 dòng:

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

Chăm sóc: Đó là mã hóa 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 

Hơn 70 ký tự, nhưng ít hơn 100!

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

  3 92  37

Và một chút xáo trộn !

Một chút đi?!

Có một tập lệnh <1'000 perl với đầy đủ trợ giúp và một số tính năng:

(Đó cũng là mã hóa 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.$;;

Có một số tính năng:

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

Ở đâu:

  • -v Chữ ký
  • -h chuỗi trợ giúp
  • -jnhắc nhở Chỉ cần một hacker khác.
  • -clàm động chuỗi japh hoặc chuỗi gửi nếu có
  • -k tự đổ kịch bản
  • -p đánh bại kịch bản khác

Vì thế:

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

(Chuỗi cuối cùng là hoạt hình :)

Đang cố gắng khử béo phì

Có một mô-đun B :: Depough đẹp có sẵn trên 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

Chà, cái này dễ đọc hơn , nhưng ...

Ok, có một pack('v', 27000), nó có nghĩa là gì:

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

Hừm. vì vậy chúng tôi có thể cố gắng đơn giản hóa công việc của 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

Chà, bây giờ rõ ràng là toàn bộ tập lệnh được chứa trong qq(...)dòng 2 và phải được đệ trình eval. Bây giờ chúng ta có thể:

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

Trong hy vọng deparser có thể hiểu rõ hơn, bây giờ:

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

Tốt! Chúng tôi có một cái gì đó gần có thể đọc được, bây giờ. Làm điều này luôn luôn cho kết quả tương tự?

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 .

(Và dòng cuối cùng là hoạt hình :)


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

Nó hoạt động với sự nghiêm ngặt được kích hoạt. Mặc dù nó không hoạt động trên tất cả các máy / perls, vì 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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.