VIDTAKER.COM

Q&A

難読化パズル:あなたは何をこのPerl関数がない把握できますか?


sub foo {[$#{$_[!$||$|]}*@{$_[!!$_^!$_]}?@{$_[!$..!!$.]}[$_[@--@+]%
@{$_[$==~/(?=)//!$`]}..$#{$_[$??!!$?:!$?]},($)?!$):!!$))..$_[$--$-]%@{
$_[$]/$]]}-(!!$++!$+)]:@{$_[!!$^^^!$^^]}]}

更新:私は希望意味これを、と思った"という言葉パズル":私はありません知っているそれは-私はそれを書いている。場合パズルはしない興味のある、それを任意の時間を無駄にしないでください。



10 Replies

1)

ここではどのように把握する方法デは、このサブルーチンを難読化されます。

申し訳ありませんが長さ

まず、コード整頓ことができ、かつ有用なコメントを追加します。

sub foo {
  [
    (
      # ($#{$_[1]})
      $#{
        $_[
          ! ( $| | $| )
          # $OUTPUT_AUTOFLUSH === $|
          # $| is usually 0
          # ! ( $| | $| )
          # ! (  0 |  0 )
          # ! (  0 )
          # 1
        ]
      }

      *

      # @{$_[1]}
      @{
        $_[
          !!$_ ^ !$_

          # !! 1 ^ ! 1
          # !  0 ^   0
          #    1 ^   0
          # 1

          # !! 0 ^ ! 0
          # !  1 ^   1
          #    0 ^   1
          # 1
        ]
      }
    )

    ?


    # @{$_[1]}
    @{
      $_[
        !$. . !!$.
        # $INPUT_LINE_NUMBER === $.
        # $. starts at 1
        # !$. . !!$.
        # ! 1 . !! 1
        #   0 . ! 0
        #   0 . 1
        #   01
      ]
    }

    [
      # $_[0]
      $_[
        # @LAST_MATCH_START - @LAST_MATCH_END
        # 0
        @- - @+
      ]

      %


      # @{$_[1]}
      @{
        $_[
          $= =~ /(?=)/ / !$` #( fix highlighting )`/
          # $= is usually 60
          # /(?=)/ will match, returns 1
          # $` will be ''
          # 1 / ! ''
          # 1 / ! 0
          # 1 / 1
          # 1
        ]
      }

      ..

      # $#{$_[1]}
      $#{
        $_[
          $? ? !!$? : !$?

          # $CHILD_ERROR === $?
          # $? ? !!$? : !$?

          #  0 ? !! 0 : ! 0
          #  0 ?    0 :   1
          # 1

          #  1 ? !! 1 : ! 1
          #  1 ?    1 :   0
          # 1
        ]
      }

      ,

      # ( 0 )
      (
        $) ? !$) : !!$)

        # $EFFECTIVE_GROUP_ID === $)

        # $) ? !$) : !!$)

        #  0 ? ! 0 : !! 0
        #  0 ?   1 :    0
        # 0

        #  1 ? ! 1 : !! 1
        #  1 ?   0 :    1
        # 0
      )

      ..

      # $_[0]
      $_[
        $- - $- # 0

        # $LAST_PAREN_MATCH = $-

        # 1 - 1 == 0
        # 5 - 5 == 0
      ]

      %

      # @{$_[1]}
      @{
        $_[
          $] / $]
          # $] === The version + patchlevel / 1000 of the Perl interpreter.

          # 1 / 1 == 1
          # 5 / 5 == 1
        ]
      }

      -

      # ( 1 )
      (
        !!$+ + !$+

        # !! 1 + ! 1
        # !  0 + 0
        #    1 + 0
        # 1
      )
    ]

    :

    # @{$_[1]}
    @{
      $_[
        !!$^^ ^ !$^^

        # !! 1 ^ ! 1
        # !  0 ^   0
        #    1 ^   0
        # 1

        # !! 0 ^ ! 0
        # !  1 ^ 1
        #    0 ^ 1
        # 1
      ]
    }
  ]
}

現在、いくつかの難読化を削除することができます。

sub foo{
  [
    (
      $#{$_[1]} * @{$_[1]}
    )

    ?

    @{$_[1]}[
      ( $_[0] % @{$_[1]} ) .. $#{$_[1]}

      ,

      0 .. ( $_[0] % @{$_[1]} - 1 )
    ]

    :

    @{$_[1]}
  ]
}

今、私たちは何が起こっているのいくつかのアイデアを持って、変数の名前をすることができます。

sub foo{
  my( $item_0, $arr_1 ) = @_;
  my $len_1  = @$arr_1;

  [
      # This essentially just checks that the length of $arr_1 is greater than 1
      ( ( $len_1 -1 ) * $len_1 )
      # ( ( $len_1 -1 ) * $len_1 )
      # ( (      5 -1 ) *      5 )
      #             4   *      5
      # 20
      # 20 ? 1 : 0 == 1

      # ( ( $len_1 -1 ) * $len_1 )
      # ( (      2 -1 ) *      2 )
      #             1   *      2
      # 2
      # 2 ? 1 : 0 == 1

      # ( ( $len_1 -1 ) * $len_1 )
      # ( (      1 -1 ) *      1 )
      #             0   *      1
      # 0
      # 0 ? 1 : 0 == 0

      # ( ( $len_1 -1 ) * $len_1 )
      # ( (      0 -1 ) *      0 )
      #            -1   *      0
      # 0
      # 0 ? 1 : 0 == 0

    ?

      @{$arr_1}[
        ( $item_0 % $len_1 ) .. ( $len_1 -1 ),
        0 .. ( $item_0 % $len_1 - 1 )
      ]

    :

      # If we get here, @$arr_1 is either empty or has only one element
      @$arr_1
  ]
}

きれいのリファクタリング、コードをそれが少し読みやすくするため。

sub foo{
  my( $item_0, $arr_1 ) = @_;
  my $len_1  = @$arr_1;

  if( $len_1 > 1 ){
    return [
      @{$arr_1}[
        ( $item_0 % $len_1 ) .. ( $len_1 -1 ),
        0 .. ( $item_0 % $len_1 - 1 )
      ]
    ];
  }elsif( $len_1 ){
    return [ @$arr_1 ];
  }else{
    return [];
  }
}

2)

それは私を混乱させる。


3)

これはなぜPerlは"唯一の"言語を記述されてのいわれのない非難を取得されます。 (にもかかわらず、それが可能な任意の言語で難読化機能を記述することです。)


4)

私はポイントを疑う"楽しいだけ"です。それはstackoverflowの精神がでていることを確認しない場合は、それを何ですか?私は本物のプログラミングの問題に答えを探しているなら、私はobfuパズル..読まなければならないしたくない


5)

コンパイルエラー?? :)


6)

なぜ人々は以下の応答しないと"質問"downvoteのだろうか? ;)


7)

これは、2つの配列リファレンスを返す2番目の配列の内容を並べ替えて新しい配列リファレンス、そのような2番目の部分は、最初の部分は、ポイントの前の最初の配列のメモリの場所に基づいて分割いますかかります。 2番目の配列が空であるか、1つの項目が含まれて、ちょうど2番目の配列のコピーを返します。等価次のように:

sub foo {
    my ($list1, $list2) = @_;
    my @output;
    if (@$list2 > 0) {
        my $split = $list1 % @$list2;
        @output = @$list2[$split .. $#$list2, 0 .. ($split - 1)];
    } else {
        @output = @$list2;
    }
    return \@output;
}

$list1 % @$list2本質的にランダムな場所に基づいて配列を分割するピックアップ$listその$のメモリアドレスのリストを数値コンテキストで評価を評価します。

元のほとんどが難読化トートロジー句読点変数を含む多くのを使用します。例えば、

  • !$| | $|常に1です
  • @- - @+常に0です

更新は、注意することperltidy非常にここに解読有用だったが、それは窒息!!$^^^!$^^ 、それは再フォーマットする!!$^ ^ ^ !$^ ^ 、これは無効なPerlのは、それはする必要があります!!$^^ ^ !$^^ 。これはRWendiのコンパイルエラーの原因となる可能性があります。


8)

私は他のが見つかりましたこれが私のコマンドは役に立ちましたに取り組んで、ときに答え

perl -MO=Concise,foo,-terse,-compact obpuz.pl > obpuz.out

Bの::簡潔な




9)

それは残酷な私の大脳皮質にけがをした。


10)

それは本当に難読ですか?これはかなり標準的なPerlのように私には見える。