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)`
Пояснення
Вау. Поспіліть сюди, тому що це буде підступна подорож ...
Я довгий час намагався розібратися, як вирішити цю задачу довжиною 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 є ця дійсно класна функція під назвою " позначені шаблони ", яка не тільки дозволяє нерозмірковувати нові рядки в рядках, але й дозволяє нам безпосередньо викликати функцію з літеральним рядком (певним чином; myFunc`abc`;
приблизно аналогічно myFunc(["abc"])
). Якщо ми поставимо виклик функції як останнє в програмі, загальна структура буде виглядати приблизно так:
code;func`code;func`
Все, func
що потрібно зробити, - це вивести свій аргумент, після чого - backtick, потім його аргумент і другий backtick. Якщо припустити, що у нас є аргумент в a
і backtick 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
(трохи коротше , щоб генерувати, завдяки [].constructor[n+a+m+e]
, m
можна знайти в 0 .constructor+0
: "function Number() { ..."
).
Нарешті, ми склеюємо все разом. Ми призначаємо перемичку для змінної f
, але оскільки ми не можемо використовувати її безпосередньо у рядку функції, ми замість цього встановлюємо змінну q
на букву f
та використовуємо її замість неї. Це робить наш заключний рядок a+l+e+r+t+y+a+P+q+P+a+P+q+z
, або "alert(a+f+a+f)"
. Потім Function()
ми подаємо це, подаємо наш готовий код до результату, і вуаля, у нас є квота JavaScript з не більше одного знака на рядок!
Моя голова відчуває себе жахливо на даний момент, тому, будь ласка, розпитайте про будь-які помилки, які я допустив, або про речі, які я пропустив у цьому поясненні, і я повернуся до вас після того, як я трохи відпочив ...