Hatena::ブログ(Diary)

葉っぱ日記 このページをアンテナに追加

2009-07-21

[] TAKESAKOさんのやつ  TAKESAKOさんのやつを含むブックマーク

TAKESAKO @ Yet another Cybozu Labs: 記号でPolyglotプログラミング♪(RejectKaigi2009) のコードのJavaScriptの解読。

もとのコード

"#{",$/*"}";%#=();$^_^='?``;">)~${`&&@`{;:+`[[',$^_^='/?")-=^{(=!".=.!,!)&&>',$^_^
='`-+|{!?``*.((-+({:^(_^',$^_=''^'+@$@&'^'^.@%@'.'$^_^"";'.$^_^"",'!~'!~('('.('`_@
^!@'^'_$%(@,'.'$^_})'))#;_=[*'`'..%.~.]*%%%;$_=%+%++(??%?===???_[(_=~/\{/).-@+(_=~
/~/)]:%%%<<(?!*(?+-?()));_=([*%/!/..%!/!]+[*%]:]..%)@)]+[*%.[...%.`.]+[*%.{...%.}.
])*%(=~_~='_');$><<$_%(/\)=~_~='_'\*=/=~_)+$_%(/~_~='_'\-/=~_)+$_%(/\-=~_~='_'\./=
~_)+$_%(/\-=~_~='_'\./=~_)+$_%(/_~='_'\./=~_)+$_%(/'&/=~_)+$_%(/='_'%/=~_)+$_%(/=~
_~='_'\+/=~_)+$_%(/\.=~_~='_'\//=~_)+$_%(/',/=~_)+$_%(/~='_'\//=~_)+$_%(/~='_''/=~
_)+$_%(/=~_~='_''/=~_)+$_%(??%?)==???(/_~='_'\(/=~_):/~_~='_'\(/=~_)+$_%(/'_'%/=~_
)+$_%(/=~_~='_'#/=~_)+%))#*/=~[];$={___:++$,$$$$:(![]+"")[$],__$:++$,$_$_:(![]+"")
[$],_$_:++$,$_$$:({}+"")[$],$$_$:($[$]+"")[$],_$$:++$,$$$_:(!""+"")[$],$__:++$,$_$
:++$,$$__:({}+"")[$],$$_:++$,$$$:++$,$___:++$,$__$:++$};$.$_=($.$_=$+"")[$.$_$]+($
._$=$.$_[$.__$])+($.$$=($.$+"")[$.__$])+((!$)+"")[$._$$]+($.__=$.$_[$.$$_])+($.$=(
!""+"")[$.__$])+($._=(!""+"")[$._$_])+$.$_[$.$_$]+$.__+$._$+$.$;$.$$=$.$+(!""+"")[
$._$$]+$.__+$._+$.$+$.$$;$.$=($.___)[$.$_][$.$_];$.$($.$($.$$+"\""+"\\"+$.__$+$.$$
_+$.$__+"\\"+$.__$+$.$$$+$.__$+"\\"+$.__$+$.$$_+$.___+"\\"+$.__$+$.$__+$.$_$+"\\"+
$.__$+$.$_$+$.$$$+"\\"+$.__$+$.$__+$.$$_+"("+"\\"+$.__$+$.$$_+$.$$$+"\\"+$.__$+$.$
_$+$.__$+"\\"+$.__$+$.$_$+$.$$_+"\\"+$.__$+$.$__+$.$__+"\\"+$.__$+$.$_$+$.$$$+"\\"
+$.__$+$.$$_+$.$$$+")==\\\""+"\\"+$.__$+$.$_$+$.$$$+"\\"+$.__$+$.$__+$._$_+"\\"+$.
__$+$.$_$+$._$_+"\\"+$.__$+$.$__+$.$_$+"\\"+$.__$+$.$__+$._$$+"\\"+$.__$+$.$$_+$.$
__+"\\\"?"+"\\"+$.__$+$.$__+$.__$+"\\"+$.__$+$.$_$+$.$__+"\\"+$.__$+$.$__+$.$_$+"\
\"+$.__$+$.$$_+$._$_+"\\"+$.__$+$.$$_+$.$__+"(\\\""+"\\"+$.__$+$.__$+$.___+"\\"+$.
__$+$.$__+$.$_$+"\\"+$.__$+$.$_$+$.$__+"\\"+$.__$+$.$_$+$.$__+"\\"+$.__$+$.$_$+$.$
$$+","+"\\"+$.$__+$.___+"\\\"+("+"\\"+$.__$+$.$$_+$.$__+"\\"+$.__$+$.$$$+$.__$+"\\
"+$.__$+$.$$_+$.___+"\\"+$.__$+$.$__+$.$_$+"\\"+$.__$+$.$_$+$.$$$+"\\"+$.__$+$.$__
+$.$$_+"("+"\\"+$.__$+$.$__+$._$$+"\\"+$.__$+$.$_$+$.___+"\\"+$.__$+$.$$_+$._$_+"\
\"+$.__$+$.$_$+$.$$$+"\\"+$.__$+$.$_$+$.$_$+"\\"+$.__$+$.$_$+$.__$+"\\"+$.__$+$.$$
_+$.$_$+"\\"+$.__$+$.$_$+$.$_$+")==\\\""+"\\"+$.__$+$.$_$+$.$$$+"\\"+$.__$+$.$__+$
._$_+"\\"+$.__$+$.$_$+$._$_+"\\"+$.__$+$.$__+$.$_$+"\\"+$.__$+$.$__+$._$$+"\\"+$._
_$+$.$$_+$.$__+"\\\"?\\\""+"\\"+$.__$+$.$$_+$.$$_+"\\"+$.$$$+$.___+"\\\":\\\""+"\\
"+$.__$+$.___+$.$$_+"\\"+$.__$+$.$_$+$.__$+"\\"+$.__$+$.$$_+$._$_+"\\"+$.__$+$.$__
+$.$_$+"\\"+$.__$+$.$__+$.$$_+"\\"+$.__$+$.$_$+$.$$$+"\\"+$.__$+$.$$$+$.___+"\\\")
+\\\"!\\\"):"+"\\"+$.__$+$.$$_+$.___+"\\"+$.__$+$.$$_+$._$_+"\\"+$.__$+$.$_$+$.__$
+"\\"+$.__$+$.$_$+$.$$_+"\\"+$.__$+$.$$_+$.$__+"(\\\""+"\\"+$.__$+$.__$+$.___+"\\"
+$.__$+$.$__+$.$_$+"\\"+$.__$+$.$_$+$.$__+"\\"+$.__$+$.$_$+$.$__+"\\"+$.__$+$.$_$+
$.$$$+","+"\\"+$.$__+$.___+"\\"+$.__$+$.__$+$._$_+"\\"+$.__$+$.$__+$.__$+"\\"+$.__
$+$.$$_+$.$$_+"\\"+$.__$+$.$__+$.__$+"\\"+$.__$+$._$_+$._$$+"\\"+$.__$+$.$__+$._$$
+"\\"+$.__$+$.$$_+$._$_+"\\"+$.__$+$.$_$+$.__$+"\\"+$.__$+$.$$_+$.___+"\\"+$.__$+$
.$$_+$.$__+"!\\\")"+"\"")())();

↓ よみやすく改行とかスペースを調整。

"#{",
$
  /*"}";%#=();$^_^='?``;">)~${`&&@`{;:+`[[',$^_^='/?")-=^{(=!".=.!,!)&&>',$^_^='`-
    +|{!?``*.((-+({:^(_^',$^_=''^'+@$@&'^'^.@%@'.'$^_^"";'.$^_^"",'!~'!~('('.('`_@
    ^!@'^'_$%(@,'.'$^_})'))#;_=[*'`'..%.~.]*%%%;$_=%+%++(??%?===???_[(_=~/\{/).-@+
    (_=~/~/)]:%%%<<(?!*(?+-?()));_=([*%/!/..%!/!]+[*%]:]..%)@)]+[*%.[...%.`.]+[*%.
    {...%.}.])*%(=~_~='_');$><<$_%(/\)=~_~='_'\*=/=~_)+$_%(/~_~='_'\-/=~_)+$_%(/\-
    =~_~='_'\./=~_)+$_%(/\-=~_~='_'\./=~_)+$_%(/_~='_'\./=~_)+$_%(/'&/=~_)+$_%(/='
    _'%/=~_)+$_%(/=~_~='_'\+/=~_)+$_%(/\.=~_~='_'\//=~_)+$_%(/',/=~_)+$_%(/~='_'\/
    /=~_)+$_%(/~='_''/=~_)+$_%(/=~_~='_''/=~_)+$_%(??%?)==???(/_~='_'\(/=~_):/~_~=
    '_'\(/=~_)+$_%(/'_'%/=~_)+$_%(/=~_~='_'#/=~_)+%))#*/
= ~[];
$ = {
    ___  : ++$,
    $$$$ : (![]+"")[$],
    __$  : ++$,
    $_$_ : (![]+"")[$],
    _$_  : ++$,
    $_$$ : ({}+"")[$],
    $$_$ : ($[$]+"")[$],
    _$$  : ++$,
    $$$_ : (!""+"")[$],
    $__  : ++$,
    $_$  : ++$,
    $$__ : ({}+"")[$],
    $$_  : ++$,
    $$$  : ++$,
    $___ : ++$,
    $__$ : ++$
};
$.$_ = 
    ($.$_=$+"")[$.$_$] + 
    ($._$=$.$_[$.__$]) +
    ($.$$=($.$+"")[$.__$]) + 
    ((!$)+"")[$._$$] +
    ($.__=$.$_[$.$$_]) +
    ($.$=(!""+"")[$.__$]) +
    ($._=(!""+"")[$._$_]) +
    $.$_[$.$_$] +
    $.__ +
    $._$ +
    $.$;
$.$$ = 
    $.$ + 
    (!""+"")[$._$$] +
    $.__ +
    $._ +
    $.$ +
    $.$$;

$.$ = ($.___)[ $.$_ ] [ $.$_ ];

$.$( 
    $.$(
        $.$$ +
        "\"" + 
        "\\" + $.__$ + $.$$_ + $.$__ + "\\" + $.__$ + $.$$$ + $.__$ +
        "\\" + $.__$ + $.$$_ + $.___ + "\\" + $.__$ + $.$__ + $.$_$ +
        "\\" + $.__$ + $.$_$ + $.$$$ + "\\" + $.__$ + $.$__ + $.$$_ +
        "(" +
        "\\" + $.__$ + $.$$_ + $.$$$ + "\\" + $.__$ + $.$_$ + $.__$ +
        "\\" + $.__$ + $.$_$ + $.$$_ + "\\" + $.__$ + $.$__ + $.$__ + 
        "\\" + $.__$ + $.$_$ + $.$$$ + "\\" + $.__$ + $.$$_ + $.$$$ +
		/* 略 */
        "\"" )())();

↓適当にコメントを挿入

$ = ~[];	// $ = -1;
$ = {
    ___  : ++$,             // 0; $ = 0
    $$$$ : (![]+"")[$],     // f; "false"[ 0 ]
    __$  : ++$,             // 1; $ = 1
    $_$_ : (![]+"")[$],     // a; "false"[ 1  ]
    _$_  : ++$,             // 2; $ = 2
    $_$$ : ({}+"")[$],      // b; "[object Object]"[ 2 ]
    $$_$ : ($[$]+"")[$],    // d; "undefined"[ 2 ]
    _$$  : ++$,             // 3; $ = 3
    $$$_ : (!""+"")[$],     // e; "true"[ 3 ]
    $__  : ++$,             // 4; $ = 4
    $_$  : ++$,             // 5; $ = 5
    $$__ : ({}+"")[$],      // c; "[object Object]"[ 5 ]
    $$_  : ++$,             // 6; $ = 6
    $$$  : ++$,             // 7; $ = 7
    $___ : ++$,             // 8; $ = 8
    $__$ : ++$              // 9; $ = 9
};

$.$_ = 
    ($.$_=$+"")[$.$_$] +        // 'c'; "[object Object]"[ 5 ]
    ($._$=$.$_[$.__$]) +        // 'o'; "[object Object]"[ 1 ]
    ($.$$=($.$+"")[$.__$]) +    // 'n'; "undefined"[ 1 ]
    ((!$)+"")[$._$$] +          // 's'; "false"[ 3 ]
    ($.__=$.$_[$.$$_]) +        // 't'; "[object Object]"[ 6 ]
    ($.$=(!""+"")[$.__$]) +     // 'r'; "true"[ 1 ]
    ($._=(!""+"")[$._$_]) +     // 'u'; "true"[ 2 ]
    $.$_[$.$_$] +               // 'c'; "[object Object]"[ 5 ]
    $.__ +                      // 't';
    $._$ +                      // 'o';
    $.$;                        // 'r';

$.$$ = 
    $.$ +                       // 'r'
    (!""+"")[$._$$] +           // 'e'; "true"[ 3 ]
    $.__ +                      // 't'
    $._ +                       // 'u'
    $.$ +                       // 'r'
    $.$$;                       // 'n'

$.$ = ($.___)[ $.$_ ][ $.$_ ];  // $.$ = (0)[ "constructor" ][ "constructor" ]

$.$( 
    $.$(
        $.$$ +                                                          // return
        "\"" +                                                          // "
        "\\" + $.__$ + $.$$_ + $.$__ + "\\" + $.__$ + $.$$$ + $.__$ +   // \164\171
        "\\" + $.__$ + $.$$_ + $.___ + "\\" + $.__$ + $.$__ + $.$_$ +   // \160\145
        "\\" + $.__$ + $.$_$ + $.$$$ + "\\" + $.__$ + $.$__ + $.$$_ +   // \157\146
        "(" +                                                           // (
        "\\" + $.__$ + $.$$_ + $.$$$ + "\\" + $.__$ + $.$_$ + $.__$ +   // \167\151
        "\\" + $.__$ + $.$_$ + $.$$_ + "\\" + $.__$ + $.$__ + $.$__ +   // \156\144
        "\\" + $.__$ + $.$_$ + $.$$$ + "\\" + $.__$ + $.$$_ + $.$$$ +   // \157\167
		/* 略 */
        "\"" )())();

↓実際に実行されるコード

(0).constructor.constructor(
  'typeof(window)=="object"?alert("Hello, "+(typeof(chromium)=="object"?"v8":"Firefox")+"!"):print("Hello, JavaScript!")'
)()

ね、簡単でしょう?

トラックバック - http://d.hatena.ne.jp/hasegawayosuke/20090721/p1