Hatena::ブログ(Diary)

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

2010-03-24

[] JavaScriptで + - * = なしで記号だけでプログラムを書く  JavaScriptで + - * = なしで記号だけでプログラムを書くを含むブックマーク

+ - * = 除いた記号だけでalert(1)相当をしてみなさい。 ただしブラウザは選んでよい。 (30分) - Twitter / hoshikuzu

id:hoshikuzu さんが言ってたので書いてみた。こんな感じ↓。コードはすぐ書けたけど、この記事書くのに30分以上かかってる気がする。

javascript:(~~[])[<_>{/...$/({})[~~[]][~~[]]}{/../({})[~~[]][1]}{/...$/({}[{}])[
~~[]][~~[]]}{/..$/(!{})[~~[]][~~[]]}{/./(!![])[~~[]][~~[]]}{/...$/(!![])[~~[]][
~~[]]}{/..$/(!![])[~~[]][~~[]]}{/...$/({})[~~[]][~~[]]}{/./(!![])[~~[]][~~[]]}{
/../({})[~~[]][~~!![]]}{/...$/(!![])[~~[]][~~[]]}</_>][<_>{/...$/({})[~~[]][~~[]
]}{/../({})[~~[]][1]}{/...$/({}[{}])[~~[]][~~[]]}{/..$/(!{})[~~[]][~~[]]}{/./(!![]
)[~~[]][~~[]]}{/...$/(!![])[~~[]][~~[]]}{/..$/(!![])[~~[]][~~[]]}{/...$/({})[~~[]
][~~[]]}{/./(!![])[~~[]][~~[]]}{/../({})[~~[]][~~!![]]}{/...$/(!![])[~~[]][~~[]]
}</_>](<_>{/....$/(![])[~~[]][~~[]]}{/...$/(![])[~~[]][~~[]]}{/.$/(![])[~~[]][~~[]
]}{/...$/(!![])[~~[]][~~[]]}{/./(!![])[~~[]][~~[]]}({~~!![]})</_>)()

Firefox 限定。

いちおう解説。

正規表現を使って true / false / object をそれぞれ toString して配列形式で必要な文字を切り出す。

/../( "abcd" )         /* same as /../.exec( "abcd" ) */
/../( "abcd" )[0]      /* "ab" */
/../( "abcd" )[0][1]   /* "b"  */
/./( true )[0][0]      /* "t"  */
/../( true )[0][1]     /* "r"  */
/.*/( {} )[0]          /* "[object Object]"  */
/...$/({})[0]          /* "ct]" */
/...$/({})[0][0]       /* "c" */

こんな感じで、"constructor"、"alert" のそれぞれの文字("c","o","n",...など)を切り出す。正規表現のパターンをうまく指定することで配列の添え字は常に 0、1 とできる。これらの数値はそれぞれ ~~[]、~~!![] として簡単に作れる(もちろん、正規表現で /.(.)./ のようにキャプチャして適当に切りだしてもいいけど今回はしてない)。

E4Xを使って各文字をconcatenateする。

+ が使えないので E4X を使って文字を連結する。

<_>{"c"}{"o"}{"n"}{"s"}{"t"}{"r"}{"u"}{"c"}{"t"}{"o"}{"r"}</_> // "constructor"
<_>{"a"}{"l"}{"e"}{"r"}{"t"}</_> // "alert"

(0).constructor.constructor == function Function() を使って文字列を関数として実行。

(0)[ "constructor" ][ "constructor" ]( "alert(1)" )(); /* Function( "alert(1)" )() */

実行方法自体は jjencode と同じ。

まとめ


    ,ィィr--  ..__、j
   ル! {       `ヽ,       ∧
  N { l `    ,、   i _|\/ ∨ ∨
  ゝヽ   _,,ィjjハ、   | \
  `ニr‐tミ-rr‐tュ<≧rヘ   > 
     {___,リ ヽ二´ノ  }ソ ∠ JavaScript記号プログラムに + - * = は必要なかったんだよ!!
    '、 `,-_-ュ  u /|   ∠
      ヽ`┴ ' //l\  |/\∧  /
--─‐ァ'| `ニ--‐'´ /  |`ー ..__   `´
    く__レ1;';';';>、  / __ |  ,=、 ___
   「 ∧ 7;';';'| ヽ/ _,|‐、|」 |L..! {L..l ))
   |  |::.V;';';';'| /.:.|トl`´.! l _,,,l | _,,|  , -,
    ! |:.:.:l;;';';';'|/.:.:.:||=|=; | |   | | .l / 〃 ))
    l |:.:.:.:l;';';'/.:.:.:.:| ! ヽ \!‐=:l/ `:lj  7
    | |:.:.:.:.l;'/.:.:.:.:.:.! ヽ:::\::  ::::|  ::l /