Viele PPCG-Benutzer halfen bei der Erstellung dieser Herausforderung, sowohl im Chat als auch in der Sandbox, insbesondere Martin Ender , AdmBorkBork , Emigna und user202729
Unsere Community hat es für notwendig erachtet, eine Reihe von Sprachen zu erstellen, die speziell für das Golfen entwickelt wurden, "Golfsprachen", wie wir sie nennen. Solche Sprachen haben sich vom einst brillanten, jetzt klobigen GolfScript zu den schlanken, prägnanten Sprachen wie Jelly und Husk entwickelt . Wie wir sehen können, werden diese Sprachen für eine Reihe von Aufgaben immer kürzer. Als offensichtliche Experten für Golfsprachen sollten wir also gemeinsam eine Sprache entwerfen, die jede andere Sprache übertrifft, die es wagt, sich zu behaupten. Wir stellen vor: Bugle!
Bugle: Aus dem Akronym BuGoL: Bu ilt Go lfing L Anguage.
Wie diese Herausforderung funktioniert
Falls Sie nicht verstanden haben, worauf ich in der Einleitung anspielte, handelt es sich bei dieser Herausforderung um eine Frage der Antwortverkettung , bei der wir beide etwas zum Interpretieren einer neuen Golfsprache beitragen und deren Fähigkeit verbessern, mit jeder Antwort auf PPCG zu konkurrieren.
Ich werde die erste Antwort posten, die aus der Grundlage der Sprachspezifikation / des Dolmetschers besteht, und alle anderen Antworten werden von da an fortgesetzt. Neue Einreichungen bieten die folgenden Dinge:
- Eine Änderung der Sprachspezifikation
- Ein zeitgemäßer Dolmetscher, der sich trifft genau den Anforderungen der Änderungen entspricht
- Die aktualisierte Punktzahl der Sprache (mehr Details in Kürze)
Sie können die Spezifikation auf drei Arten ändern:
- Sie können einen einzelnen Befehl hinzufügen
- Sie können zwei neue Befehle hinzufügen
- Sie können das Verhalten eines vorhandenen Befehls bearbeiten
Die neuen Interpreter In Bezug auf Sie müssen die neueste Version, geschrieben in Python verwenden. Es muss nicht golfen werden. Jeder zuvor hinzugefügte Befehl muss sowohl mit dem neuesten Interpreter als auch mit den neuesten (von Ihnen hinzugefügten) Befehlen testbar sein. Sie dürfen auch zu keinem Zeitpunkt eine anstößige Sprache verwenden, wenn Sie den Interpreter aktualisieren, z. B. in Kommentaren oder Zeichenfolgenliteralen usw.
Die hinzugefügten Befehle können alle gewünschten Aktionen ausführen . Die einzigen Anforderungen sind:
- Es wird keine anstößige Ausgabe erzeugt
- Es ist nicht dasselbe wie ein anderer Befehl
- Dies verhindert nicht, dass eine der Beispielherausforderungen abgeschlossen wird
Abgesehen davon kann es so spezifisch oder allgemein sein, wie Sie möchten. Es kann sich auch um ein beliebiges Zeichen handeln . Wenn Sie sich nicht sicher sind, ob Ihr Zusatz einen neuen Befehl darstellt, können Sie ihn in den Kommentaren nachfragen.
Die Punktzahl der Sprache
Möglicherweise haben Sie bemerkt, dass Sie die Punktzahl der Sprache in allen neuen Einsendungen angeben müssen. Seine Punktzahl verhindert, dass diese Herausforderung für immer bleibt, und ist wie folgt definiert:
Die aktuelle Punktzahl ist die Summe der Anzahl der Bytes, die die Sprache benötigt, um die unter 20 Aufgaben zu erledigen
Für jede der Aufgaben gelten die Standard-E / A-Regeln sowie die Standard- Regelungslücken .
Die 20 Aufgaben:
- "Hallo Welt!" - Geben Sie den String aus
Hello, World!
- 1, 2, Fizz, 4, Buzz - Gibt jede ganze Zahl von 1 bis 100 (einschließlich) in einer separaten Zeile aus, wobei ein Vielfaches von 3 durch ein
Fizz
Vielfaches von 5 durch einBuzz
Vielfaches von beidem durch ein Vielfaches von ersetzt wirdFizzBuzz
- Produzieren Sie die Nummer 2014 ohne irgendwelche Zahlen in Ihrem Quellcode - Geben Sie die Nummer 2014 aus, ohne eines der Zeichen
0123456789
im Quellcode zu verwenden, ohne auf externe Variablen oder zufällige Seeds zuzugreifen - Obfuscated Hallo Welt - Ausgabe der Zeichenfolge
Hello, World!
, ohne Zeichen in mindestens zwei der folgenden Sätze mit:hlwd
,eor01
und27
(Groß- und Kleinschreibung) Singe Happy Birthday in deiner Lieblingsprogrammiersprache - Gib Folgendes in einer Sprache deiner Wahl aus:
Happy Birthday to You Happy Birthday to You Happy Birthday Dear [the name of your favourite programming language] Happy Birthday to You
Wir sind kein Fremder, wenn es um das Codieren von Golf geht, Sie kennen die Regeln und ich auch - geben Sie den vollständigen Text von "Never Gonna Give You Up" aus.
- Vorzeichen ausgeben - Geben Sie unter Angabe einer Zahl -1 ein wenn es negativ ist, 0, wenn es 0 ist, oder 1, wenn es positiv ist
- Collatz-Vermutung (OEIS A006577) - Ausgehend von einer Ganzzahl dividieren Sie diese durch 2, wenn sie gerade ist, oder multiplizieren Sie sie mit 3 und addieren Sie 1, wenn sie ungerade ist, und wiederholen Sie den Vorgang, bis Sie 1 erreichen. Die Ausgabe sollte die Anzahl der Iterationen sein bringt Sie zu erreichen 1.
- Eine Reihe von Herausforderungen Nr. 1: Abwechselnde Reihen - Überprüfen Sie bei einer Reihe von Ganzzahlen, ob alle geraden und alle ungeraden Elemente gleich sind, und geben Sie dementsprechend einen Wahrheits- oder Falschwert aus
- Bin ich eine unbedeutende Gruppe? - Überprüfen Sie bei einem gegebenen Array von Ganzzahlen, ob die absoluten Unterschiede zwischen aufeinanderfolgenden Elementen alle kleiner oder gleich 1 sind, und geben Sie dementsprechend einen Wahrheits- oder Falschwert aus
- Ist diese Zahl eine Primzahl? - Schreiben Sie bei einer positiven Ganzzahl ein vollständiges Programm, um zu prüfen, ob es eine Primzahl ist, und geben Sie dementsprechend einen Wahrheits- oder Falschwert aus
- Ich bin ein Palindrom. Bist du?- Überprüfen Sie anhand eines Strings, ob es sich um ein Palindrom handelt, während es sich bei Ihrem Programm / Ihrer Funktion ebenfalls um ein Palindrom handelt, und geben Sie dementsprechend zwei unterschiedliche und konsistente Werte aus
- Summiere die Zahlen auf Standard in - Nimm eine Reihe von Zahlen nach STDIN und gib ihre Summe aus.
- Find the Factorial - Gibt bei einer Ganzzahl
n
das Produkt aller Ganzzahlen zwischen1
und ausn
einschließlich aus. - Kürzester Code für unendliche Ausgaben - Ohne Eingabe wird eine unendliche Ausgabe erzeugt, die theoretisch nie aufhört, Daten auszugeben.
- Backe ein Stück Pi - Gib genau diesen Text aus:
()()()()()()
|\3.1415926|
|:\53589793|
\::\2384626|
\::\433832|
\::\79502|
\::\8841|
\::\971|
\::\69|
\::\3|
\__\|
- Finden Sie die kleinste Zahl, die N nicht teilt - Geben Sie bei einer positiven ganzen Zahl N die kleinste positive ganze Zahl aus, die N nicht teilt.
- Ist das gerade oder ungerade?- Bei einer Ganzzahl N wird die Parität als Wahrheits- / Falschwert ausgegeben.
- Ausgabe mit der gleichen Länge wie der Code - Schreiben Sie den kürzesten Code, dessen Ausgabe die gleiche Länge wie der Code hat, wobei die Ausgabe nicht mit dem Code übereinstimmt.
- Golf du ein Quine für großes Wohl! - Schreiben Sie die kürzeste Quine in Ihrer Sprache.
Um gültig zu sein, muss eine neue Einreichung für mindestens 2 der Probleme eine Golf-Einreichung mit jeweils mindestens 1 Byte aufweisen . Sie können die Länge anderer Einsendungen erhöhen, aber die Gesamtpunktzahl muss sich pro Antwort um mindestens 2 verringern . Bitte fügen Sie auch einen Link zu den aktualisierten Programmen hinzu. Die aktualisierten Lösungen dürfen nicht funktionieren, wenn sie mit einer früheren Version des Interpreters ausgeführt werden.
Wie bekomme ich Cookies?
Ich habe eine Liste von 5 Herausforderungen, die nicht zwingend zu versuchen sind und sich nicht auf Ihre Punktzahl auswirken, sondern lediglich zusätzliche Herausforderungen sind, um zu testen, ob Bugle fähig genug ist. Fühlen Sie sich frei, eine Lösung für eine beliebige Anzahl dieser in Ihre Antwort aufzunehmen:
- Erstellen Sie einen Selbstinterpreter
- Erstellen Sie eine Payload-fähige Quine
- Eine Zeichenfolge verbergen
- Hyperprogrammierung: N + N, N × N, N ^ N in einem
- "KNOTEN" oder "NICHT"?
Beschreibungen sind nicht enthalten, da sie nicht für jeden erforderlich sind, um an der Herausforderung teilnehmen zu können.
Wie gewinnt man
Sobald die Mindestpunktzahl erreicht ist ( wir glauben , dass sie 16 ist, obwohl alle Versuche, Golf zu spielen, sehr begrüßt werden), ist die Kette offensichtlich zu Ende, da Lösungen keine bessere Punktzahl erzielen können. Sobald 16 erreicht ist, bleibt die Herausforderung einen Monat lang bestehen , um jedem die Chance zu geben, die Lösungen noch weiter zu verbessern. Nachdem dieser Monat vergangen ist, ist die Herausforderung vorbei.
Sobald die Herausforderung vorbei ist, werde ich den Interpreter auf ein GitHub-Repository migrieren und die üblichen Übungen zur Veröffentlichung einer stabilen Sprache durchführen. Sie können zu diesem Zeitpunkt auch damit beginnen, Lösungen für Herausforderungen in PPCG in der angegebenen Sprache zu veröffentlichen. Versuchen Sie jedoch, die Titelseite nicht mit Antworten zu überfluten. Verteilen Sie sie stattdessen über einen bestimmten Zeitraum.
Formatierung
Um das Auffinden von Informationen in Ihrer Antwort zu erleichtern, formatieren Sie diese bitte wie folgt:
# [N]. [Score]
[New command + description]
[Interpreter/link to interpreter]
[Link to programs]
Wo [N]
ist deine Antwortnummer (1 für die erste, 2 für die zweite usw.)
Regeln
- Sie müssen 3 Stunden zwischen den Antworten warten
- Sie dürfen nicht zweimal hintereinander posten, es sei denn, 10 Tage (genau 240 Stunden) wurde keine Antwort gepostet.
- Sie können frühere Befehle nicht entfernen.
- Ihr Dolmetscher muss nicht Golf spielen, und die Anzahl der Bytes spielt hier keine Rolle.
- Wenn jemand den Programmen ein Golfspiel vorschlägt, während Ihre Antwort die aktuellste ist, müssen Sie diese in den Golfspielen bearbeiten und Ihre Punktzahl aktualisieren.
- Sie können dies auch tun, wenn sich Ihre Antwort in der Mitte der Kette befindet, solange Ihre Punktzahl nicht unter der späterer Antworten liegt.
- Bitte beantworten Sie keine bestehenden PPCG-Anfragen mit dieser Sprache, zumindest bis die Anfrage beendet ist
- Der Interpreter ist in Python 3 geschrieben und sollte in der gesamten Kette auf diese Weise fortgesetzt werden. Das Ändern der Sprache ist verboten.
- Um wieder gültig zu sein, muss eine neue Übermittlung Übermittlungen für mindestens 2 der Probleme mit mindestens 1 Byte für jedes enthalten.
Lass uns anfangen!
quelle
Hello, World!
, sind es 19 Bytes. Wenn sich das Verhalten des leeren Programms jedoch abhängig von der Eingabe ändert, kann es möglicherweise reduziert werdenfor
Schleifen) sind zulässig und sollten hinzugefügt werdenAntworten:
3. Punktzahl:
293825832532 (-51)Der neue Dolmetscher ist da .
Hauptsächlich zum Golfen des Quines und zur Vereinfachung der Ausgabe habe ich die Möglichkeit hinzugefügt, den Stack / Deque zu duplizieren und das gesamte Modell in gerenderter Textform anstatt als Ganzzahl auszugeben.
Lösungen
1. "Hallo Welt!" - 17 Bytes (-3)
5. Singe Happy Birthday in deiner Lieblingsprogrammiersprache - 95 Bytes (-3)
6. Wir sind keine Fremden, um Golf zu codieren, Sie kennen die Regeln, und ich auch - 1884 Bytes (-3)
16. Backe ein Stück Pi - 149 Bytes (-3)
20. Golf du ein Quine für großes Wohl! - 23 Byte (-39)
Sprachfunktionen hinzugefügt
a
#"Hello, World!"a
AusdruckHello, World!
d
quelle
2. Ergebnis:
29382583Der modifizierte Interpreter ist hier auf TIO .
String-Literal ist die naheliegendste Ergänzung der Sprache, vor allem im Kampf Herausforderungen im Zusammenhang mit der Kolmogorov-Komplexität .
Lösungen
1. "Hallo Welt!" - 20 Byte (-28)
Jede Herausforderung der Kolmogorov-Komplexität kann mithilfe der Struktur abgeschlossen werden,
#"<string>"[o>]
die die angegebene Zeichenfolge ausgibt, bis die 0 erreicht ist, nachdem die Zeichenfolge erreicht wurde.2. 1, 2, Fizz, 4, Buzz -
41964 Bytes (-1332)Vielen Dank an @ user202729 für das großartige Golfen.
3. Produziere die Zahl 2014 ohne irgendwelche Zahlen in deinem Quellcode - 9 Bytes (-4)
Verwendet die beiden Zeichen 20 und 14 in Bugle-Codepunkten.
4. Verschleierte Hallo Welt - 19 Bytes (-153)
Erfüllt die Regeln Nr. 1 (nein
HLWDhlwd
) und Nr. 3 (nein)27
).5. Singe Happy Birthday in deiner Lieblingsprogrammiersprache - 98 Bytes (-230)
6. Wir sind keine Fremden, um Golf zu codieren, Sie kennen die Regeln und ich auch - 1887 Bytes (-5006)
16. Backe ein Stück Pi - 149 Bytes (-290)
20. Golf du ein Quine für großes Wohl! - 62 Byte (-12)
Sprachfunktion hinzugefügt
"..."
: String-Literal.\n
wird genauso behandelt wie andere Zeichen."
mit diesem Befehl nicht in den Speicher schreiben (34). Zumindest für den Moment ist es kein allzu großes Problem, da nicht alle der hier aufgeführten Herausforderungen in Bezug auf die Kolmogorov-Komplexität"
in der Ausgabe enthalten sind.Weiteres Golfen ist immer willkommen, besonders für "Never gonna give you" und das Quine. Insbesondere ist die obige Quine die erste nicht-triviale Quine, die ich jemals hergestellt habe. Ich bin fest davon überzeugt, dass jemand eine kürzere finden kann.
quelle
1. Ergebnis: 9638
Der Basisinterpreter kann gefunden werden hier und die Einreichungen hier . Es ist ziemlich lang, also habe ich es in GitHub aufgenommen, anstatt den größten Teil des Beitrags in Anspruch zu nehmen.
Lösungen
Alle diese Lösungen sind die Unicode-Programme, die mit dem
-u
Kommandozeilen-Flag ausgeführt werden, aber die Scores werden so gezählt, als ob sie mit der Bugle-Codepage codiert wären.1. "Hallo Welt!" - 48 Bytes
Drücken Sie einfach und geben Sie dann den Zeichencode jedes Zeichens in der Zeichenfolge aus.
2. 1, 2, Fizz, 4, Buzz - 1396 Bytes
Gleiche Technik wie die Hello, World! Beispiel
3. Produzieren Sie die Nummer 2014 ohne Zahlen in Ihrem Quellcode - 13 Bytes
#
Verwendet das Band,+
erhöht die Zelle,O
gibt als Ganzzahl und aus-
dekrementiert sie4. Verschleierte Hallo Welt - 172 Bytes
Verwendet seine inhärente Ähnlichkeit mit Brainfuck. Erfüllt die Regeln 1 und 3
5. Singen Sie Happy Birthday in Ihrer Lieblingsprogrammiersprache - 328 Bytes
Alle Herausforderungen in Bezug auf die Kolmogorov-Komplexität haben derzeit eine solche Struktur.
6. Wir sind kein Fremder, wenn es um das Codieren von Golf geht. Sie kennen die Regeln und ich auch - 6893 Bytes
7. Geben Sie das Vorzeichen aus - 18 Bytes
Überprüft, ob die Eingabe größer als Null, kleiner als Null (geändert in Ausbeute
-1
statt1
) und gleich Null ist, bevor die Summe berechnet wird.8. Collatz-Vermutung (OEIS A006577) - 36 Bytes
Dies führt die Schleife auf dem Stapel durch, schaltet jedoch auf das Band um, um die Anzahl bei jeder Iteration zu erhöhen.
9. Eine Reihe von Herausforderungen # 1: Alternierende Reihen - 35 Bytes
Dies ist eine leichte Modifikation von Mitch Schwartz 'Antwort auf die bestehende Herausforderung.
10. Bin ich ein unbedeutender Array? - 46 Bytes
Alle Kredit geht an Emigna für Herstellung dieser
11. Ist diese Zahl eine Primzahl? - 31 Bytes
Verwendet den Satz von Wilson und berechnet
(n-1)!² % n
12. Ich bin ein Palindrom. Bist du? - 13 Bytes
Die erste Hälfte des Programms bis zu
O
, setzt den Stapel auf , als[x, x]
wox
entwederTrue
oderFalse
.O
Knallt den Spitzenwert und gibt ihn aus. Der Rest des Programms stellt nur sicher, dass keine Fehler erzeugt werden. Zum Glück, wenn?
drückt es nur''
(die leere Zeichenfolge) auf das Ende der Datei stößt .13. Summieren Sie die Zahlen nach Standard in - 19 Bytes
Dies kann in zwei Teile geteilt werden:
?:[?:];
undL0s[+L1s-]
. Der erste Teil sammelt alle Eingaben in den Stapel. Der zweite Teil drückt die Summe der beiden oberen Elemente, während die Länge größer als 1 ist.14. Finden Sie das Factorial - 25 Bytes
Dies hat eine ähnliche Struktur wie das Summenprogramm, aber anstatt mehrere Eingaben zu drücken, werden
[:1s-:];
die Bereiche von1 .. n
und zum Stapel verschoben[×L1s-]
das Produkt .15. Kürzester Code zur Erzeugung einer unendlichen Ausgabe - 5 Bytes
Verwenden Sie eine while-Schleife, wobei sich das
1
Symbol ständig unter dem Zeiger befindet. Ausgänge1
für immer.16. Backen Sie ein Stück Pi - 439 Bytes
17. Finden Sie die kleinste Zahl, die N nicht teilt
Dies verwendet eine Probedivision, die beendet wird, wenn das Ergebnis des Modulo nicht gleich ist
0
.18. Ist das gerade oder ungerade? - 5 Bytes
Einfaches Modulo von 2
19. Ausgabe mit der gleichen Länge wie der Code - 16 Bytes
Gibt die ersten 16 druckbaren ASCII-Zeichen in umgekehrter Reihenfolge aus:
0/.-,+*)('&%$#"!
20. Golf du ein Quine für großes Wohl!
Kredit geht an user202729 für so dass diese
Sprachspezifikation
Berufung
bugle.py
Derzeit nimmt eine Reihe von Flags den Dateinamen / Code an, der ausgeführt werden soll. Bis jetzt hat es 4 Befehlszeilen-Flags:-f
/--file
gibt an, dass Code aus einer Datei gelesen werden soll-c
/--cmd
/--cmdline
Gibt an, dass Code wird über die Befehlsleitung zugeführt.-c
und-f
können nicht im selben Aufruf verwendet werden-u
/--unicode
weist den Interpreter an, den Code mit der Unicode-Codierung zu lesen. Standardmäßig wird die unten stehende Bugle-Codierung verwendet-l
/--length
gibt nach der Ausführung die Länge der Datei in Bytes an STDERR ausDer folgende Aufruf wurde verwendet, um die obigen Übermittlungen zu testen
Codepage
Bugle verwendet 512 Zeichen in seiner Codepage. Das
0xFF
Zeichen darf nicht für einen Befehl verwendet werden , da es angibt, dass der nächste Hexadezimalwert in die zweite Hälfte der Codepage indiziert werden soll. Die verwendeten Zeichen sind:Oder sehen Sie es in Tabellenform . Beachten Sie dies
\t
und\n
stellen Sie die Tabulatoren bzw. Zeilenumbrüche dar. Beachten Sie auch, dass die 16. Zeile mit einem nicht druckbaren Zeichen endet:und möglicherweise nicht in allen Browsern angezeigt wird.
Erinnerung
Der Interpreter verfügt derzeit über 5 integrierte Speichermodelle. Jedes Speichermodell erfordert ein Zeichen, das dem Interpreter mitteilt, dass er dieses Modell verwenden soll:
$
): Ein Standardstapel, der das Verschieben, Verschieben usw. von Werten unterstützt.#
): Ein Tape à la Brainfuck, das zunächst nur ist0
s besteht.G
): Ein 2d-Gitter, unendlich in beide Richtungen, das nur0
s enthältD
): Eine vom Modul implementierte Dequecollections
.S
): Ein einzelner Wert, mit dem ein Wert gespeichert werden kann.Im Raster ist auch ein einzelner Wert gespeichert, der in Zellen geschrieben oder in Zellen geschrieben werden kann.
Darüber hinaus können die Band- und Rastergrößen sowie das Wickelverhalten mithilfe eines anderen Aufrufbefehls geändert werden. Diese verschiedenen Befehle übernehmen eine bestimmte Anzahl von Werten aus dem aktuellen Speichermodell als Anpassungsparameter:
À
): Nimmt zwei Werte auf - size (int
) und wrapping ()bool
)Á
): Nimmt einen Wert - Größe (int
). Wickelt sich am Ende des BandesÂ
): Nimmt einen Wert - Größe (int
). Wickelt nicht am EndeǴ
): Nimmt 4 Werte an - x Größe (int
), y Größe (int
), x Umbruch (bool
) und y Umbruch (bool
)Der verwendete Speichertyp kann sich während eines Programms durch die Verwendung von ändern
₀₁₂₃₄₅₆₇₈₉
, die auf den 0-indiziertenn
verwendeten Speichertyp zugreifen (₀
ist der erste,₁
ist der zweite usw.), jedoch können derzeit keine Werte zwischen verschiedenen Speichertypen ausgetauscht werden.Verzweigung
Bisher hat Bugle zwei Verzweigungsbefehle, die beide mit einem
]
Zeichen abgeschlossen sind:Während (
[
): Brainfuck-artige While-Schleifen. Diese rufen bei Verwendung einen Wert aus dem Stack / Deque ab oder greifen auf die Zelle unter dem Zeiger in Tape / Grid zu.Beispiel:
#?[-O]
Zählt von der Eingabe abwärts bis0
If / else (
{
und}
). Einmalige Ausführung von while-Schleifen. Wenn der Wert false ist, wird die if-Klausel übersprungen und geht zur else-Klausel, getrennt durch}
. Sie verhalten sich wie while-Schleifen beim Speicherzugriff.Beispiel:
{0}1]
ist ein logisches NICHT-GatterEingebaute Funktionen
Durchläufe von Ziffern werden als Ganzzahlen interpretiert und werden einfach so wie sie sind in das aktuelle Speichermodell übertragen / geschrieben.
Natürlich habe ich Bugle mit einigen grundlegenden eingebauten Funktionen ausgestattet, so wenig wie möglich, damit andere im Verlauf der Kette weitere hinzufügen können. Die Basisbefehle lauten wie folgt:
+
-
%
:
;
<
=
>
?
L
O
R
Z
^
h
o
r
n
Zeiten, wobein
der Höchstwert ists
…
×
÷
quelle