jspuzzle (Web 100pts)
次のように空欄に番号を付ける。
({<1> :function(){ this[<2> ] = (new Function( <3> + <4> + <5> ))(); var pattern = <6>; var r = new RegExp( pattern ); this[ r[ <7> ]( pattern ) ][ <8> ]( 1 ); }})[ <9>[ <10> ]() ]();
次のような順序で考えた。
<1>と<9>[<10>]()は等しくないと中の関数は呼び出されない。このような組み合わせは<1>:"function", <9>:"Function", <10>:"toLowerCase" しかないので、この3つは確定する。
r[<7>](pattern)]も<2>と等しいと嬉しい。regexpに対する関数呼び出しなので<7>はおそらくexec。この時、<6>が通常の文字列だとr.exec(pattern)が配列になってしまう。そのため、<6>は自分自身にマッチしない‘"^[\w]$"‘となる。
この時、r[”exec"](pattern)]はnullになるため、<2>は"null"で確定する。
<3> <4> <5>について、何かを返却するので、<3>は"return"で確定。その後に空白が必要なので、<4>も"/*^_^*/"になる。
<8>でalertが呼び出されるようにするために、<5>を"this"にして、<8>を"alert"にする。これによって最終的に、this.alert(1)となる。