JavaScript(67 66 62行、 227 269バイト)
(注:Firefox 36およびSafari 8でのみテストされ、マイナーなES6機能(Set
クラス)が含まれています)
Z
=
!""+
(0[[]]
+
(
!!""+Set
));c
=Z[~
-22]
$=Z[
3]
$$=Z[
15]
$$$=Z[
24]
$$$$=Z[
1]
$$$$$=Z[
0]
Set
[c
+
$$$+Z[
5]
+Z[
16]
+
$$$$$+
$$$$+Z[
2]
+c
+
$$$$$+
$$$+
$$$$]
(Z[
14]
+
$$+
$+
$$$$+
$$$$$+
"(\
'H\
"+
$+
$$+
$$+
$$$+
",\
W\
"+
$$$+
$$$$+
$$+Z[
6]
+
"\
!')\
")
()
上記のコードは基本的に次のことを行います。
alert("Hello, World!")
明らかにalert
ソートされていません。そのため、代わりに文を文字列として生成し、「評価」する必要があります。
s = "alert('Hello, World!')"; // generate this using sorted code
eval(s)
文字列を生成する方法は?ES5は行継続をサポートしているため、
"AL\
ERT" === "ALERT"
しかし、文字コード\
はすべての小文字の前に表示されるため、他の方法を使用して小文字を生成する必要があります。
ここでJSFuckのアイデアを借ります。アラートステートメントに含まれる小文字は次のとおりです。
t e r a o l d
これらはすべて、標準オブジェクトの文字から抽出できます。これは、ソートされたシーケンスの観点から表現できます。
t, e, r ← true = !""
a, l ← false = !!""
o ← function = Set
d ← undefined = 0[[]]
文字列をどのように評価しますか?eval(s)
ソートされていないため、使用できません。または、を使用することもできますがFunction(s)()
、Function
並べ替えられていないため使用できません。ただし、Function
は、すべての関数のコンストラクタですSet.constructor === Function
。つまり、です。
識別子constructor
を追加すると、小文字のリストが次のようになります。
t e r a o l d c u n s
幸いにもまだ生成できたものは"truefalseundefinedfunction"
次のとおりです。
t, e, r, u ← true = !""
a, l, s ← false = !!""
o, c, n ← function = Set
d ← undefined = 0[[]]
予言した後、上記のコードは次のようになります。
// lines 1~8 defines our string containing all lowercase letters we want
Z = true + (undefined + (false + Set))
// Z = "trueundefinedfalsefunction Set() { [native code] }"
// lines 8~20 defines the variables `c`, `$` (e), `$$` (l), `$$$` (o),
// `$$$$` (r), `$$$$$` (t)
// for the corresponding lowercase letters extracted from `Z`
// the rest calls:
Set["constructor"]("alert('Hello, World')")()
// lines 22~36 generates the "constructor" string
// lines 37~61 generates the "alert('Hello, World')" string
アップデート:改名E
、L
、O
、R
、T
の様々な繰り返しに$
4行を削減します。