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
)
`
รุ่นที่อ่านได้มากขึ้นซึ่งเกิดขึ้นเป็นควิน (ลบ newlines ภายนอก):
[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 รับตัวอักษรสองสามตัวจากตัวอักษรที่สามารถสร้างด้วยโทเค็นไบต์เดียว:
JSF*** Used here Value Chars unlocked
!![] !0 true true
![] !1 false fals
[][[]] t.a undefined ndi
จากสิ่งเหล่านี้เราสามารถขยายออกไปด้านนอกเริ่มต้นด้วย[].find
ซึ่งเป็นฟังก์ชั่นวัตถุ แปลงนี้เพื่อสตริงfunction find() { ...
จะช่วยให้เราเข้าถึงc
, o
พื้นที่ ( _
) และวงเล็บ ( y
และz
) บางทีอาจจะมากกว่าที่สำคัญตอนนี้เรามีการเข้าถึงของconstructor
ผู้Function
ฟังก์ชั่นซึ่งเป็น inceptional มันอาจจะทำให้เรามีความสามารถในการรันโค้ดโดยการสร้างสตริงผ่านไปFunction()
แล้วเรียกฟังก์ชั่นที่สร้างขึ้น
ฉันควรจะพูดถึงวิธีการโดยรวมที่ใช้โดยโปรแกรมเอง ในฐานะของปี 2015 JavaScript มีคุณสมบัติเย็นนี้มันเรียกว่า " แท็กแม่ " ซึ่งไม่เพียง แต่ช่วยให้การขึ้นบรรทัดใหม่ไม่ใช้ Escape ในสาย แต่ยังช่วยให้เราเรียกใช้ฟังก์ชันกับสตริงตัวอักษรโดยตรง (ในทาง; myFunc`abc`;
เทียบเท่าประมาณไปmyFunc(["abc"])
) ถ้าเราใส่ function call เป็นสิ่งสุดท้ายในโปรแกรมโครงสร้างทั่วไปจะมีลักษณะดังนี้:
code;func`code;func`
สิ่งที่func
ต้องทำคือเอาท์พุทอาร์กิวเมนต์ของมันตามด้วย backtick จากนั้นอาร์กิวเมนต์ของมันอีกครั้งและแบ็คทิกที่สอง สมมติว่าเรามีข้อโต้แย้งในa
และ backtick ที่เก็บไว้ในเราสามารถบรรลุนี้มีรหัสf
alert(a+f+a+f)
อย่างไรก็ตามในขณะนี้เราหายไป+
และ backtick ตัวเอง +
(เก็บไว้ในP
) ไม่ยาก เราขโมยเคล็ดลับอื่นจาก JSF อาคารสตริงแปลงเป็นตัวเลขแล้วกลับไปสตริงให้1e23
"1e+23"
การรับ backtick นั้นซับซ้อนกว่าเล็กน้อย ตอนแรกฉันพยายามได้String.fromCharCode
มา แต่การค้นหาC
กลายเป็นเรื่องยาก โชคดีที่atob
มันง่ายพอที่จะได้รับ ( Function("return atob")()
; b
สร้างขึ้นจาก0+{}
ซึ่งให้[object Object]
) และสามารถให้ถ่าน ASCII ใด ๆ หากพบว่ามีสายเวทที่เหมาะสม สคริปต์สั้นให้ฉัน12A
เป็นหนึ่งในตัวเลือกที่สามารถอำนวยความสะดวกที่จะพบใน12Array
(บิตสั้นเพื่อสร้างขอบคุณ[].constructor[n+a+m+e]
; m
พบใน0 .constructor+0
: "function Number() { ..."
)
ในที่สุดเราก็รวมทุกอย่างเข้าด้วยกัน เรากำหนด backtick ให้กับตัวแปรf
แต่เนื่องจากเราไม่สามารถใช้โดยตรงในสตริงฟังก์ชั่นเราจึงตั้งค่าตัวแปร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 ที่มีอักขระไม่เกินหนึ่งตัวต่อบรรทัด!
หัวของฉันรู้สึกแย่ในขณะนี้ดังนั้นโปรดสอบถามเกี่ยวกับข้อผิดพลาดใด ๆ ที่ฉันทำหรือสิ่งที่ฉันพลาดในคำอธิบายนี้และฉันจะกลับไปหาคุณหลังจากที่ฉันได้พักผ่อน ...