자바 스크립트, 라인 길이 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
)
`
더 읽기 쉬운 버전으로 quine이됩니다 (매우 줄 바꿈 제거).
[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)`
설명
아휴. 위험한 여행이 될 것이기 때문에 여기에 타십시오.
나는 길이 1 노 (직접, 어쨌든) 내장 기능, 키워드 이러한 문제를 해결하거나 화살표를하는 방법을 알아 내려고 오랜 시간을 보낸이와 쉽게 가능하다는 것을 실현 기능을-전에 JSF *** , 한 캔 멀티 바이트 토큰을 피하면서 JavaScript 코드를 평가하십시오. 그러나 JSF 솔루션은 수십 또는 수십만이 아니라도 수천 바이트 길이가 될 수 있습니다. 고맙게도, 우리는 단지 그에 국한되지 않습니다. ()[]+!
우리는 모든 ASCII를 사용할 수 있습니다!
먼저 JSF의 필수 구성 요소 인 "더 많은 기능을 잠금 해제"하기 위해 문자열로 만들 수있는 문자를 골라 시작하기로 결정했습니다. 문자열을 사용하여 길이가 3 인 줄이 필요한 문자를 직접 사용할 수 없으므로 대신 JSF에서 트릭을 훔쳐서 1 바이트 토큰으로 작성할 수있는 리터럴에서 몇 개의 문자를 가져옵니다.
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
편리하게 찾을 수있는 옵션 중 하나로서 12Array
(A가 생성하는 짧은 비트, 덕분에 [].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()
피드를 제공하고 완성 된 코드를 결과에 피드하면 voila, 한 줄에 하나 이상의 문자가 포함 된 JavaScript quine이 있습니다!
지금은 머리가 끔찍한 느낌이 들기 때문에이 설명에서 실수 나 내가 놓친 것들에 대해 문의하십시오. 휴식을 취한 후 다시 연락 드리겠습니다.