Kürzlich hat jemand strengere Grenzwerte für die Standardzeilenlänge von Python vorgeschlagen:
Aus einer ganzen Reihe von Gründen sollte kein Programm mehr als 80 Zeichen pro Zeile verwenden. In erster Linie ist es für die Lesbarkeit und Wartbarkeit wichtig, einen soliden Standard zu haben, damit wir die Breite unserer Texteditoren entsprechend anpassen können. Ein weiterer Vorteil ist, dass Code problemlos auf Medien übertragen werden kann, die möglicherweise Einschränkungen unterliegen, und bei denen das Hinzufügen von Zeilenumbrüchen störend sein kann, z. B. beim Drucken von Seiten zur Überprüfung in einer Besprechung oder auf Lochkarten.
Aber sind 80 Zeichen zu hoch? Einige empfehlen 79 oder sogar nur 75 Zeichen, damit ein 80 Zeichen breites Terminal in den Code mit einigen Spalten für Zeilennummern passt. Letztendlich ist niedriger eindeutig besser, da niedrigere Grenzwerte es ermöglichen, den Code in mehr Situationen ohne Neuformatierung zu verwenden.
Ihr Ziel ist es, die von Ihrer bevorzugten Sprache geforderte Mindestzeilenlänge zu finden und zu demonstrieren, indem Sie eine FizzBuzz-Variante mit der geringsten Anzahl von Zeichen in einer Zeile schreiben.
Eingang
Eine ganze Zahl n über eine beliebige Methode.
Ausgabe
Geben Sie die durch Zeilenumbrüche getrennten Zahlen von 1 bis n ( n ≥ 1, n ∈ ℤ) aus, mit Ausnahme von:
- für ein Vielfaches von 3 drucken "Apple"
- für ein Vielfaches von 5 print "Pie"
- für ein Vielfaches von 3 und 5 drucken "ApplePie"
Wertung
Die maximale Zeilenlänge in Bytes ohne den Zeilenumbruch (Cr, CrLf, Lf oder andere Systemstandardumbrüche, wie gewünscht) und die Gesamtcodelänge in Bytes als Tiebreaker.
Regeln
Alle Zeilenumbrüche müssen aussagekräftig sein. Zeilenumbrüche, die entfernt und benachbarte Zeilen direkt verkettet werden können, ohne dass dies Auswirkungen auf die Ausgabe hat, müssen entfernt werden.
Antworten:
> <> , 1 Byte pro Zeile,
243161135 Byte-26 Bytes dank Jo King!
2D Sprachen FTW! Obwohl das Schreiben von Schleifen und Zweigen mit goto-Anweisungen anstelle der 2D-Struktur keinen Spaß macht.
Probieren Sie es online! , oder schau es dir auf dem Fischspielplatz an !
Der Fisch schwimmt entlang des Codes nach unten und verwendet bedingte GOTOS, um Dinge zu überspringen, je nachdem, was den Akkumulator unterteilt.
Ich glaube, dies entspricht der Spezifikation: Unabhängig davon, welche Zeilenumbrüche entfernt werden, trifft der Fisch immer die Initiale
v
(die einzige Anweisung, die die Richtung ändert), sodass der Fisch in der ersten Spalte immer nach unten schwimmt. Wenn Sie also eine neue Zeile löschen, wird einfach das nächste Zeichen aus dem Pfad des Fisches entfernt, und ich glaube nicht, dass Sie eines der Zeichen entfernen können, ohne die Ausgabe zu ändern.quelle
Haskell , 3 Bytes / Zeile,
494 471 470 463 453 450461 BytesBEARBEITEN:
-1+x
inx-1
.--
Zeile danachx-
.f
Wirdc 47:[]
anstelle von verwendet[c 47&0]
.w
.a="Apple"
undp="Pie"
in#
und verwende eine Dummy-Rekursion für den Fall 15.w
inf
. Überflüssiges--
zwischenx
und entfernen15
.%
Funktion behoben . Schließlich wurden einige Tests automatisiert, um sicherzustellen, dass es keine Überraschungen mehr gab.f
nimmt einInt
und gibt ein zurückString
.Probieren Sie es online!
Quellenbeschränkungen testen! (Zeile 70 wird vom Testen ausgeschlossen, da das Entfernen der neuen Zeile eine Endlosschleife ohne Ausgabe verursacht.)
Version mit den wichtigsten Quetschtricks entfernt:
Wie es funktioniert
{}
. Da ich eigentlich eher eine Funktion als ein ganzes Programm definiere, bin ich mir nicht ganz sicher, wie ich Bytes zählen soll. Ich habe mich dafür entschieden, sowohl das{}
s als auch ein zusätzliches;
Deklarationstrennzeichen zu zählen (letzteres ist normalerweise ein Zeilenvorschub im normalen Haskell-Modus).--
, durch die die nächste Zeile nicht mehr entfernt werden kann, und eine vorherige Zeile, wenn die vorherige Zeile mit einem Operatorzeichen endet (das selbst nicht Teil eines Zeilenkommentars ist). .\
Backslashes in String-Literalen, die für Zeilenfortsetzungen mit möglicher Einrückung eingerückt werden. Eine Zeichenfolgenlücke mit Begrenzern wird aus der analysierten Zeichenfolge entfernt."Apple"
und"Pie"
das zeigt sich direkt in der Ausgabe. For"8"
und"9"
eine Musterübereinstimmung wird verwendet, um einen Fehler zu ergeben, wenn die Zeichenfolge mehr als ein Zeichen enthält.&
und%
, mit denen eine Zeile gezwungen wird, in einem Operatorzeichen für den ersten Trick zu enden. Wir brauchen dies, um String-Literale zu beenden, da\"
es zu breit ist, um es anzufügen--
.&
ist die allgemeine, so definiert, dassx&y=x
.%
ist so definiert, dass[a]%y=a
, damit es ersetzen!!0
und gleichzeitig erzwingen kann, dass sein Zeichenfolgenargument die Länge 1 haben muss.\n
es unmöglich zu sein scheint, ein String-Literal mit nur 3 Bytes in der Zeile einzufügen .c x=["9"%0,"8"%0..]!!x
verwendet, um von einemInt
in ein Zeichen zu konvertieren , wobei von der Ziffer'9'
abwärts gezählt wird.show
es sich um vier Zeichen handelt, muss die Zahlenausgabe von Hand erfolgen.d
ist eine Liste der Ziffernfolgen"1".."9"
.n
ist eine unendliche Liste von Zahlendarstellungen,["1","2","3",...]
die rekursiv mit definiert wurdend
.#
konvertiert einInt
x
in sein ApplePie-Formular, wenn ein zusätzliches erstes Argument angegeben wird, das dasgcd
vonx
mit 15 ist.quelle
Haskell , 7 Bytes / Zeile, 339 Bytes
Die Anforderung, dass Zeilenumbrüche sinnvoll sind, macht dies zu einer nicht trivialen Herausforderung in Haskell. Es gibt fast keine Möglichkeit, Zeilenumbrüche einzufügen, die nicht entfernt werden können. Daher muss alles mit rechtmäßig kleinen Anweisungen erfolgen.
Probieren Sie es online!
quelle
Gelee ,
32 Bytes / Zeile,1068056 BytesZeilen und Spalten des String-Literal werden transponiert, so dass das Entfernen von Zeilenumbrüchen ihre Reihenfolge durcheinander bringt.
Die übrigen Zeilen sind separate Verknüpfungen / Funktionen und enthalten Funktionsaufrufe (
¢
). Sie können also nur verkettet werden, wenn die Funktionsaufrufe ebenfalls entfernt werden.Probieren Sie es online!
quelle
TI-BASIC, 4 Bytes pro Zeile
Da das Ziel nur darin besteht, die maximale Zeilenlänge zu minimieren, sind einige der Zeilen länger als sie sein müssen, aber die kleinste, die ich machen konnte, war die längste Zeile 4 Bytes. Aus diesem Grund hatte ich das Gefühl, es würde den Code leichter lesbar machen, wenn ich die Zeilen zusammenführen würde, die kombiniert werden könnten, ohne 4 Bytes zu überschreiten.
Ungolfed
Über die Sprache und Einschränkungen
TI-BASIC ist eine Token-Sprache, und in diesem Fall hat jeder Token ein Byte, mit Ausnahme der
StrN
Variablen, die 2 Byte lang sind. Außerdem können Sie das Schließen von Klammern die meiste Zeit weglassen. Dieremainder(
Funktion besteht aus 2 Bytes. Daher sind für ihre Verwendung mindestens 5 Bytes erforderlich (eines für die Funktion, zwei für die Argumente und eines für das Komma inremainder(I,3
). Stattdessen habe ich die FunktionenfPart(
undnot(
verwendet, um sie zu verkürzen. Dies sind beide 1-Byte-Token. Sie können auch sehen, dass ich die eingebaute VariableAns
ziemlich oft verwendet habe, da jeder Ausdruck, der in einer Zeile selbst ausgewertet wird, automatisch darin gespeichert wird. So kann ich ein paar Bytes sparen, indem ich die Ausdrücke und Zuweisungen aufteile.Eine andere Strategie bestand darin, die String-Zuweisungen offensichtlich zu minimieren. Meine Methode dazu hing von der maximalen Zeilenlänge im Rest des Codes ab. Nachdem ich festgestellt hatte, dass es sich um 4 Byte handelt, konnte ich so viel von jeder Zeichenfolge in derselben Zeile wie möglich komprimieren, um die Anzahl der benötigten Zuweisungen zu minimieren. Ich habe dies aus Gründen der Lesbarkeit gemacht.
Die einschränkenden Faktoren in diesem Code sind die Zuweisungen zu Zeichenfolgenvariablen und die Verkettung mit Zeichenfolgenvariablen. Die Zeilen
Ans→Str1
undStr1+Ans
beide sind insgesamt 4 Bytes. Ich müsste einen Weg finden, um String-Variablen vollständig zu eliminieren, um die maximale Zeilenlänge in meinem Code weiter zu minimieren. Alles andere kann auf maximal 3 Byte pro Zeile gekürzt werden.Das Problem liegt dort in der Zuordnung zu numerischen Variablen, wie z
1→I
. Sie können nicht weiter Golf spielen, ohne eine Lösung ohne Variablen zu finden, deren Zeilenlänge 2 Byte nicht überschreitet. Für diese Herausforderung ist das unmöglich.Binäre Operatoren wie
+
erfordern das Operator-Symbol und die linken und rechten Argumente. Ohne dies könnten Sie also keine Zeichenfolgen verketten. Ohne die Verkettung von Zeichenfolgen gibt es keine Möglichkeit, die Zeichenfolgen anzuzeigen, die für dieses Programm erforderlich sind, um die Abfrage abzuschließen, ohne die Zeilenlänge von 2 Byte zu überschreiten. Daher wäre die theoretische Grenze für diese Herausforderung in dieser Sprache 3 Bytes pro Zeile, die ich nicht erreichen konnte.quelle
If A and B
Ans
Token ist 1 Byte, während die drei aufeinander folgenden ZeichenAns
1, 2 bzw. 2 Byte für insgesamt 5 Zeichen sind. Es ist keine ASCII-Zeichenfolge, es ist buchstäblich das Token, wenn Sie es auf dem Taschenrechner eingeben.C (gcc) , 2 Bytes pro Zeile,
374368320310262 BytesIch gehe davon aus, dass man ein bisschen mehr Golf spielen kann. Backslashes, die durch Zeilenumbrüche entstehen, sind so etwas wie trivial.
Probieren Sie es online!
quelle
&&
.Python 3 , 4 Bytes / Zeile, 113 Bytes
Probieren Sie es online!
quelle
PHP 7, 2 Bytes pro Zeile
quelle
Aceto , 1 Byte pro Zeile, 230 Byte
Es hat keinen Spaß gemacht, darüber zu schreiben. Als Fungoid hängen Acetos Kontrollstrukturen stark von seiner 2D-Natur ab, aber wir können das mit vielen, vielen bedingten Escapezeichen umgehen (
`
). Das einzige Problem bei diesen ist, dass sie sich auf den nächsten Befehl auswirken, unabhängig von dessen Vorhandensein (alle Aceto-Programme sind intern Quadrate), weshalb wir das Programm an einigen Stellen ausrichten müssen, indem wir an einigen Stellen leere Zeilen einfügen.Zeichenfolgenliterale können nicht wirklich verwendet werden, Zeichenliterale jedoch (an einigen Stellen müssen sie erneut ausgerichtet werden).
Aufgerufen mit
20
, druckt dies:Dies ist hier nie der Fall, da es von unten nach oben verläuft.
Es gibt mindestens eine Stelle, an der wir 2 Bytes einsparen können (indem wir das
`X
durch ein|
oder ersetzen#
), aber ich habe es beibehalten, weil die Laufzeitkosten für das Durchlaufen einer relativ großen Hilbert-Kurve so hoch sind.Ich habe auch die implizite Voraussetzung für die Nutzung ignoriert
\r
oder\r\n
Zeilenumbrüche , weil ich es ist ein unbeabsichtigter Fehler durch die OP denken. Wenn es eine Änderung oder einen Kommentar gibt, der diese Anforderung verstärkt, kann ich sie ohne großen Aufwand ändern, um stattdessen CR-Zeilenumbrüche zu verwenden.Der bytecount basiert auf der Codegolfing-Codierung von Aceto. Latin-7, in dem
£
sich ein einzelnes Byte befindet.quelle
Perl 5 , 2 Bytes pro Zeile, 182 Bytes
Probieren Sie es online!
Perls Syntax ist sehr nachsichtig, so dass dem Code und den Kommentaren viele Lücken hinzugefügt werden können, was die Kernidee ziemlich einfach macht. Das Hauptziel mit diesem Code ist es, eine Zeichenfolge zu erstellen, die den Code enthält, den wir ausführen möchten, und
eval
es. In Perl ist es möglich, eine Funktion unter Verwendung eines Strings oder einer Variablen mit der&{...}
Notationeval
aufzurufen. In dieser Form ist sie jedoch nicht aufrufbarevalbytes
, solange Sie sie über denCORE::
Namespace aufrufen . Das Erstellen dieser Zeichenfolge war ziemlich einfach, und das Programm wird direkt an diesen Aufruf übergeben. Die Zeichenfolgen werden unter Verwendung der Zeilenumbrüche als Teil des XOR erstellt. Um diese zu erstellen, habe ich dieses Skript verwendet. Damit dies gültig bleibt, mussten einige Stellen mit Kommentaren versehen werden, sodass das Entfernen der Zeilenumbrüche zu einem fehlerhaften Code führen würde.Die FizzBuzz-Routine wurde von primos hervorragender Antwort übernommen .
Perl 5 , 1 Byte pro Zeile, 172 Byte
Ich weiß also (jetzt), dass dies ungültig ist , weil ein paar Zeilenumbrüche entfernt werden können, aber da dies meine ursprüngliche Herangehensweise an das Problem war, füge ich es hinzu. Es hat Spaß gemacht zu sehen, wie weit man Perls Syntax treiben kann! Ich habe dieses Problem aus eigener Kraft genossen, obwohl es ungültig ist.
Probieren Sie es online!
quelle
SmileBASIC,
97 Bytes pro Zeile,159155154152 BytesDies war eine wirklich lustige Herausforderung. Leider verursacht die Regel gegen unnötige Zeilenumbrüche ein paar Probleme (obwohl sie zum Glück die maximale Zeilenlänge hier nicht beeinflusst.) Ich musste Kommentare zwischen Zeilen wie
A%=I/3
und einfügenA=A%*3
, da dieseA%=I/3A=A%*3
in SB korrekt analysiert werden. Ich konnte einen Trick verwenden , um einige Kommentare wegzulassen, da ersetztA
mitE
Marken , dass Zeile ungültig (Es hat etwas mit Zahlen zu tun geschrieben mitE
Notation, denke ich.3E
Eine ungültige Nummer gilt eher als eine Zahl und einen Variablennamen.)Die größte Einschränkung besteht darin, Eingaben zu erhalten.
INPUT x
Dies ist der einfachste Weg. Alternativ können Sie eine Funktion mit einem Eingabewert vonDEF F x
7 Zeichen definieren. Es ist auch schwierig, eine bedingte Aussage zu treffen. Ich kann mir nichts kürzeres als vorstellenWHILE x
.quelle
A%=I/3A=A%*3
syntaktisch gültig, aber logisch fehlerhaft ist, benötigen Sie das Kommentarzeichen nicht.A%=I/3
und analysiertA=A%*3
, daher ist der Kommentar erforderlich.JavaScript (ES6), 3 Bytes pro Zeile
Verwendet die globale Variable,
top
um auf daswindow
Objekt zuzugreifen , von dem aus wireval
den folgenden Code verwenden:Sie müssen es in der Konsole ausführen, da
top
über ein Stack-Snippet mit Sandbox nicht darauf zugegriffen werden kann.quelle
C #, 9 Bytes pro Zeile,
248 242230 BytesDa sich C # nicht um Zeilenumbrüche kümmert, muss am Ende fast jeder Zeile (danke Ørjan Johansen) ein Kommentar eingefügt werden, um die Regeln einzuhalten. Dieses Programm erwartet n als Befehlszeilenargument. Hier ist mit so vielen nicht löschbaren Zeilenumbrüchen wie möglich:
Da die längste Zeile jedoch 9 Byte lang ist, können auch andere Zeilen so lang werden und einige Byte wegnehmen:
quelle
//
Token benötigen , die wiestatic
und zusammenschmelzen würdenvoid
.var
s="";if//
(i%3==0//
)s+=//
"Apple"//
;if(i%5//
.A
von der ersten in die zweite Zeile zu wechseln .Python 2, 5 Bytes / Zeile, 93 Bytes
Der max6-Standard ist bereits veraltet.
Probieren Sie es online!
Python 2 und 3, 5 Bytes / Zeile, 100 Bytes
Probieren Sie es online!
quelle
JavaScript, maximal 6 Bytes / Zeile, 528 Bytes
Idee von hier gerissen .
Code von hier gerissen .
Vielen Dank an Anders Kaseorg für das
g=eval
Speichern eines Bytes pro Zeile.Nicht getrennt:
quelle
a=""+\n"f"+\n"o"+ ...
und endet miteval(\na)
ist etwas kürzerf=eval
und endenf(a)
.PHP, 4 Bytes / Zeile
Probieren Sie es online!
quelle
APL (Dyalog) , 5 Bytes pro Zeile
Probieren Sie es online!
quelle
Netzhaut , 4 Bytes / Zeile
Probieren Sie es online!
quelle
R , 10 Bytes pro Zeile, 800 Bytes
Die Regel "sinnvolle Zeilenumbrüche" machte dies zu einer Herausforderung. Derzeit wird Fizzbuzz-Code nur in einer Zeichenfolge formuliert und dann ausgeführt.
Probieren Sie es online!
Hier ist der verketteten ApplePie Code (angepasst von MickyT des Golf hier ).
Und die unbenutzte Version des Parsing-Codes:
Hier verwende ich,
toString
um die Liste der Symbolea
in einer einzigen Zeichenfolge zu verketten . Das Standardverhalten ist jedoch, jedes Symbol mit zu trennen,
, daher rufen wirgsub
auf, sie durch Nullen zu ersetzen. Dann übergeben wir esparse
undeval
erledigen die Drecksarbeit.Es ist möglich , dass es ein Ansatz, der diese Zeichenfolge nicht Parsing - Methode nicht verwendet und nur gerade nach oben implementiert FizzBuzz, aber es scheint mir , dass mit
for
oderwhile
oder einem bestimmendenfunction
Bedarf mehr Linien als der aktuelle Ansatz.quelle
Ruby,
105 Bytes / Zeile,354214 Bytes-140 Bytes aus der Rohbewertung von @NieDzejkob.
Wie es funktioniert
Ruby verkettet automatisch Sequenzen von String-Literalen (mit Ausnahme von Einzelzeichen-Literalen wie
?a
) in derselben Anweisung. Das heißt, dasx = "a" 'b' "c" %q{d}
ist gleichbedeutend mitx = "abcd"
. Wir verwenden dies, um den FizzBuzz-ähnlichen Code zum Aufrufen in viel kleinere Zeichenfolgen aufzuteileneval
, da dies+
das Programm aufgrund der Regel zum Entfernen von Zeilenumbrüchen ungültig macht, aber\
Syntaxfehler verursacht, wenn die Zeilenumbrüche entfernt werden!quelle
eval
länger ist als der Rest, oder?Julia 0,6 , 5 Bytes pro Zeile, insgesamt 168 Bytes
Probieren Sie es online!
Das
print
bringt dies unvermeidlich (afaict) in das 5 Bytes pro Zeilengebiet.Ungolfed:
*
ist der String-Verkettungsoperator,a*p*"\n"
bildet also "ApplePie \ n".|>
ist der Operator für die Funktionsverkettung (/ piping), daher wird der ausgewählte String als Argument an gesendetprint
. Dassin
wird nicht verwendet, es ist nur da, weilprint
es sich in einem Array befinden muss, um ein signifikantes Leerzeichen danach zu haben (mit dem#
Trick danach wird die maximale Byteanzahl pro Zeile auf 6 gebracht).Wenn die Ausgabe einfach als Array zurückgegeben werden soll, kann dies mit maximal 4 Bytes pro Zeile erfolgen:
Julia 0,6 , 4 Bytes pro Zeile, insgesamt 152 Bytes
Probieren Sie es online!
Eine Funktion, die n akzeptiert und ein Array mit der erwarteten Ausgabe zurückgibt. Die maximale Zeilenlänge ist hier begrenzt durch
n->
- Julia benötigt dies in einer einzelnen Zeile, um es richtig als Start eines Lambdas zu analysieren.quelle
Pascal (FPC)
-Sew
, 6 Bytes pro Zeile,348.320BytesProbieren Sie es online!
Verwendet FPC, um 6 Bytes pro Zeile zu erhalten. Ohne sie wäre das Ergebnis viel schlechter. Dies ist die kleinstmögliche Linienbreite, da after
write
entweder;
oder(
(oder ein unnötiges Leerzeichen) sein muss. Daher wird ein spezieller Kommentar eingefügt, um dies zu vermeiden. Die Funktionen von FPC, die diese Antwort beeinflusst haben, sind://
- Einzeilige Kommentare beginnen.{$<something>...}
sind Compiler-Direktiven. Wenn die Direktive nicht existiert, gibt FPC eine Warnung aus (und auch an{$ ...}
). In diesem Programm werden{
und$
durch einen Zeilenumbruch getrennt, der beim Löschen die Warnung ausgibt.-Sew
- Compiler bleibt auch nach Warnungen stehen, so dass{
und$
verbunden die Kompilierung stoppt.quelle
Japt , 3 Bytes pro Zeile
Fast geschafft, es auf zwei Bytes pro Zeile zu reduzieren, aber die Rückkehr von der Karte bricht ab, wenn eine neue Zeile folgt.
Die FizzBuzz-Implementierung selbst stammt aus dem kanonischen FizzBuzz-Thread .
Probieren Sie es online!
quelle
LOLCODE ,
188 Bytes pro Zeile, insgesamt 303 BytesProbieren Sie es online!
-10 Bytes pro Zeile mit dem
…
Zeilenfortsetzungszeichen, danke an Ørjan Johansen!quelle
Python 2 , 5 Bytes / Zeile
Probieren Sie es online!
quelle
'z\"'
dasselbe wie'z\
⏎"'
, daher bedeutet die redundante Newline-Regel, dass Sie keine Fortsetzungszeile innerhalb des Strings mit beginnen dürfen"
.r'...'
jetzt geschafftSyntaxError
.FizzBuzz
zu "using" geändertApplePie
.JavaScript (ECMAScript6), 2 Bytes pro Zeile
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 esAber 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(
onclick=""
Attribut einfügen , aber ich habe es nicht geschafft, den Elementerstellungsteil kurz zu machen.Alle die nativen Funktionen Leben innerhalb des Fenster - Objekt und in Javascript , können die Objekteigenschaften zugreifen , die unter Verwendung von Punktnotation so
eval()
wirdwindow.eval()
, oder Sie können Eigenschaften zugreifen , die unter Verwendung von Dirac-Notationwindow['eval']()
. Sie können dies ausnutzen, um dieeval
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).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 einecall
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önnenFunction.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
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, greifeString.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\
.quelle
'
und]
entfernt werden kann und das Programm trotzdem erfolgreich ausgeführt wird.Pip , 3 Bytes pro Zeile, insgesamt 72 Bytes
Probieren Sie es online!
Pip ist überaus flexibel in Bezug auf Leerzeichen. Die einzige Strategie, die machbar erscheint, besteht darin, einen String zu erstellen, ihn so zu ändern, dass die Zeilenumbrüche nicht gestört werden, und ihn auszuwerten.
Wir erstellen eine Zeichenfolge, in der jedes andere Zeichen eine neue Zeile ist, und nehmen jedes andere Zeichen mit
UW
(Uneave) und Unary@
(Get First Element):Das Ergebnis
@UW
sollte unser ApplePie-Code sein, der von der FizzBuzz-Lösung hier angepasst wurde . Wenn Zeilenumbrüche in der Zeichenfolge gelöscht werden, führt dies nicht zum vollständigen Code, was entweder zu einem Syntaxfehler oder zu einer falschen Ausgabe führt.Außerhalb der Zeichenfolge befinden sich noch zwei Zeilenumbrüche. Wir haben diese obligatorisch gemacht, indem wir den
Y
(yank) -Operator - der hier als No-Op fungiert - zusammen mit der Art und Weise verwendet haben, wie Pip Großbuchstaben analysiert:Wenn diese Zeilenumbrüche gelöscht werden, wird das Programm anders analysiert und tut nicht das, was es soll.
quelle
Java 8, 7 Bytes pro Zeile, 171 Bytes
Ein nichtiger Lambda, der eine
int
. Ich vermute, dass dies den Anforderungen in Bezug auf Zeilenumbrüche entspricht, aber ich kann es nicht beweisen, und die Überprüfung durch rohe Gewalt würde auf meinem Computer ungefähr einen Monat dauern. So geht es.Probieren Sie es online
Ziemlich langweilig wegen der Zeilenkommentare. Das einzig interessante hier ist die Verwendung einer Nullreferenz
System
, die notwendig zu sein scheint, um in weniger als 8 Bytes pro Zeile normal auszudrucken. Beachten Sie auch, dass derprint
Methodenaufruf der Engpass ist.Ungolfed ohne Kommentare:
quelle