Willkommen in der Welt des Compiler-Golfs. Ihre Aufgabe ist es, ein Programm zu schreiben, das ein anderes Programm generiert, um eine Variante von FizzBuzz nach Spezifikation abzuspielen.
Dein Compiler
Schreiben Sie einen Compiler, der nach Spezifikation Varianten des FizzBuzz-Programms generiert. Die Spezifikation dieser Variante wird in Form eines Arrays von Integer / String-Paaren ausgedrückt.
- Die Eingabe kann in jeder für Ihre Sprache geeigneten Form erfolgen. (In meinen Beispielen wird n: xxxx verwendet, dies dient jedoch nur zur Veranschaulichung.)
- Jede Ganzzahleingabe darf nur einmal pro Aufruf Ihres Compilers verwendet werden.
- Die ganze Zahl jedes Paares hat einen Wert von mindestens eins.
- Die Zeichenfolge jedes Paares besteht nur aus genau vier ASCII-Buchstaben.
- Die Ausgabe muss ein einzelnes vollständiges Programm sein, das den folgenden Regeln entspricht.
- Die Ausgabe kann in beliebiger Form erfolgen, sofern es sich um ein Textprogramm handelt. (Also keine zurückgegebenen Lambda-Ausdrücke.)
Das Verhalten ist für Eingaben, die nicht den obigen Regeln entsprechen, undefiniert.
Ihr generiertes FizzBuzz-Programm
Das von Ihrem Compiler generierte Programm verwendet eine einzelne Ganzzahl n als Eingabe. Es wird eine Folge von Zahlen von eins bis einschließlich n ausgegeben, wobei die Zahlen bei Bedarf durch FizzBuzz-Zeichenfolgen ersetzt werden.
- Das generierte Programm muss in derselben Sprache wie der Compiler sein.
- Die Eingabe n kann in jeder für Ihre Sprache geeigneten Form erfolgen.
- n hat einen Wert von mindestens eins.
- Eine Zahl, die ein Vielfaches von mindestens einer der in den Compiler eingegebenen Ganzzahlen ist, muss durch alle Zeichenfolgen ersetzt werden, die mit diesen zusammengefügten Ganzzahlen gepaart sind.
- Eine Zahl, die nicht durch einen FizzBuzz-String ersetzt werden soll, muss in dezimalem ASCII ausgegeben werden.
Beispielsweise;
> GenFizzBuzz 3:Fizz 5:Buzz
> a.out 5
1
2
Fizz
4
Buzz
Wertung
Ihre Eingabe wird anhand der Länge der von Ihrem Compiler generierten Programme bewertet, die zur Länge Ihres Compilers addiert werden. Führen Sie Ihren Compiler mehrmals mit den folgenden Parametern aus und addieren Sie die Länge der generierten Programme zusammen mit der Länge des Compilers, um Ihre Punktzahl zu ermitteln.
- Zähle einfach. (Keine Eingaben - Das generierte Programm zählt 1 bis n ohne Ersetzungen.)
- Nur Golf. (1: Golf - Das generierte Programm gibt n- mal "Golf" aus .)
- Klassischer FizzBuzz. (3: Fizz, 5: Buzz)
(Beachten Sie, dass Ihr Compiler Code für jede gültige Eingabe generieren muss, nicht nur für diese.)
Antworten:
Python 3 -
168162 + 230 = 392Oh, Python, du versuchst es so sehr, aber das
import sys;sys.argv
Zeug mit 4 zu multiplizieren, tut wirklich weh!Ausgabeprogramme:
Die erwartete Eingabe für das Hauptprogramm ist eine auswertbare Folge von Python-Tupeln oder
'()'
keine Eingabe. (Sie sagten „bequem“.) Beispiel Eingabe:'()'
,'("Golf",1),'
,'("Fizz",3),("Buzz",5)'
Hinweis für die Schale zu zitieren und für einen Eingang Komma Hinter.Fehler um 1 Uhr morgens durch Ändern von Dikt (undefinierte Reihenfolge!) Zu Tupeln behoben.
Erwartete Eingabe für die anderen Programme ist nur die Nummer
quelle
perl6
37634084 + 115 = 199UPDATE: von perl5 auf perl6 umgestellt um
say
ohne zu kommenuse feature
.UPDATE: drei Testfälle statt fünf
Es gibt Hunderte von bereits getesteten Lösungen für FizzBuzz, und viele Wettbewerbe enden mit demselben Ergebnis. Deshalb habe ich hier angefangen. Mein Compiler erstellt nur eine angepasste Version dieser Lösung. Ein paar zusätzliche Zeichen wurden eingefügt, um die "Just Count" -Variation zu berücksichtigen.
Compiler erwartet Argumente wie: "Fizz 3" "Buzz 5"
kompilierte Programme, erwarten Argumente wie: 100
Kompilierte Programme für alte Testfälle:
quelle
Pyth - 51 + (38 + 43 + 50) = 182 Bytes
Kann dem Compiler wohl ein paar Bytes golfen. Die Links auf allen von ihnen sind Permalinks zum Online-Dolmetscher.
Compiler - 51 Bytes
Führt nur die Formatierung von Zeichenfolgen mit einem Eingabetupel aus. Nimmt Eingaben wie:
Nichts - 38 Bytes
Nur Golf - 43 Bytes
Klassisches Fizz Buzz - 50 Bytes
quelle
C ++ 11 ~ 486 + (234 + 244 + 255) = 1219
Die erste Teilnahme hier, diese Herausforderung gehört nicht zu den schwierigsten, also dachte ich, ich würde es versuchen. Mit C ++ und sogar mit C ++ 11-Zusätzen ist es immer noch eine ziemlich ausführliche Sprache, aber ich bin mir sicher, dass es Raum für Verbesserungen gibt.
Compiler (486):
Es nimmt Argumente in Form von
3Fizz 5Buzz
etc. an.Anzahl (234):
Golf (244):
FizzBuzz (255):
Zusätzliche Information
Getestet mit GCC 4.8.1, keine Compiler-Cheats.
Hier ist ein kleines Makefile, um die Generierung der Testfälle zu automatisieren und sie auszuführen (verwenden
make run
):quelle
map<int,string> f
könnte seinmap<int,string>f
. Sie könnenj=1
gleichzeitig mit initialisierenz
.Ruby 99 + (86 + 94 + 103) = 382
Verwendung:
quelle
Stax , 23 + 5 + 17 + 29 = 74
Führen Sie es aus und debuggen Sie es
Kürzeste Antwort bisherNicht überraschend von Jelly geschlagen. Die in Stax bereitgestellte Zeichenfolgenvorlage ist wirklich ordentlich und bietet printf-ähnliche Funktionen. Die vom Compiler generierten Programme sind fast immer so kurz wie das Beste, was man durch manuelles Codegolfing ohne Packen erreichen kann.Der Compiler selbst hat 23 Bytes lang.
Das ASCII-Äquivalent lautet:
Bereitgestellter Eingang
[]
, erzeugt diesen (5 Bytes)Führen Sie es aus und debuggen Sie es
Bereitgestellter Eingang
[[1,"Golf"]]
, erzeugt diesen (17 Bytes)Führen Sie es aus und debuggen Sie es
Bereitgestellter Eingang
[[3,"Fizz"],[5,"Buzz"]]
, erzeugt diesen (29 Bytes)Führen Sie es aus und debuggen Sie es
quelle
Gemeines Lisp,
636577Ich nahm meine andere Antwort und hüllte sie in Quasiquotes ein, während ich Eingabeparameter hinzufügte. Ich drucke das resultierende Formular einzeilig aus und entferne unnötige Leerzeichen. Der Compiler ist etwas länger als die Vorgängerversion, aber die resultierende Punktzahl wird reduziert.
Ergebnis
Zurückgegebene Werte:
Ziemlich
Das Eingabeformat ist eine Liste von
(number string)
Paaren. Beispielsweise:... druckt auf Standardausgabe:
... was hübsch gedruckt ist:
Testen der resultierenden Funktion:
quelle
Perl 5 , 77 + 93, 170 Bytes
Probieren Sie den Compiler online aus!
Versuchen Sie einfach online zu zählen!
Probieren Sie einfach online Golf!
Probieren Sie fizz buzz online aus!
quelle
Jelly ,
88848373 BytesKürzeste Antwort bisher (übertrifft die vorherige "kürzeste Antwort" um 1 Byte)
Compiler:
Probieren Sie es online! (Compiler)
Probieren Sie es online! (überprüfen Sie den bytecount)
Statistiken:
quelle
C 1080 Bytes insgesamt
Compiler [369 Bytes]
Fizz Buzz [241]
Golf [237]
Count [233 Bytes]
quelle
Gleichstrom , 434 Bytes
Probieren Sie es online!
Die Eingabe für den Compiler (168 Byte) sollte als Ganzzahl, Zeichenfolge, Ganzzahl, Zeichenfolge usw. (
3 [Fizz] 5 [Buzz]
) im Stapel abgelegt werden . Es sollte in der Reihenfolge angegeben werden, in der die Fizzes und Buzzes gedruckt werden sollen. Dies ist möglicherweise ein Cheat (nachdemdc
ich zuvor die Blasensortierung implementiert habe, würde es mich ungefähr 100 Byte kosten), aber es ermöglicht es dem Benutzer auch Angenommen, Sie haben noch "Fizz" mit 3 und "Buzz" mit 5, aber Sie haben 15 "BuzzFizz".Ich bin sicher, das kann ein bisschen mehr golfen werden; Das Hauptmakro im endgültigen Programm (
M
) basiert auf zwei Makros (F
undP
), die bei fehlender Eingabe eher unnötig sind. Im Moment prüft der Compiler auf Ein- und Ausgaben verschiedener (viel kleinerer) Versionen dieser Makros, wenn es keine gibt, aber ich bin nicht sicher, ob das gesamte Setup optimal ist.Der Compiler selbst ist ziemlich unkompliziert. Er prüft nur, ob auf dem Stapel Regeln vorhanden sind, und gibt in diesem Fall Code aus, in dem die Stapeltiefe gespeichert ist
z
, und speichert den Stapel in einem Array mit dem Index 0a
und druckt dann den verallgemeinerten Code FizzBuzz-Code. Wenn sich nichts auf dem Stapel befand, wird nur eine geänderte Version des FizzBuzz-Codes gedruckt. Testfälle:Keine Eingabe (46 Byte):
3 [Fizz] 5 [Buzz] (117 Bytes):
1 [Golf] (103 Bytes):
Sie alle erwarten den n- Wert auf dem Stapel, der in gespeichert wird
n
. Diejenigen, die 'Regeln' haben, platzieren sie im Arraya
, wobei die Zeichenfolgen bei ungeraden Indizes und die ganzen Zahlen bei geraden Indizes stehen. Das HauptmakroM
inkrementiert alles, was sich auf dem Stapel befindet, führt ein Makro aus,F
das den Wert mit dem Array vergleichta
, prüft, ob dasF
Set-Register nur die Zeichenfolge abruft (aktuelle Position im Array abzüglich eins) und druckt sie aus. Es setzt auch auf Wahrheit. Unser Compiler macht sich nicht die Mühe, ohne Eingabe zu drucken , und macht im Grunde genommen ein Nein.b
Hauptmakro auf wahr oder falsch , und druckt, wenn dies der Fall ist, den oberen Teil des Stapels oder eine neue Zeile, setzt ihnb
auf falsch zurück und behält dann bei Laufen selbst, wennn
noch nicht erreicht wurde. Makro durchsucht nachF
vorgegebenen Regeln das gesamte Array nach Übereinstimmungen. Es wird um zwei erhöht, da unsere Ganzzahlen und Zeichenfolgen durch das Array gewoben sind, und bei einer Übereinstimmung wird ein Makro aufgerufenB
. MakroB
b
B
F
quelle
Vim, 122 (Compiler) + 73 (leer) + 90 (Golf) + 123 (Fizzbuzz) = 392 Byte
Compiler
Eingabeformat
Generierter Code für den FizzBuzz-Fall
Generierter Code, kommentiert
<C-V>
ist 0x16.<ESC>
ist 0x1b.<C-A>
ist 0x01.Beispielsitzung
quelle
SlooSarksi. Lang, 179
quelle