JavaScript (ECMAScript6), 2 Bytes pro Zeile
'\
'[
'\
b\
i\
g'
][
'\
c\
o\
n\
s\
t\
r\
u\
c\
t\
o\
r'
][
'\
c\
a\
l\
l'
](
0,
`\
n\
=\
p\
r\
o\
m\
p\
t\
(\
'\
'\
)\
;\
i\
=\
0\
;\
f\
o\
r\
(\
;\
+\
+\
i\
<\
=\
n\
;\
c\
o\
n\
s\
o\
l\
e\
.\
l\
o\
g\
(\
i\
%\
5\
?\
f\
|\
|\
i\
:\
f\
+\
'\
P\
i\
e\
'\
)\
)\
f\
=\
i\
%\
3\
?\
'\
'\
:\
'\
A\
p\
p\
l\
e\
'\
`)
()
Lange Erklärung
Die Art und Weise, wie wir Zeilen kürzer machen können, besteht darin, Code in eine Zeichenfolge umzuwandeln und die Zeilenenden zu maskieren. Dadurch wird ein Limit von 2 Byte pro Zeile festgelegt.
So alert(1)
wird es
"\
a\
l\
e\
r\
(\
1\
)"
Aber jetzt ist Ihr Code eine Zeichenfolge, daher müssen wir die Zeichenfolge als Code ausführen. Ich kenne mindestens 4 Möglichkeiten, wie Sie einen String als Code ausführen können:
- eval (Code) . Der Aufruf benötigt mindestens 5 Bytes
eval(
- setTimeout (Code, Zeitüberschreitung) . Runs funktionieren asynchron, aber optional wird eval intern aufgerufen, wenn Sie eine Zeichenfolge übergeben.
- Sie können das DOM nutzen und Ihren Code in ein
onclick=""
Attribut einfügen , aber ich habe es nicht geschafft, den Elementerstellungsteil kurz zu machen.
- Durch Aufrufen des Function-Konstruktors new Function () wird Ihr Code in eine anonyme Funktion umgewandelt, die Sie später aufrufen können (ich habe diese Funktion verwendet).
Alle die nativen Funktionen Leben innerhalb des Fenster - Objekt und in Javascript , können die Objekteigenschaften zugreifen , die unter Verwendung von Punktnotation so eval()
wird window.eval()
, oder Sie können Eigenschaften zugreifen , die unter Verwendung von Dirac-Notation window['eval']()
. Sie können dies ausnutzen, um die eval
Zeilen mit der zuvor beschriebenen Methode in mehrere Zeilen aufzuteilen. Sie müssen das Fenster jedoch noch eingeben eingeben. Ein Trick besteht darin, dass, wenn Sie sich nicht in einem Frame befinden, die obere Variable auch window ist, sodass window.eval zu top.eval wird (3 Byte weniger).
w=top
w['eval']
You can shorten the assignment using parenthesis
w=(
top
)
w[
'e\
av\
al'
](
/*string*/
)
Dadurch wird der Code auf mindestens 3 Byte begrenzt. Um den Code 2 Bytes zu machen, habe ich den new Function(/*string*/);
Konstruktor verwendet, aber ich musste kreativ sein, um darauf zuzugreifen, ohne es eingeben zu müssen.
Erstens können Sie den Function- Konstruktor als eine Funktion aufrufen, bei der das neue Schlüsselwort weggelassen wird. Dies verringert die Anzahl der Bytes um 4, ist jedoch auch aus einem anderen Grund wichtig. Der Aufruf der Konstruktor als eine Funktion noch eine Instanz gibt diese uns zu drehen erlaubt new Function(code)
zuFunction(code)
. Eine andere wichtige Sache ist, dass der Function-Konstruktor eine call
Methode hat, mit der Sie jede Funktion aufrufen können, ohne diese Referenz zu überschreiben, und der Function-Konstruktor selbst eine Funktion ist, die Sie wie eine Methode für sich selbst aufrufen können Function.call(null, code)
.
Alle nativen Funktionen sind Instanzen des Funktionskonstruktors, und alle Objekte in JavaScript verfügen über eine Konstruktoreigenschaft . So können Sie Zugriff auf den Funktionskonstruktor einer beliebigen nativen Funktion alert.constructor
haben und die Funktion verwenden von Call - Methode können wir den Konstruktor als eine Funktion auszuführen. Jetzt haben wir alert.constructor.call (null, code) gibt eine Funktion zurück.
Kombinieren Sie die vorherigen Techniken, die wir daraus machen können alert['constructor']['call'](null, code)
Jetzt müssen wir nur noch eine kurz benannte Funktion oder Methode finden, also wähle ich die big () -Methode im String-Konstruktor. So kann ich direkt von einem leeren String darauf zugreifen"".big
"".big.constructor.call(null, "code")();
''['big']['constructor']['call'](0,'/* code */')()
Dann habe ich einfach alles in 2 Bytes aufgeteilt
Kurz ähm Erklärung (TLDR)
Ich greife auf den neuen Function (Code) -Konstruktor zu, um die Zeichenfolge anstelle von eval (Code) zu analysieren . Dieser Konstruktor ist für jede native Funktion verfügbar, indem Sie anyFunction ausführen. Konstruktor , wie alert.constructor===Function
. Ich verwende eine Funktion / Methode in der Datei String.prototype.big, greife String.prototype.big.constructor.call(null, /*string*/)
aber direkt über ein String-Literal darauf zu "".big
und verwende die Klammernotation . ""['big']['constructor']['call'](0, CODE)
in der Lage sein, es mit der zu brechen \
.