JavaScript, satır uzunluğu 1, 960 956 928 bayt
[
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
)
`
Aynı zamanda bir kuyruk parçası olan daha okunabilir bir versiyon (yabancı yeni satırlar kaldırıldı):
[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)`
açıklama
Whew. Burada gezintiye çıkın, çünkü bu hain bir yolculuk olacak ...
Ben uzunluğu 1-hayır (doğrudan, her neyse) Ankastre, anahtar kelimeleri yazarak bu soruyu çözün ve hatta ok anlamaya çalışıyorum uzun zaman geçirdiği onunla kolayca mümkün olduğunu anlayarak işlevleri daha önce JSF *** , hangi kutu Çok baytlık simgelerden kaçınırken herhangi bir JavaScript kodunu değerlendirin. Ancak bir JSF çözümü, onlarca ya da yüzbinlerce olmasa da kolayca binlerce byte uzunluğunda olacaktı. Neyse ki, sadece sınırlı değiliz; ASCII'nin ()[]+!
tümü elimizde!
Konuşmak için daha fazla özelliğin kilidini açmak için dizgilere yerleştirilebilecek karakterler olan JSF'nin temel yapı taşlarına golf oynamaya başladım. Dizeleri karakterleri elde etmek için doğrudan kullanamayız, çünkü bu, 3 uzunluğundaki satırları gerektirir. Bunun yerine, JSF'den bir numara çaldık, tek baytlık simgelerle oluşturulabilecek hazır bilgi öğelerinden birkaç karakter edindik:
JSF*** Used here Value Chars unlocked
!![] !0 true true
![] !1 false fals
[][[]] t.a undefined ndi
Bunlardan [].find
, bir Function nesnesi olan başlayarak dışa doğru genişleyebiliriz . Bir dizeye bu dönüştürme function find() { ...
bize erişim sağlar c
, o
uzay ( _
) ve parantez ( y
ve z
). Belki daha da önemlisi, artık onun erişebilir constructor
, Function
fonksiyonun-bize, bir dize inşa etmeye geçirilerek kodu çalıştırmak olanağı verir gelebilir gibi inceptional, Function()
oluşturulan işlevi çağırarak sonra, vb.
Muhtemelen programın kendisi tarafından kullanılan genel yöntemden bahsetmeliyim. JavaScript, 2015'ten itibaren " etiketli şablonlar " olarak adlandırılan ve dizgelerde yalnızca yeni olmayan satırsonlarına izin vermekle kalmıyor, aynı zamanda doğrudan değişmez bir dizgeyi içeren bir işlevi çağırmamızı sağlıyor (bir şekilde myFunc`abc`;
kabaca eşittir myFunc(["abc"])
). İşlev çağrısını programdaki son şey olarak koyarsak, genel yapı şöyle görünecektir:
code;func`code;func`
Tüm func
yapması gereken, argümanını, ardından bir backtick'i, ardından tekrar argümanını ve ikinci bir backtick'i çıktılamaktır. Argüman içinde a
ve saklı bir backtick olduğunu varsayarsak f
, bunu kodla başarabiliriz alert(a+f+a+f)
. Ancak, şu anda +
eksikiz ve geri tepme kendisi. +
(saklanır P
) zor değildir; JSF'den başka bir numara çaldık, dizgeyi oluşturduktan 1e23
sonra sayıya dönüştükten sonra dizgiye geri döndük "1e+23"
.
Bir backtick almak biraz daha karmaşık. İlk başta, elde etmeye çalıştım String.fromCharCode
, ancak bulmanın C
neredeyse zor olduğu ortaya çıktı. Neyse ki, atob
elde etmek yeterince kolaydır ( Function("return atob")()
; b
elde edilen 0+{}
, veren [object Object]
) ve uygun bir sihirli dize bulunursa, herhangi bir ASCII char verebilir. Kısa bir senaryo bana verdi 12A
rahatlıkla bulunabilir seçeneklerden bir şekilde 12Array
(bir oluşturmak için daha kısa ısırdı sayesinde [].constructor[n+a+m+e]
; m
bulunur 0 .constructor+0
: "function Number() { ..."
).
Sonunda her şeyi birbirine bağlıyoruz. Backtick'i değişkene atarız f
, ancak onu doğrudan işlev dizesinde kullanamadığımız için, bunun yerine değişkeni q
harfe ayarlarız f
ve onu kullanırız. Bu bizim son dizgimizi yapar a+l+e+r+t+y+a+P+q+P+a+P+q+z
, ya da "alert(a+f+a+f)"
. Daha sonra bunu Function()
besliyoruz, bitmiş kodumuzu sonuca besliyoruz ve işte, satır başına birden fazla char olmayan bir JavaScript quine sahibiz!
Şu an kafam çok kötü geliyor, bu yüzden lütfen yaptığım hataları veya bu açıklamada kaçırdığım şeyleri araştırın ve biraz dinlendikten sonra size geri döneceğim ...