Es war einmal, als ich diese Frage / Antwort auf Quora las
Dieser Code wird als offensichtliche Antwort gegeben
for i in range(1, 100):
if i % 3 == 0 and i % 5 == 0:
print "FizzBuzz"
elif i % 3 == 0:
print "Fizz"
elif i % 5 == 0:
print "Buzz"
else:
print i
Natürlich FizzBuzz wurde zum Tod golfed, aber das ist nicht das, was diese Frage ist. Sie sehen, in den Kommentaren erwähnt jemand, dass diese offensichtliche Antwort großartig ist, da es einfach ist, zusätzliche Bedingungen wie print "Jazz" für ein Vielfaches von 4 hinzuzufügen ) Zeilen von Code.)
Ihre Herausforderung besteht darin, die schönste Version von FizzJazzBuzz zu schreiben, die Ihre Kollegen beurteilen.
Einige Dinge, die die Wähler beachten sollten:
- TROCKEN
- Effizienz von Teilungs- / Moduloperationen
Viele der Antworten auf Quora verwendeten Python, aber hier gibt es keine solche Spracheinschränkung.
In einem Monat werde ich die Antwort mit den meisten Stimmen annehmen
Beispielausgabe:
1
2
Fizz
Jazz
Buzz
Fizz
7
Jazz
Fizz
Buzz
11
FizzJazz
13
14
FizzBuzz
Jazz
17
Fizz
19
JazzBuzz
Fizz
22
23
FizzJazz
Buzz
26
Fizz
Jazz
29
FizzBuzz
31
Jazz
Fizz
34
Buzz
FizzJazz
37
38
Fizz
JazzBuzz
41
Fizz
43
Jazz
FizzBuzz
46
47
FizzJazz
49
Buzz
Fizz
Jazz
53
Fizz
Buzz
Jazz
Fizz
58
59
FizzJazzBuzz
61
62
Fizz
Jazz
Buzz
Fizz
67
Jazz
Fizz
Buzz
71
FizzJazz
73
74
FizzBuzz
Jazz
77
Fizz
79
JazzBuzz
Fizz
82
83
FizzJazz
Buzz
86
Fizz
Jazz
89
FizzBuzz
91
Jazz
Fizz
94
Buzz
FizzJazz
97
98
Fizz
JazzBuzz
quelle
Antworten:
Die schönste Version, sagst du? Dann probieren wir diesen in ...
Shakespeare-Programmiersprache
Nachdem ich hier mit SPL zu kämpfen hatte , hatte ich das Gefühl, dass ich bei jeder Herausforderung mindestens eine Einreichung damit machen musste. Und das ist es.
Also, was ist das alles dann?
Also deklarieren wir zuerst die Variablen, die wir im gesamten Programm verwenden werden und die aus Shakespeare-Stücken stammen müssen. Ich hatte die Nase voll von Romeo, Julia, Ophelia und Othello und ging mit dem Erzbischof von Canterbury und Lady Capulet hinauf . Ihre Beschreibungen sowie die Acts / Scenes-Titel werden vom Parser ignoriert, sodass Sie so ziemlich alles dort ablegen können, was Sie möchten.
Lassen Sie uns also einen König der Übersetzung zu etwas machen, das ein bisschen weniger Kauderwelsch ist .
Akt I, Szene I
Begin Lady Capulet = 0;
Act I ist ziemlich einfach: Wir initialisieren unsere Variable mit 0.
Akt I, Szene II
Lady Capulet += 1; if(Lady Capulet < Math.pow((2*2*1+1)*(2*1),2)) continue; else goto Scene VIII;
Wir erhöhen den Wert von Lady Capulet und vergleichen ihn mit 100 (ja, dieser ganze Satz dient nur dazu, die Zahl 100 zu erhalten). wenn es nicht kleiner ist, springen wir zu Szene VIII (das Ende); ansonsten fahren wir mit der nächsten Szene fort.
Akt I, Szene III
if(Lady Capulet % (2+1) == 0) continue; else goto Scene IV; The Archbishop of Canterbury = 2*2*2*2*2*2*1; System.out.print((char)The Archbishop of Canterbury); The Archbishop of Canterbury += 2*2*2*2*2*1; The Archbishop of Canterbury += 2*1+1; System.out.print((char)The Archbishop of Canterbury); The Archbishop of Canterbury += 2*2*2*2*1+1; System.out.print((char)The Archbishop of Canterbury); System.out.print((char)The Archbishop of Canterbury);
Zuerst sehen wir, ob der Modul der Division durch 3 0 ist; wenn nicht, springen wir zu Szene IV; Wenn dies der Fall ist, beginnen wir mit arithmetischen Operationen und speichern sie auf dem Archieperson. Sobald wir die gesuchte gefunden haben, geben wir sie in Zeichenform aus. Ja, am Ende ist die Idee zu bekommen
Fizz
.Akt I, Szene IV
if(Lady Capulet % (2*2) == 0) continue; else goto Scene V; The Archbishop of Canterbury = 2*2*2*2*2*2*1+2*2*1+2*1; System.out.print((char)The Archbishop of Canterbury); The Archbishop of Canterbury += 2*2*2*1; The Archbishop of Canterbury += 2*2*1+(-1); System.out.print((char)The Archbishop of Canterbury); The Archbishop of Canterbury += 2*2*2*2*1+2*2*2*1; The Archbishop of Canterbury += 1; System.out.print((char)The Archbishop of Canterbury); System.out.print((char)The Archbishop of Canterbury);
Überprüft zuerst, ob der Modul der Division durch 4 0 ist, und setzt dann die gleiche Szene wie zuvor fort, z
Jazz
.Akt I, Szene V
if(Lady Capulet % (2*2+1) == 0) continue; else goto Scene VI; The Archbishop of Canterbury = 2*2*2*2*2*2*1+2*1; System.out.print((char)The Archbishop of Canterbury); The Archbishop of Canterbury += 2*2*2*2*2*1; The Archbishop of Canterbury += 2*1+1; The Archbishop of Canterbury += 2*2*2*2*1; System.out.print((char)The Archbishop of Canterbury); The Archbishop of Canterbury += 2*2+1; System.out.print((char)The Archbishop of Canterbury); System.out.print((char)The Archbishop of Canterbury); goto Scene VII;
Funktioniert wie in den beiden vorhergehenden, prüft, ob der Modul der Division durch 5 0 ergibt, und versucht dann zu schreiben
Buzz
; Der einzige Unterschied ist, dass wir am Ende eine Szene überspringen.Akt I, Szene VI
System.out.print(Lady Capulet);
Um diese Szene zu erreichen, darf die von Lady Capulet angenommene Zahl weder Fizz noch Jazz oder Buzz gewesen sein. Also geben wir es in numerischer Form aus.
Akt I, Szene VII
The Archbishop of Canterbury = 2*2*2*1+2*1; System.out.print((char)The Archbishop of Canterbury); The Archbishop of Canterbury += 2*1+1; System.out.print((char)The Archbishop of Canterbury); goto Scene II;
Dies ist also die einzige Möglichkeit, in die nächste Zeile zu springen: Zuerst einen CR, dann einen LF ausgeben; dann kehren wir zu szene ii zurück, um mit dem programm fortzufahren.
Akt I, Szene VIII
End.
Einfach genug.
Ich versuche immer noch zu sehen, ob ich dies online zeigen kann, aber ich kann keinen Online-Compiler finden - der, den ich kenne , scheint sich mit keinem anderen Programm als dem bereits geladenen gut kombinieren zu lassen, oder vielleicht gibt es irgendein Programm von Problem mit der Schnittstelle zwischen der Tastatur und dem Stuhl ...
Update 1:
Nach Mathemandans Kommentar habe ich die Reihenfolge der Szenen von Jazz und Buzz geändert. Es musste getan werden.
quelle
z
und ihn vor jeder Schleife zurücksetzen.> <> (Fisch)
> <> ist eine 2D-Programmiersprache, in der Anweisungen einzelne Zeichen sind und der Anweisungszeiger (IP) sich je nach Pfeilen
^>v<
und Spiegeln nach oben, unten, links oder rechts bewegen kann/\
. Es gibt keine Variablen oder Strings, so dass es ein bisschen schwieriger ist, sich nicht zu wiederholen, aber ich denke, das ist auf seine eigene Art schön.Wir schieben
1
und starten die Schleife.:9b*)?;
prüft, ob die Zahl größer als 99 (9b* = 9*11
) ist, und wenn ja, stoppt das Programm;
. Andernfalls setzen Sie eine 0 in das Register und bewegen Sie sichv
in den wellenförmigen Teil.:3%?
prüft die Zahl modulo 3. Wenn sie ungleich Null ist, gehen wirv
eine Reihe runter und bewegen uns nach links<
. Andernfalls überspringen wir den Abwärtspfeil und drücken"Fizz"
, drucken ihn (r}oooo
) und erhöhen das Register (&1+&
), bevor wir von den rechten Wandspiegeln abprallen, um eine Reihe nach unten zu springen. In beiden Fällen bewegen wir uns in der dritten Reihe nach links, bis wir von den linken Wandspiegeln abprallen. Dann wiederholen wir fürJazz
undBuzz
.Dies wird bis zur 7. Zeile fortgesetzt, in der der
&
Wert des Registers überprüft wird. Wenn es nicht Null ist, gehen wir einfach runter. Andernfalls drucken wir die Nummer selbst aus,n
bevor wir nach unten gehen.Zum Schluss
ao
(denken Sie daran, wir bewegen uns jetzt nach links!) Wird eine ASCII-Zeile gedruckt und1+
die Zahl erhöht, bevor wir nach oben gehen^
und die Schleife>
wiederholen.(Jetzt warten wir auf eine ästhetische Antwort von Piet ...)
quelle
LOLCODE
Elegant? Nee. Effizient? Definitiv nicht. Schön? Nun, Sie wissen, was sie sagen: Schönheit liegt im Auge des Betrachters.
Einige Erklärungen:
LOLCODE-Programme beginnen mit
HAI
und enden mitKTHXBYE
.Variablen werden dynamisch typisiert und mit zugewiesen
I HAS A <variable> ITZ <value>
. Einmal definiert, können Variablen auch mit zugewiesen werden<variable> R <value>
.Loops in LOLCODE werden benannt. Die Syntax lautet:
Dies ist nur Internet für "Schleife bis i = Ende" sprechen. In LOLCODE 1.2 muss die Indexvariable vor der Schleife initialisiert werden. Hier wird die Schleife "house" genannt, weil das Lesen der Schleifeninitialisierung humorvoll klingt.
VISIBLE
druckt auf stdout. Standardmäßig wird eine neue Zeile angehängt, aber das Hinzufügen!
unterdrückt die neue Zeile.Bedingungen werden wie folgt angegeben:
Bedingungen müssen entweder Ausdrücke sein, die zu einem Booleschen Wert oder zu einem Booleschen Wert ausgewertet werden. In LOLCODE wird der Boolesche Typ aufgerufen
TROOF
und verfügt über die WerteWIN
(true) undFAIL
(false).Einzeilige Kommentare beginnen mit
BTW
.Sie beherrschen die Sprache des Internets nicht? Lassen Sie es mich einfach wissen und ich werde Ihnen gerne weitere Erklärungen geben.
quelle
Python3
quelle
Efficiency of division/modulus operations
(3, 4, 5)
. Es wird dreimal dupliziert. Dies ist die einzige Top-Antwort mit nur einem einzigen Moduloperator.DRY
stattdessen beziehen sollen . Darüber hinaus ist diese Antwort vom OP verfasst.Piet
Ich beschloss, mit Piet zu spielen und zu sehen, wie schön ein Code ist, den ich machen kann. Ich versuche hier nichts zu wiederholen, obwohl ich, um ehrlich zu sein, die Mod-Berechnungen wiederholen muss. Jede einzelne Modifikation (n% 3, n% 4 und n% 5) wird jedoch nur einmal pro Code-Iteration ausgeführt.
Das kleinere Bild ist die richtige Quelle und kann hier hochgeladen und ausgeführt werden .
Genießen!
quelle
Mathematica
In Mathematica können Sie Funktionen für sehr spezifische Parameter definieren und überladen (nicht nur nach Typ, sondern auch nach beliebigen logischen Bedingungen). Definieren wir ein paar Funktionen:
Und jetzt ist das eigentliche Programm nur
Jetzt, wo das Obige nur linear mit der Anzahl der Teiler wächst, ist es immer noch nicht sehr TROCKEN. Aber wir können tatsächlich Variablen als Namen in diesen Definitionen verwenden. Wir können also eine Funktion schreiben, die diese Funktionsdefinitionen erzeugt:
Jetzt müssen Sie nur noch einen
addFunction
Anruf tätigen und Ihren neuen Anruf**zz
in die letzte Zeile einfügen.quelle
DoThe @@@ Time @@@ Warp @@@ Again /@ Range[100] // TableForm
JMP
nach links!Haskell
Ihr nehmt den DRY nicht ernst. Es gibt offensichtliche Muster, die in der Sequenz "Fizz Jazz Buzz" herausgerechnet werden können.
Dieser Code ist auch leicht erweiterbar. Um das "Fizz Jazz Buzz Tizz" -Problem zu lösen, müssen Sie nur
Ti
nach demBu
in der Zeichenfolge hinzufügen . Dies ist viel weniger als bei allen anderen Lösungen erforderlich.quelle
fizzes = zip [3..] $ ((++ replicate 2 'z') <$> words "Fi Ja Bu") ++ ["Sausage"]
oder einfach zurückkehrenfizzes = zip [3..] $ words "Fizz Jazz Buzz Sausage"
.replicate 2 z
streckt es ein bisschen. . .Excel VBA
Es klingt vielleicht dumm, aber es ist ein 2D-Scharfschützengewehr!
quelle
Java
Java wird von den meisten nicht wirklich als "schön" angesehen, aber das ist verrückt subjektiv, also habe ich mich an die Richtlinien in der Frage gehalten:
Das heißt nicht, dass der Algorithmus insgesamt am effizientesten ist (nicht), aber ich denke, er trifft die Aufzählungspunkte gut.
quelle
7 informieren
Inform 7 ist eine regelbasierte Programmiersprache für interaktive Belletristik. Es ist bemerkenswert, dass es eine der erfolgreichsten natürlichen Programmiersprachen ist. Siehe die Inform 7 Sprache Vitrine für andere Beispiele und ein paar Bits von Nebensächlichkeiten.
Dieser Code hat den Vorteil, dass jede der FizzBuzz-Regeln völlig unabhängig ist: Zusätzliche Regeln können jederzeit hinzugefügt werden, ohne dass das allgemeine Framework geändert werden muss. Leider ist es ein wenig repetitiv, besonders bei den Definitionsphrasen. Ich könnte einen% -Operator definieren, aber dann wäre es nicht Englisch. ;)
Dieser Code kann online mit Playfic ausgeführt werden .
quelle
Dyalog APL
items
Kann in eine beliebige Liste von Nummern geändert werdenquelle
⎕ML
und⎕IO
?1
, was die Standardeinstellung ist.C #
Überprüfe den Mod, baue den String, drucke die Nummer wenn leer oder den String wenn nicht. Keine Wiederholungen. Müssen nur Bedingung & Ausgabe für neue Anforderungen hinzufügen.
quelle
i
-%
-etwas mehrmals und hängt es auchs
mehrmals an. (Viele der Syntax wiederholen sich auch, aber das ist wahrscheinlich C # Schuld.)Python 2.7
Ich habe versucht, es poetisch zu machen ...
Ich bin nicht sehr gut in Liebesdichtung ...
Es wäre auch viel besser ohne die Anfangskonstanten: P
quelle
TypeError: 'str' object is not callable
.Java mit Klassen
Der Algorithmus:
Die Klassen:
quelle
MATLAB / Octave
Natürlich macht es Programmierern Spaß, eigene Schleifen zu schreiben, aber jeder weiß, wie mühsam es ist, die Indizierung wirklich im Auge zu behalten (wer hat nicht
for(j=i;j<n;i++)
mindestens einmal in seinem Leben in einer verschachtelten Schleife geschrieben ?)MATLAB hat die Lösung. In der Tat ist dieser Code nicht der effizienteste und mit Sicherheit auch nicht codegolfingfähig, aber er ist auf jeden Fall ein gutes Beispiel für die interessanteren Funktionen von MATLAB. Octave ist die GNU-Version von MATLAB; es ist jedoch nicht für Code-Golf geeignet, da es bei variablen Typen etwas strenger ist, was für Code-Golf nachteilig ist.
BEARBEITEN: Bis die Syntaxhervorhebung für MATLAB in SE vorhanden ist, veröffentliche ich eine Version mit sehr wenigen Kommentaren, da es sich ansonsten nur um einen großen, beängstigenden Klartextblock handelte.
quelle
for(j=i;j<n;i++)
? Meine Frage ist: Wer hat das "mindestens einmal in ihrem Leben" geschrieben? Wenn Sie das getan haben, habe ich schlechtes neues für Sie ...for
Schleife erhöht (z. B. beim Verschachteln von Schleifen)? Sind Sie der Typ, dessen Code jedes Mal erfolgreich kompiliert wird? Wenn Sie sind, habe ichj
Name für eine lokale Schleifenvariable ist in Ordnung, aber deri
Name ist eine sehr schlechte Übung, und das ist die Quelle Ihres Fehlers. Es ist nicht rein zufällig :)Python
Das ist natürlich viel zu lang. Gnibbler-Lösung ist viel besser. (obwohl das Ersetzen
*..., sep=''
durch''.join
schöner wäre)Dies ist jedoch in Bezug auf Divisions- / Moduloperationen sehr effizient.
quelle
sorted(lst)
, warum setzen Sie es nicht einfach in die Reihenfolge, die Sie benötigen, wenn Sie es definieren?lst.sort()
Rubin
quelle
Haskell
Noch eine andere Lösung ohne Teilung oder Modul.
fjb
Erstellt eine unendliche Liste von Fizzes, Jazzes, Buzzes und / oder Zahlen.take
Beliebige Anzahl, wie inprint100fjb
den ersten 100 Elementen angezeigt.quelle
SQL (MySQL)
Dabei ist I eine Tabelle mit einer Spalte (ID INT), die die 100 Ganzzahlen enthält.
Ich kenne keine SQL-Variante, mit der ich die Tabelle leicht generieren oder VALUES als Unterabfragen verwenden kann, wodurch sie viel besser und vollständiger wird.
quelle
SELECT @i:= (@i + 1) FROM mysql.help_relation, (SELECT @i:=0) v WHERE @i < 100;
SELECT DISTINCT help_keyword_id FROM mysql.help_relation WHERE help_keyword_id>0 AND help_keyword_id<=100
auch funktioniert. Wenn jedoch 100 in 10000 geändert wird, sind beide fehlerhaft.Rubin
quelle
JavaScript
Vielleicht nicht der effizienteste Weg, aber ich finde es einfach und hübsch <3
Moar trocken und effin hässlich: C
quelle
JavaScript
DRYish ...;)
quelle
Äußerst dummes C #
Die Hälfte des Briefs war "NICHT WIEDERHOLEN", also habe ich das so wörtlich wie möglich mit C # genommen und das hat sich versehentlich zum Golfen des Codes entwickelt. Dies ist mein erstes Golf und ich habe es in C # gemacht, dumm, ich weiß, aber hier ist das Ergebnis:
Golf (
240232230 Zeichen):Ungolfed:
Ziel war es, alles zu verkürzen, was ich mehr als einmal verwenden musste, und im Allgemeinen den Code kurz zu halten, während ich ein vollständiges C # -Programm erstellte. Dazu müssen Sie VisualStudio verwenden und das StartUp-Objekt auf 'P' setzen. Außerdem müssen Sie im Debugging-Ausgabefenster nach der Ausgabe suchen.
Hier gibt es einige gravierende Einschränkungen:
quelle
Python 2
Ich wollte eine Antwort darauf in ein ordentliches Python schreiben, das die Merkmale der Sprache hervorhebt, dem DRY-Prinzip entspricht und ziemlich lesbar ist.
Dieses kleine Beispiel zeigt Slicing, den
in
Operator und die ausführliche, aber verständliche ternäre Syntax. Der Modulo-Operator wird überhaupt nicht verwendet. Es ist nicht auf Laufzeiteffizienz ausgelegt, aber das war nicht das Ziel. Es soll kurz, verständlich und wartbar sein.quelle
set(group[...])
in den Regeln verwenden?Python 2.7, 111 Byte
Dies ist mein erster Beitrag. Ich habe versucht, einige Python-Codegolf-Tricks anzuwenden (String-Interleaving, Tupel-Index-Zugriff statt
if
). Wenn Sie Vorschläge haben, teilen Sie diese bitte mit!Ausgabe :
Ich konnte das DRY-Prinzip auch nicht vollständig anwenden, da es zwei
for
Schleifen gibt. Es gibt wahrscheinlich einen intelligenteren Weg, dies zu tun!quelle
for
Anweisung verwenden. Wird aktualisiert, wenn ich kann!Gehen
Der gleichzeitige FizzJazzBuzzer
Versuchen Sie es hier: http://play.golang.org/p/lxaZF_oOax
Es wird nur ein Modul pro überprüfter Zahl verwendet und kann beliebig auf eine beliebige Anzahl von, gut ... Zahlen erweitert werden.
Sie müssen nur 3 verschiedene Stellen ändern, um dies zu erweitern, in der
hooks
Karte denFizzJazzBuzzer
Funktionsnamen und natürlich den Aufruf derFizzJazzBuzzer
Funktion.quelle
R
Dadurch wird eine Funktion erstellt, mit der ein Benutzer Wort- und Teilerpaare (und optional eine maximale Anzahl mit 100 als Standard) angeben kann. Die Funktion erstellt einen Vektor von 1 bis zur maximalen Zahl, ersetzt dann alle Zahlen an den "Fizzbuzz" -Positionen durch "" und fügt schließlich jedes Wort an der gewünschten Position ein. Die Funktion ordnet die Liste von der niedrigsten zur höchsten Zahl, so dass die niedrigste Zahl immer der erste Teil des "Fizzbuzz" ist. Die Positionen werden berechnet, indem
seq
ein Vektor erstellt wird, der bei einer bestimmten Zahl beginnt und in Schritten von dieser Zahl zunimmt, bis die maximal gewünschte Zahl erreicht ist.Ich finde es nicht sehr schön, aber es ist einfach mit verschiedenen Parametern wiederzuverwenden.
Anwendungsbeispiele:
Die Ausgabe von
fizzbuzzer(fizz=3, buzz=5)
ist:(Zahlen in eckigen Klammern sind die Indizes des Vektors, den die Funktion ausgibt)
quelle
Haskell
Es wird keine modulare Arithmetik verwendet, es sei denn, es wird das am wenigsten verbreitete Vielfache berechnet, um unnötige Wiederholungen zu vermeiden. Die Verkettung der Zeichenfolgen muss nur 60 Mal durchgeführt werden, unabhängig davon, auf welche Obergrenze wir sie festgelegt haben.
Durch Ersetzen
fjbLcm
mitfjb
wird genau das Gleiche erreicht, wobei außer in[1..100]
und keine Arithmetik verwendet wirdtake
.quelle
Python2
Update: Neue Version verwendet keine Mod- oder Divisionsoperationen.
Wenn Sie dem Test ein weiteres Wort hinzufügen möchten, werfen Sie das Schlüssel / Wert-Paar einfach in das word_dict-Wörterbuch:
Wenn Sie ein Wort entfernen möchten, löschen Sie es einfach (mit
del
) oder setzen Sie es auf''
.Siehe auch die Python-Antworten von Gnibbler und Jakube , die vor mir gepostet wurden.
quelle
C #
Wartbarkeit:
Fügen Sie einfach eine Zeile pro Element hinzu, das ich über jedes Element im Wörterbuch iteriere, um zu überprüfen, ob es ein Teiler der aktuellen Zahl ist, und fügen Sie der Zeichenfolge hinzu, wenn dies der Fall ist.
Wenn Sie fertig sind, drucken Sie die Zeichenfolge, es sei denn, sie ist immer noch null (mit dem Nullkoaleszenzoperator). In diesem Fall drucken Sie die Zahl plus eine leere Zeichenfolge, um sie zu einer Zeichenfolge zu machen. (Ich könnte toString verwenden, aber ich denke, das ist eine persönliche Wahl)
quelle