JavaScript、行長1、960 956 928バイト
[
t
,
r
,
u
,
e
,
f
,
a
,
l
,
s
]
=
!
0
+
[
!
1
]
;
[
,
n
,
d
,
,
q
,
i
]
=
t
.
a
+
t
V
=
[
]
[
f
+
i
+
n
+
d
]
;
[
,
,
,
c
,
,
,
o
,
,
_
,
,
,
,
,
y
,
z
]
=
V
+
0
F
=
V
[
E
=
c
+
o
+
n
+
s
+
t
+
r
+
u
+
c
+
t
+
o
+
r
]
P
=
(
1
+
e
+
2
+
3
-
4
+
t
)
[
2
]
f
=
F
(
r
+
e
+
t
+
u
+
r
+
n
+
_
+
a
+
t
+
o
+
(
0
+
{
}
)
[
3
]
)
(
)
(
3
*
4
+
[
]
[
E
]
[
n
+
a
+
(
0
[
E
]
+
0
)
[
9
+
2
]
+
e
]
)
[
1
]
F
(
a
,
a
+
l
+
e
+
r
+
t
+
y
+
a
+
P
+
q
+
P
+
a
+
P
+
q
+
z
)
`
[
t
,
r
,
u
,
e
,
f
,
a
,
l
,
s
]
=
!
0
+
[
!
1
]
;
[
,
n
,
d
,
,
q
,
i
]
=
t
.
a
+
t
V
=
[
]
[
f
+
i
+
n
+
d
]
;
[
,
,
,
c
,
,
,
o
,
,
_
,
,
,
,
,
y
,
z
]
=
V
+
0
F
=
V
[
E
=
c
+
o
+
n
+
s
+
t
+
r
+
u
+
c
+
t
+
o
+
r
]
P
=
(
1
+
e
+
2
+
3
-
4
+
t
)
[
2
]
f
=
F
(
r
+
e
+
t
+
u
+
r
+
n
+
_
+
a
+
t
+
o
+
(
0
+
{
}
)
[
3
]
)
(
)
(
3
*
4
+
[
]
[
E
]
[
n
+
a
+
(
0
[
E
]
+
0
)
[
9
+
2
]
+
e
]
)
[
1
]
F
(
a
,
a
+
l
+
e
+
r
+
t
+
y
+
a
+
P
+
q
+
P
+
a
+
P
+
q
+
z
)
`
偶然にも偶然であるより読みやすいバージョン(余分な改行は削除されました):
[t,r,u,e,f,a,l,s]=!0+[!1];[,n,d,,q,i]=t.a+t
V=[][f+i+n+d];[,,,c,,,o,,_,,,,,y,z]=V+0
F=V[E=c+o+n+s+t+r+u+c+t+o+r]
P=(1+e+2+3-4+t)[2]
f=F(r+e+t+u+r+n+_+a+t+o+(0+{})[3])()(3*4+[][E][n+a+(0[E]+0)[9+2]+e])[1]
F(a,a+l+e+r+t+y+a+P+q+P+a+P+q+z)`
[t,r,u,e,f,a,l,s]=!0+[!1];[,n,d,,q,i]=t.a+t
V=[][f+i+n+d];[,,,c,,,o,,_,,,,,y,z]=V+0
F=V[E=c+o+n+s+t+r+u+c+t+o+r]
P=(1+e+2+3-4+t)[2]
f=F(r+e+t+u+r+n+_+a+t+o+(0+{})[3])()(3*4+[][E][n+a+(0[E]+0)[9+2]+e])[1]
F(a,a+l+e+r+t+y+a+P+q+P+a+P+q+z)`
説明
ふう これは危険な旅になるので、ここに乗って落ち着きます...
JSF ***で簡単に実現できることに気付く前に、長さ1(組み込み(直接、とにかく)、キーワード、さらには矢印関数なし)でこの課題を解決する方法を見つけるのに長い時間を費やしました。マルチバイトトークンを回避しながら、JavaScriptコードを評価します。ただし、JSFソリューションの長さは、数万または数十万ではないにしても、数千バイトになります。ありがたいことに、私たちは単なる()[]+!
ASCIIに限らず、すべてのASCIIを自由に使用できます!
私は、JSFの基本的な構成要素である「より多くの機能をアンロックする」ために文字列に組み込むことができるキャラクターをゴルフすることから始めることにしました。文字列を直接使用して文字を取得することはできません。長さ3の行が必要になるため、代わりにJSFからトリックを盗み、シングルバイトトークンで構築できるリテラルからいくつかの文字を取得します。
JSF*** Used here Value Chars unlocked
!![] !0 true true
![] !1 false fals
[][[]] t.a undefined ndi
これらから[].find
、Functionオブジェクトであるで始まる外側に拡張できます。文字列にこれを変換するとfunction find() { ...
私たちへのアクセスを提供しc
、o
スペース(_
)、および括弧(y
とz
)。おそらくもっと重要なのはconstructor
、Function
関数にアクセスできるようになったということです。これは、聞こえるかもしれませんが、文字列を作成し、それをFunction()
に渡し、生成された関数を呼び出すことでコードを実行できます。
おそらく、プログラム自体で使用される全体的な方法について言及する必要があります。2015年の時点で、JavaScriptには「タグ付きテンプレート」と呼ばれるこの非常に便利な機能があり、文字列にエスケープなしの改行を許可するだけでなく、文字列リテラルを使用して関数を直接呼び出すことができます(ある意味でmyFunc`abc`;
は、おおよそ同等ですmyFunc(["abc"])
)。プログラムの最後に関数呼び出しを配置すると、一般的な構造は次のようになります。
code;func`code;func`
すべてはfunc
それから行う必要があり、出力は、その再びバッククォートに続く引数、引数、および第二バッククォートです。引数がa
格納されf
、バックティックが格納されていると仮定すると、コードでこれを実現できますalert(a+f+a+f)
。しかし、現時点では、私たちは不足して+
おり、バックティック自体がありません。+
(に保存P
)は難しくありません。JSFから別のトリックを盗み、文字列を構築1e23
し、数値に変換してから文字列に戻し、を与え"1e+23"
ます。
バックティックの取得はもう少し複雑です。最初はを取得しようとしましたString.fromCharCode
が、を見つけることはC
ほぼ困難でした。幸いなことに、適切な魔法の文字列が見つかった場合、atob
取得するのに十分簡単で(Function("return atob")()
; b
はから生成され0+{}
ます[object Object]
)、任意のASCII文字を与えることができます。短いスクリプトが12A
オプションの1つとして私に与えてくれました。これは便利な場所にあります12Array
([].constructor[n+a+m+e]
;のおかげで、生成が少し短くなりm
ました0 .constructor+0
:にあります"function Number() { ..."
)。
最後に、すべてを結び付けます。バックティックをvariableに割り当てますf
が、ファンクション文字列で直接使用することはできないため、代わりにvariable q
を文字に設定し、f
代わりに使用します。これにより、最終的な文字列a+l+e+r+t+y+a+P+q+P+a+P+q+z
、またはが作成され"alert(a+f+a+f)"
ます。次に、これをFunction()
に送り、完成したコードを結果に送ります。できれば、1行に1文字以下のJavaScriptクインがあります。
私の頭は今恐ろしいので、私が犯した間違いやこの説明で見逃していることについてお問い合わせください。休憩した後、あなたに戻ります...