Einführung
In unserem jüngsten Bestreben, Kataloge mit kürzesten Lösungen für Standard-Programmierübungen zu sammeln, ist dies die erste Vanille-FizzBuzz-Herausforderung von PPCG. Wenn Sie andere Katalogherausforderungen sehen möchten, gibt es "Hallo Welt!" und "Ist diese Zahl eine Primzahl?" .
Herausforderung
Schreiben Sie ein Programm, das die Dezimalzahlen von 1 bis einschließlich 100 ausgibt. Bei einem Vielfachen von drei wird "Fizz" anstelle der Zahl und bei einem Vielfachen von fünf "Buzz" gedruckt. Bei Zahlen, die ein Vielfaches von drei und fünf sind, wird „FizzBuzz“ gedruckt.
Ausgabe
Die Ausgabe besteht aus einer Liste von Zahlen (und Fizzes, Buzzes und FizzBuzzes), die durch einen Zeilenumbruch (entweder \n
oder \r\n
) getrennt sind. Ein abschließender Zeilenumbruch ist akzeptabel, ein führender Zeilenumbruch jedoch nicht. Abgesehen von Ihrer Wahl von newline sollte die Ausgabe genau so aussehen:
1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
FizzBuzz
16
17
Fizz
19
Buzz
Fizz
22
23
Fizz
Buzz
26
Fizz
28
29
FizzBuzz
31
32
Fizz
34
Buzz
Fizz
37
38
Fizz
Buzz
41
Fizz
43
44
FizzBuzz
46
47
Fizz
49
Buzz
Fizz
52
53
Fizz
Buzz
56
Fizz
58
59
FizzBuzz
61
62
Fizz
64
Buzz
Fizz
67
68
Fizz
Buzz
71
Fizz
73
74
FizzBuzz
76
77
Fizz
79
Buzz
Fizz
82
83
Fizz
Buzz
86
Fizz
88
89
FizzBuzz
91
92
Fizz
94
Buzz
Fizz
97
98
Fizz
Buzz
Die einzige Ausnahme von dieser Regel ist die konstante Ausgabe des Interpreters Ihrer Sprache, die nicht unterdrückt werden kann, z. B. eine Begrüßung, ANSI-Farbcodes oder Einrückungen.
Weitere Regeln
Hierbei geht es nicht darum, die Sprache mit dem kürzesten Ansatz für das Spielen von FizzBuzz zu finden, sondern darum, den kürzesten Ansatz in jeder Sprache zu finden. Daher wird keine Antwort als angenommen markiert.
Einreichungen werden in Bytes in einer geeigneten, bereits vorhandenen Codierung bewertet, normalerweise (aber nicht unbedingt) UTF-8. Einige Sprachen, wie Ordner, sind etwas schwierig zu bewerten - im Zweifelsfall fragen Sie bitte bei Meta nach.
In STDERR kann nichts gedruckt werden.
Im Gegensatz zu unseren üblichen Regeln können Sie eine Sprache (oder Sprachversion) auch dann verwenden, wenn diese neuer als diese Herausforderung ist. Wenn jemand dies missbrauchen möchte, indem er eine Sprache erstellt, in der das leere Programm eine FizzBuzz-Ausgabe generiert, dann herzlichen Glückwunsch, dass er den Weg für eine sehr langweilige Antwort ebnet.
Beachten Sie, dass ein Dolmetscher vorhanden sein muss, damit die Einreichung getestet werden kann. Es ist erlaubt (und sogar empfohlen), diesen Dolmetscher für eine zuvor nicht implementierte Sprache selbst zu schreiben.
Wenn Ihre bevorzugte Sprache eine triviale Variante einer anderen (möglicherweise populäreren) Sprache ist, die bereits eine Antwort hat (denken Sie an BASIC- oder SQL-Dialekte, Unix-Shells oder triviale Brainfuck-Derivate wie Alphuck und ???), sollten Sie eine Anmerkung zur vorhandenen hinzufügen antworte, dass die gleiche oder eine sehr ähnliche Lösung auch in der anderen Sprache die kürzeste ist.
Da die Ausgabe fest ist, können Sie die Ausgabe fest codieren (dies ist jedoch möglicherweise nicht die kürzeste Option).
Sie können bereits vorhandene Lösungen verwenden, sofern Sie den ursprünglichen Autor des Programms angeben.
Standardlücken sind ansonsten nicht zulässig.
Bitte stimmen Sie langweiligen (aber gültigen) Antworten in Sprachen nicht ab, in denen es nicht viel zum Golfen gibt. Diese sind für diese Frage nach wie vor hilfreich, da versucht wird, einen Katalog so vollständig wie möglich zusammenzustellen. Stimmen Sie Antworten jedoch in erster Linie in Sprachen ab, in denen die Autoren tatsächlich Anstrengungen unternehmen mussten, um den Code zu entwickeln.
Katalog
var QUESTION_ID=58615;var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe";var COMMENT_FILTER="!)Q2B_A2kjfAiU78X(md6BoYk";var OVERRIDE_USER=30525;var answers=[],answers_hash,answer_ids,answer_page=1,more_answers=true,comment_page;function answersUrl(index){return"https://api.stackexchange.com/2.2/questions/"+QUESTION_ID+"/answers?page="+index+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function commentUrl(index,answers){return"https://api.stackexchange.com/2.2/answers/"+answers.join(';')+"/comments?page="+index+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+COMMENT_FILTER}function getAnswers(){jQuery.ajax({url:answersUrl(answer_page++),method:"get",dataType:"jsonp",crossDomain:true,success:function(data){answers.push.apply(answers,data.items);answers_hash=[];answer_ids=[];data.items.forEach(function(a){a.comments=[];var id=+a.share_link.match(/\d+/);answer_ids.push(id);answers_hash[id]=a});if(!data.has_more)more_answers=false;comment_page=1;getComments()}})}function getComments(){jQuery.ajax({url:commentUrl(comment_page++,answer_ids),method:"get",dataType:"jsonp",crossDomain:true,success:function(data){data.items.forEach(function(c){if(c.owner.user_id===OVERRIDE_USER)answers_hash[c.post_id].comments.push(c)});if(data.has_more)getComments();else if(more_answers)getAnswers();else process()}})}getAnswers();var SCORE_REG=/<h\d>\s*([^\n,<]*(?:<(?:[^\n>]*>[^\n<]*<\/[^\n>]*>)[^\n,<]*)*),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/;var OVERRIDE_REG=/^Override\s*header:\s*/i;function getAuthorName(a){return a.owner.display_name}function process(){var valid=[];answers.forEach(function(a){var body=a.body;a.comments.forEach(function(c){if(OVERRIDE_REG.test(c.body))body='<h1>'+c.body.replace(OVERRIDE_REG,'')+'</h1>'});var match=body.match(SCORE_REG);if(match)valid.push({user:getAuthorName(a),size:+match[2],language:match[1],link:a.share_link,});else console.log(body)});valid.sort(function(a,b){var aB=a.size,bB=b.size;return aB-bB});var languages={};var place=1;var lastSize=null;var lastPlace=1;valid.forEach(function(a){if(a.size!=lastSize)lastPlace=place;lastSize=a.size;++place;var answer=jQuery("#answer-template").html();answer=answer.replace("{{PLACE}}",lastPlace+".").replace("{{NAME}}",a.user).replace("{{LANGUAGE}}",a.language).replace("{{SIZE}}",a.size).replace("{{LINK}}",a.link);answer=jQuery(answer);jQuery("#answers").append(answer);var lang=a.language;lang=jQuery('<a>'+lang+'</a>').text();languages[lang]=languages[lang]||{lang:a.language,lang_raw:lang.toLowerCase(),user:a.user,size:a.size,link:a.link}});var langs=[];for(var lang in languages)if(languages.hasOwnProperty(lang))langs.push(languages[lang]);langs.sort(function(a,b){if(a.lang_raw>b.lang_raw)return 1;if(a.lang_raw<b.lang_raw)return-1;return 0});for(var i=0;i<langs.length;++i){var language=jQuery("#language-template").html();var lang=langs[i];language=language.replace("{{LANGUAGE}}",lang.lang).replace("{{NAME}}",lang.user).replace("{{SIZE}}",lang.size).replace("{{LINK}}",lang.link);language=jQuery(language);jQuery("#languages").append(language)}}
body{text-align:left!important}#answer-list{padding:10px;width:290px;float:left}#language-list{padding:10px;width:290px;float:left}table thead{font-weight:700}table td{padding:5px}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"> <div id="language-list"> <h2>Shortest Solution by Language</h2> <table class="language-list"> <thead> <tr><td>Language</td><td>User</td><td>Score</td></tr> </thead> <tbody id="languages"> </tbody> </table> </div> <div id="answer-list"> <h2>Leaderboard</h2> <table class="answer-list"> <thead> <tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr> </thead> <tbody id="answers"> </tbody> </table> </div> <table style="display: none"> <tbody id="answer-template"> <tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr> </tbody> </table> <table style="display: none"> <tbody id="language-template"> <tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr> </tbody> </table>
quelle
Nothing can be printed to STDERR.
Trifft dies nur beim Ausführen oder auch beim Kompilieren zu (vorausgesetzt, dies ist ein separater Schritt?)Antworten:
Python 2, 56
quelle
i=1;exec"print'FizzBuzz'[i%-3&4:12&8-i%5]or i;i+=1;"*100
. Möchte jemand Suchausdrücke brachial erzwingen, um das Bit-Bashing zu optimieren?Hexagony , 91 Bytes
Danke für das Kopfgeld :)
Wow, ich hätte nie gedacht, dass ich Martins Hexagony-Lösung schlagen könnte . Aber - wer hätte das gedacht - ich habe es geschafft. Nach mehreren Tagen des Scheiterns, weil ich weder den Hexagony-Farbstoff noch das EsotericIDE hatte , um meine Lösung zu überprüfen. Ich habe einige Aspekte der Spezifikation falsch verstanden, deshalb habe ich ein paar falsche „Lösungen“ nur mit Stift und Papier und einem Texteditor erstellt. Nun, endlich habe ich meine Faulheit überwunden und beide Repositories geklont, VisualStudio heruntergeladen und kompiliert. Wow, was für nützliche Werkzeuge das sind! Wie Sie sehen, bin ich weit davon entfernt, jemand zu sein, den Sie als Programmierer bezeichnen würden (ich meine, komm schon! Ich hatte nicht einmal VisualStudio installiert und hatte so gut wie keine Ahnung, wie man ein Programm kompiliert);)
Ich habe noch eine Weile gebraucht, um eine funktionierende Lösung zu finden, und es ist ziemlich voll und chaotisch, aber hier ist es in seiner ganzen Pracht:
Fizzbuzz in einem Sechseck der Größe 6:
Sechseckiges Layout:
Und die schöne Wiedergabe dank Timwis Hexagony Colorer :
Hier ist also eine 110 Sekunden lange GIF-Animation mit 2 fps, die den Programmfluss während der ersten 6 Zahlen
1, 2, Fizz, 4, Buzz, Fizz
und die ersten 220 Ticks des Programms zeigt (klicken Sie auf das Bild, um es in voller Größe zu sehen):Meine Güte, dank der Natron-Compositing-Software war die Animation des Zeigers noch mühsam zu erstellen, aber überschaubar. Das Speichern von 260 Bildern des Speichers war weniger amüsant. Leider kann EsotericIDE das nicht automatisch tun. Wie auch immer, viel Spaß mit der Animation!
Schließlich ist Hexagony gar nicht so schwer zu bearbeiten, wenn Sie sich erst einmal mit dem Gedächtnismodell und dem eher intuitiven Umschließen von Pfaden befasst haben, die die Grenzen des Sechsecks überschreiten. Aber Golfen kann ein Schmerz im Hintern sein. ;)
Es hat Spaß gemacht!
quelle
3}1"$.!$>)}g4_'{$))}\<$\.\.@\;F\$/;z;u;<%<_>_..$>B/<>}))'%<>{>;e"-</_%;\/{}/>.\)(z;i;..>('
einfügen, wie. Jetzt gibt es einen zusätzlichen (nach dem z, das mit a "annulliert" werden kann) oder indem man das z dorthin setzt. Jetzt ist es a), das alle Befehle auf dem orangefarbenen Pfad 1 Tick später drückt und mit dem No-Op zurückkommt, das in Zeile 3 war. Übrigens habe ich Visual Studio nur aufgrund von Hexagony Colorer und Esoteric IDE installiert: PLabyrinth , 94 Bytes
Sub-100! Dies war ein Spaß.
Erläuterung
Beginnen wir mit einer kurzen Einführung in Labyrinth - überspringen Sie diese, wenn Sie bereits mit den Grundlagen vertraut sind:
Labyrinth hat zwei Stapel - einen Hauptstapel und einen Hilfsstapel. Beide Stapel haben eine unendliche Anzahl von Nullen am unteren Rand, z. B.
+
bei einem leeren Stapel werden zwei Nullen addiert, wodurch Null gedrückt wird.Der Kontrollfluss im Labyrinth wird durch Kreuzungen bestimmt, die oben im Stapel nachsehen, um zu bestimmen, wohin sie als nächstes führen. Negativ bedeutet links abbiegen, Null bedeutet geradeaus und Positiv bedeutet rechts abbiegen ... aber wenn wir gegen eine Wand stoßen, kehren wir die Richtung um. Wenn zum Beispiel nur geradeaus und links abbiegen möglich sind, aber die Spitze des Stapels positiv ist, dann biegen wir stattdessen links ab, da wir nicht rechts abbiegen können.
Zahlen im Labyrinth knallen
x
und drücken10*x + <digit>
, wodurch es einfach ist, große Zahlen aufzubauen. Dies bedeutet jedoch, dass wir eine Anweisung zum Drücken von 0 benötigen, um eine neue Zahl zu beginnen, die sich_
im Labyrinth befindet.Kommen wir nun zum eigentlichen Code!
rot
Die Ausführung beginnt
"
in der oberen linken Ecke, die ein NOP ist. Als nächstes wird)
der obere Teil des Stapels inkrementiert, indem beim ersten Durchgang 1 gedrückt undn
bei jedem folgenden Durchgang inkrementiert wird.Als nächstes duplizieren wir
n
mit:
. Da diesn
positiv ist, biegen wir nach rechts ab und führen die Befehle}
(Verschieben des oberen Bereichs des Hauptstapels nach AUX) und aus:
. Wir schlagen eine Sackgasse, so dass wir umdrehen und ausführen}
und:
wieder, so dass die Stapel wieIst wieder
n
positiv und wir biegen rechts ab und führen_101/
dasn
durch 101 dividierte aus. Wennn
dann 101 istn/101 = 1
, biegen wir in das ein@
, was das Programm beendet. Ansonsten ist unsere aktuelle SituationOrange 1 (Mod 3)
3
verwandelt die obere Null in eine 3 (10*0 + 3 = 3
) und%
führt ein Modulo aus. Wennn%3
positiv, biegen wir rechts ab in die gelbe"
. Ansonsten führen wir aus70.105.122:..
, welche AusgängeFizz
. Beachten Sie, dass wir in diesem Fall keine neuen Nullen mit pushen müssen,_
da diesn%3
Null war, sodass wir die unendlichen Nullen am unteren Rand des Stapels ausnutzen können. Beide Wege treffen sich hellblau wieder.Hellblau
Die Spitze des Stapels ist momentan
n%3
, was positiv sein könnte, also_;
drückt der einfach eine Null und wirft sie sofort auf, um sicherzustellen, dass wir geradeaus gehen, anstatt in die umzudrehen@
. Wir=
tauschen dann die Oberseiten des Haupt- und des Hilfsstapels aus, um Folgendes zu erhalten:Orange 2 (Mod 5)
Dies ist eine ähnliche Situation wie zuvor, mit der Ausnahme, dass nur
66.117.122:..
ausgegeben wird,Buzz
wennn%5
Null ist.Dunkelblau
Der vorherige Abschnitt lässt die Stapel mögen
{
verschiebt denn%3
Rücken zum Hauptstapel und*
multipliziert die beiden Module.Wenn eines der beiden Module Null ist, ist das Produkt Null, und wir gehen direkt zu Gelb über.
=
tauscht die Oberseite der Stapel und_
drückt eine Null, um sicherzustellen, dass wir geradeaus gehen und gebenWenn andernfalls beide Module ungleich Null sind, ist das Produkt ungleich Null und wir biegen rechts in grün ab.
=
tauscht die Oberseiten der Stapel und gibtwonach wir verwenden
:
zu duplizierenn
, biegen Sie rechts ab, dann verwenden Sie!
die Ausgaben
.Lila
Zu diesem Zeitpunkt verfügt der Hauptstapel über ein oder zwei Elemente, je nachdem, welcher Pfad genommen wurde. Wir müssen die Null aus dem gelben Pfad entfernen und das tun
+
, wasn + 0
in beiden Fällen in einer bestimmten Reihenfolge funktioniert . Endlich\
gibt eine neue Zeile aus und wir sind wieder am Start.Bei jeder Iteration wird ein zusätzliches Element
(n%5)*(n%3)
in den Zusatzstapel verschoben, ansonsten wird das Gleiche erneut ausgeführt.quelle
Perl 5, 49 Bytes
46 Bytes Skript + 3 Bytes
-E"..."
Mit
say
(was erfordert-E"..."
) kann dies weiter auf 46 Byte reduziert werden, dasay
automatisch eine neue Zeile eingefügt wird (Danke @Dennis !):Perl 5, 50 Bytes
quelle
say
.-E"..."
8 Bytes? Leertaste + Bindestrich + Wahltaste + Argument (+ Anführungszeichen).-E
0 Bytes sind, aber da die Antwort von primo ohne die Anführungszeichen bewertet wurde, habe ich mich dafür entschieden, es fair zu gestalten und die Anführungszeichen in meine und +1 für aufzunehmen-E
. Der Grund, warum es als kostenlos akzeptiert wird, ist, dass Perl normalerweise über ausgeführt wirdperl -e
undperl -E
keine Bytes mehr enthält (ich dachte,-M5.010
oder esuse 5.010
kann auch kostenlos sein, aber möglicherweise wird der Metapost nicht erneut gelesen). Beim Hinzufügen von-p
oder wird-n
dies als +1 gezählt, wie Sie es mit ausführen würdenperl -pe
. Ich hoffe, das hilft! Meta-Verweis: meta.codegolf.stackexchange.com/a/7539Ruby, 50 Bytes
Benötigt die Version 1.8, die bei Golfern sehr beliebt zu sein scheint:
In der modernen Rubin, ersetzen Sie
?d
mit100
einer 51-Byte - Lösung.Dies scheint der Weltrekord zu sein.
quelle
?d
ist einfach100
. DieFizzBuzz
Zeichenfolge enthält eine neue Zeile. Dies ist in Ruby gültig.string[i, s]
ist ein Slice, das mit einem Zeichen beginnti
(0-indiziert),s
Zeichen sucht und Indizes ignoriert, die außerhalb des Strings liegen. Wenn das Argument toputs
bereits einen Zeilenumbruch enthält, wird es abgeschnitten. Die Formel sollte einfach zu lesen sein? Es macht die ganze Arbeit hier. Ich hätte es ohne die Hilfe einiger wirklich professioneller Ruby-Golfer nicht gefunden.?e.times
stattdessen 2 Bytes mit gespeichert werden .[i=n**4%-15,i+13]
Teil bitte erklären ? Kann nicht scheinen, meinen Kopf darum zu wickelni==-14
die Scheibe außerhalb der Grenzen liegt, erhalten wirnil
. Wenni==-9
wiri+13==4
Zeichen ab dem neunten Zeichen vom Ende trennen, so'Fizz'
. Wenni==-5
wir 8 Zeichen ab dem 5. Zeichen vom Ende aufschneiden, so'Buzz\n'
. (Wir versuchen 8 zu schneiden, aber es gibt nur 5, also bekommen wir 5.) Und so weiter.Java, 130 Bytes
Dies gilt für neuere Java-Versionen (7+). Bei älteren kann man sich mit dem
enum
Trick etwas mehr abschneiden , aber ich glaube, die Logik wird nicht kürzer als diese (86 im Innerenmain
).quelle
class F{public static
->interface F{static
in Java 8enum F{;public...
, damit Sie tatsächlich keine Bytes sparen.Pyth, 30
Probieren Sie es hier aus
Erläuterung:
quelle
Retina ,
31713913413270636055 BytesProbieren Sie es online!
Erläuterung
Dies
.
ist das globale stille Flag, das die implizite Ausgabe am Ende des Programms ausschaltet.100{
Wickelt den Rest des Programms in eine Schleife, die für 100 Iterationen ausgeführt wird. Schließlich fügt die Bühne selbst nur ein_
am Anfang der Zeichenfolge, was effektiv einen unären Schleifenzähler erhöht.Mehr Konfiguration.
*\(
Bricht den Rest des Programms in eine Gruppe ein, druckt das Ergebnis mit einem nachgestellten Zeilenvorschub, versetzt aber auch die gesamte Gruppe in einen Probelauf, was bedeutet, dass das Ergebnis nach dem Drucken verworfen wird, sodass unser Schleifenzähler nicht geändert wird .a
ist ein benutzerdefinierter Regex-Modifizierer, der den Regex an der gesamten Zeichenfolge verankert (wodurch ein Byte bei der Verwendung von^
und$
explizit gespart wird ).Die Atomstufe selbst kümmert sich darum
Fizz
. Die Teilbarkeit durch3
kann leicht unärgerlich überprüft werden: Testen Sie einfach, ob die Zahl als Wiederholung von geschrieben werden kann___
. In diesem Fall stellen wirFi;
die Zeichenfolge voran . Das Semikolon ist so, dass vor der Zahl noch eine Wortgrenze für die nächste Stufe steht. Wenn wir die Linie inFizz___...
die Position zwischen drehenz
und_
sie nicht als Grenze betrachten würden, würde Regex sowohl Buchstaben als auch Unterstriche als Wortzeichen behandeln. Das Semikolon ermöglicht es uns jedoch auch, diezz
Duplizierung vonFizz
und zu entfernenBuzz
.Wir machen genau dasselbe für die Teilbarkeit durch
5
undBu;
, obwohl wir die_
s diesmal nicht aufbewahren müssen . So würden wir ein Ergebnis wie bekommenDies macht es sehr einfach, die Unterstriche nur in den Zeilen zu entfernen
Fizz
, die enthalten , und gleichzeitig daszz
s auszufüllen:Das heißt, wir verwandeln jedes Semikolon in
zz
, verbrauchen aber auch alle_
s direkt danach. An diesem Punkt sind wir mit FizzBuzz in Unary fertig. Aber die Herausforderung will eine dezimale Ausgabe.&
Gibt eine Bedingung an: Diese Phase wird nur ausgeführt, wenn der String einen Unterstrich enthält. DeshalbFizz
,Buzz
undFizzBuzz
sind Iterationen unberührt gelassen. Bei allen anderen Iterationen (dh solchen, die weder durch 3 noch durch 5 teilbar sind) wird nur die Anzahl der Zeichen gezählt und das Ergebnis in eine Dezimalzahl umgewandelt.quelle
gs2 , 1
Ein Zitat von Mauris, dem Schöpfer von gs2:
Update : 27-Byte- Antwort hinzugefügt , die nicht verwendet wird
f
.quelle
Perl 5, 45 Bytes
Benötigt die
-E
Option, als eins gezählt. Dies muss von der Kommandozeile ausgeführt werden, dh:Anführungszeichen um den Befehl sind nicht erforderlich, wenn man vermeidet , unter Verwendung von Leerzeichen oder andere Zeichen , die als Befehlszeilentrenner fungieren können (
|
,<
,>
,&
, etc.).Perl 5, 48 Bytes
Wenn die Befehlszeilenoptionen jeweils als eine gezählt werden,
-l
würde ein Byte gespart (durch Ersetzen$/
). Nach den klassischen Perlgolfregeln zählt dies jedoch 3: eine für den-
, eine für denl
und eine für den erforderlichen Platz.quelle
say
mit dem-E
Schalter, der Bearbeitungsabstand 1 bis hat-e
, so dass es als 1 Byte zählen sollte.say
. Ich bin davon ausgegangen,-E
dass sie anstelle von-e
44 auf 46 verwendet werden kann. Ich halte es nicht für fair, dass ich erziele Was ist anders als bei Ihnen der bevorzugte Bewertungsmechanismus? Ich benutze im Allgemeinenprint
, um dies zu vermeiden! Am nächsten an einem Konsens wäre dies ?say
wenn Ihr Code in eine Zeile geschrieben werden kann, ohne dass Trennzeichen für das Betriebssystem verwendet werden müssen, geben Sie 1 für-E
. Wenn Sie Anführungszeichen verwenden müssen, z. B.-E"$a||$b"
Punktzahl 3. Wenn Sie es nicht in einer Zeile erhalten können, erhalten Sie eine Punktzahl von 5 für-M5.01
. Aber zu diesem Zeitpunkt sind Sie wahrscheinlich besser dran-l
. Ich bin aus zwei Gründen nicht damit einverstanden, dass es standardmäßig kostenlos sein sollte: 1) Die Verbesserung ist trivial und uninteressant, und 2) es gibt keine Version des Interpreters, für die es standardmäßig aktiviert ist.Bienenwachs ,
1048981 BytesDie dichtere Packung ermöglichte das Abschneiden von 8 weiteren Bytes.
Kürzeste Lösung (81 Byte), gleicher Programmablauf, unterschiedliche Packung.
Durch die Änderung des Konzepts konnte ich den Code um 15 Byte reduzieren. Ich wollte den Double Mod 5 Test in der Lösung loswerden, also habe ich ein Flag implementiert.
Kurze Erklärung:
wenn
n%3=0
Fizz gedruckt wird und das Flag gesetzt wird. Das Flag wird einfach durch Aufschieben des obersten Stapelwerts auf den gstack (Befehlf
) realisiert.Wenn ja
n%5=0
, dann entwedern%3=0
(FizzBuzz-Fall) odern%3>0
(Buzz-Fall). In beiden Fällen wird Buzz gedruckt, und das Flag wird zurückgesetzt, indem der Stapel so lange geöffnet wird, bis er leer ist (Anweisung?
).Nun die interessanten Fälle:
Wenn
n%5>0
, dann hatten wir entwedern%3=0
(Fizz-Fall drucken, n muss nicht gedruckt werden) odern%3>0
(Fizz wurde nicht gedruckt, also muss n gedruckt werden). Zeit, die Flagge zu überprüfen. Dies wird realisiert, indem die Länge des Stapels auf den Stapel geschoben wird (AnweisungA
). Wennn%3 was 0
dann die gstack-Länge> 0 ist. Wennn%3 was >0
, ist die Stapellänge 0. Ein einfacher bedingter Sprung stellt sicher, dass n nur gedruckt wird, wenn die Länge von gstack 0 war.Nachdem n, Fizz und / oder Buzz und / oder die Newline gedruckt wurden, wird der Stapel erneut zweimal aufgerissen, um sicherzustellen, dass er leer ist. gstack ist entweder leer
[]
, was zu[0]
after instruction führtA
(Länge von gstack auf gstack schieben), oder es enthält eine Null ([0]
das Ergebnis von n% 3), was dazu führt[0 1]
, dass [0] die Länge 1 hat leerer Stapel ändert den Stapel nicht, daher ist es sicher, zweimal zu platzieren.Wenn Sie genauer hinschauen, können Sie sehen, dass ich im Prinzip gefoldet habe
in
Dies hilft, den verschwendeten Platz zwischen
A
und<
am Ende der folgenden Zeile in der älteren Lösung unten zu beseitigen:Neue Konzeptlösung (89 Byte) mit animierter Erklärung:
Sechseckiges Layout:
Animation der ersten 326 Ticks mit 2 fps mit lokalen und globalen Stapeln und Ausgabe an STDOUT.
Zum Vergleich sind im Folgenden die Pfadüberlagerungen der älteren, komplexeren Lösung aufgeführt. Vielleicht ist es auch optisch die schönere Lösung;)
quelle
> <> ,
68666564 BytesDer einzige Trick besteht darin, die Reste als Bedingung für das Drucken von Zahlen zu multiplizieren. Auf diese Weise wird die Nummer nicht gedruckt, wenn eine von ihnen 0 ist.
Sie können es hier ausprobieren .
Speichert ein Byte dank Sp3000 und ein anderes dank Randomra. Danke vielmals!
quelle
o
Ende der zweiten Zeile in den leeren Bereich am Anfang der Zeile verschieben, glaube ich.foooo Buzz
?gs2 ,
2827 (ohnef
)Verhexen:
Erläuterung:
Das Einbetten von 3 und 5 in die String-Konstante funktioniert nicht, da
\x05
String-Literale enden.Hinweis: Dieses Problem kann in 1 Byte mit gs2 mit dem eingebauten gelöst werden
f
.quelle
C 85 Bytes
-2 dank squeamish.
quelle
gcc
erkennt aber die neue Zeile in der Zeichenkette nicht als \ n. Es gibt mir einen Kompilierungsfehler. Muss ich dem Compiler einen Parameter übergeben? Übrigens haben Sie das<=
in Ihrem Beitrag verpasst (ich habe 88 Bytes mit <= gezählt ... also gehe ich davon aus, dass es fehlt).main(i)
Versuchen Sie es also stattdesseni;main()
. Dann können Sie diei--
am Anfang derfor()
Schleife loswerden . Sie brauchen auch keinen Zeilenumbruch. Das sollte die Byte - Countdown zum 85. bringen(i%3&&i%5)*i
durchi%3*i%5?i:0
Ich gehe ins BettCJam, 35 Bytes
Probieren Sie es online im CJam-Interpreter aus .
Wie es funktioniert
quelle
100{):I3%!"Fizz"*I5%!"Buzz"*+Ie|N}/
MUMPS,
5654 BytesWas ist das für ein
w:$X<3 i
Ding, fragst du?$X
ist eine magische Variable (eine "intrinsische" Variable), die die horizontale Position des Ausgabe-Cursors (als Anzahl von Zeichen vom linken Rand des Terminals) speichert.w
ist die abgekürzte Form desWRITE
Befehls. Die Syntaxcommand:condition args
ist eine nachbedingte - "wenncondition
, dann tuncommand args
".Wir sind also zu prüfen , ob die Ausgabe Cursor mehr als zwei Zeichen sind vorverlegt worden (was bedeuten würde , dass mindestens eine der
"Fizz"
oder"Buzz"
ist an das Terminal geschrieben wurde), und wenn nicht, das Schreibeni
an das Terminal. Die$X
Variable - und damit diese Art der tiefen Untrennbarkeit vom Terminal - ist ein erstklassiges Merkmal von MUMPS. Huch.quelle
Gelee ,
2420 BytesProbieren Sie es online!
Wie es funktioniert
quelle
Brainfuck, 206 Bytes
Formatiert:
Probieren Sie es online aus
Das Speicherlayout ist
Wobei
f
Zyklen um 3,b
Zyklen um 5,d1
eine Ziffer sind,d2
eine Zehnerstelle sind,s
ein Kennzeichen dafür ist, ob Zehnerstellen gedruckt werden sollen,d
Zyklen um 10,c
ein Kopierbereich fürd
,t
ein Arbeitsbereich, der 0 oder Junk-Daten enthält, oder ein Kennzeichen für nicht -divisible-by-3, unda
bestimmt die Programmbeendigung durch Versetzen des Zeigers, nachdem Buzz 20 Mal gedruckt wurde.quelle
C #,
128126125124 Bytes89 Bytes ohne den Kesselschildcode herum.
Fertig mit der Verwendung der bedingten Formatierung von C # .
Bei Trennzeichen mit zwei Abschnitten
;
werden Fizz oder Buzz gedruckt, wenn der Wert aus ihrer Bedingung Null ist.Insgesamt 4 Bytes dank @RubberDuck, @Timwi und @Riokmij gespeichert.
quelle
Write
den Zeilenumbruch direkt an den String anzuhängen, oder?i%3*i%5>0?i:0
alsi%3*i%5==0?0:i
.for
Anweisung speichern, indem Siefor(var i=0;i++<100;)
$"{(i%3*i%5>0?i:0):#}...\n"
class A{static void Main(){for(var i=0;i<100;)System.Console.Write($"{(++i%3*i%5<1?0:i):#}{i%3:;;Fizz}{i%5:;;Buzz}\n");}}
Clojure,
11310610110091 BytesMein erstes Golf!
Ungolfed:
quelle
println
wie in der Java-Lösung vorgehen , z.(doall(map #(let[t(=(mod % 3)0)](println(str(if t"Fizz""")(if(=(mod % 5)0)"Buzz"(if t""%)))))(range 1 101)))
(if t"Fizz""")
vereinfacht werden kann(if t"Fizz")
. :)Brainfuck ,
411 350 277258 BytesBearbeitungen:
-61 Bytes durch Speichern der Werte von "Fizz Buzz" als
"BuziF""BuziG" und Wiederholen des Nummerndruckabschnitts.-71 Bytes durch Wiederholen des Modulo-Nummer-Druckabschnitts, Aufteilen des Schleifenzählers und des Nummerzählers und Wiederverwenden der Newline-Zelle unter anderem als Mod-Wert
-19 Bytes, indem erkannt wird, dass in FizzBuzz-Zahlen keine Nullen sind. Auch Erklärung hinzugefügt
+[-[>+<<]>-]>--[>+>++>++>++++++>+>>>++++++[<<<]>-]<+++++[>+>+>->>->++>>>-->>>++[<<<]>>>-]>[>]+++>>[>+<<<-[<]<[>+++>+<<-.+<.<..[<]<]>>-[<<]>[.>.>..>>>>+[<]+++++<]>[>]>>[[->+>-[>+>>]>[+[-<+>]>+>>]<<<<<<]>[-<+>]>,>[>]<[>-[<+>-----]<---.,<]++++++++++>]<.<<<<,>-]
Probieren Sie es online!
Anstatt zu überprüfen, ob die Zahl selbst durch 5 oder 3 teilbar war, ließ ich zwei Zähler das Modulo der Zahl verfolgen, dekrementierte sie für jede Zahl und druckte das entsprechende Wort aus, wenn sie 0 erreichten.
Wie es funktioniert:
quelle
PowerShell,
78686154 BytesEdit: 10 Bytes dank feersum gespeichert
Edit2: Es wurde mir klar, dass ich mit Feersums Trick $ t nicht mehr als Code-Block-Zeichenfolge formulieren muss
Edit3: Weitere 7 Bytes dank Danko Durbić gespeichert
Im Geiste ähnlich wie die serienmäßige Rosetta Code- Antwort , aber einiges heruntergespielt.
Erläuterung
1..100|%{...}
Erstellen Sie eine Sammlung von 1 bis 100, und führen Sie dann für jedes Objekt in dieser Sammlung Folgendes aus(...,$_)
erstelle eine neue Sammlung von zwei Elementen: 0)$t=...
setze die Variable$t
gleich einer Zeichenkette; 1)$_
Unsere-aktuelle-Nummer der Schleife"Fizz"*!($_%3)
nimm unsere-aktuelle-nummer, modifiziere sie um 3, dann NICHT das ergebnis. Multiplizieren Sie "Fizz" damit und fügen Sie es der Zeichenkette hinzu (und ähnlich für 5). PowerShell behandelt jede Zahl ungleich Null als$TRUE
, und daher ist das NICHT einer Zahl ungleich Null 0, was bedeutet, dass "Fizz" nur dann zur Zeichenfolge hinzugefügt wird, wenn unsere aktuelle Zahl ein Vielfaches von 3 ist.[!$t]
Indexe in die soeben erstellte Auflistung, basierend auf dem Wert der Zeichenfolge$t
- nicht leer, drucken Sie sie aus, ansonsten drucken Sie unsere aktuelle Nummer ausAlternativ auch 54 Bytes
Danke an TesselatingHeckler
In ähnlicher Weise wird der Inline-
-replace
Operator und ein regulärer Ausdruck verwendet, um eine leere Zeichenfolge^$
mit unserer aktuellen Nummer auszutauschen. Wenn der String nicht leer ist, wird er nicht ausgetauscht.Alternativ auch 54 Bytes
Dies ist die gleiche Schleifenstruktur wie oben, aber innerhalb dieser Struktur wird das Paar (n, Zeichenfolge) sortiert. Dabei wird davon ausgegangen, dass eine leere Zeichenfolge vor einer Zahl sortiert wird, eine FizzBuzz-Zeichenfolge jedoch nach einer Zahl. Dann indiziert es das zweite Sortierergebnis.
quelle
||
Operator wie in C # implementieren würde , könnten wir wahrscheinlich auf 43 Bytes mit etwas ähnlichem wie1..100|%{"Fizz"*!($_%3)+"Buzz"*!($_%5)||$_}
... herunterkommen, was zweifelhaft ist, da dies|
ein so wichtiger spezieller Operator in PowerShell ist, aber ich kann träumen ...1..100|%{'Fizz'*!($_%3)+'Buzz'*!($_%5)-replace'^$',$_}
54?if($t){$t}else{$_}
mit etwas wie ersetzen($t,$_)[!$t]
1..100|%{(($t="Fizz"*!($_%3)+"Buzz"*!($_%5)),$_)[!$t]}
das auch 54 wie @ TessellatingHecklers VorschlagJavaScript, 62 Bytes
Ich denke, das ist jetzt die kürzeste Javascript-Lösung.
quelle
console.log
; Es ist viel weniger ärgerlich, als auf 100 Popup-Boxen hintereinander "OK" drücken zu müssen. Könnten Sie das bitte ändern? Es werden nur 62 Bytes sein, immer noch drei besser als meine.C 74 Bytes
Das
0
Argument zuprintf
statt""
ist faul, scheint aber auf den meisten Plattformen zu funktionieren, auf denen ich es anprobiere.puts
Segfaults, wenn Sie das Gleiche versuchen. Ohne es erhalten Sie 75 Bytes.Es gibt 73-Byte-Lösungen, die auf Anarchie-Golf funktionieren , und ich habe eine gefunden, die an den richtigen Stellen im Internet herumgräbt, aber sie basieren auf plattformspezifischem Verhalten. (Wie Sie vielleicht erraten haben, ist es etwas von der Form
puts("Buzz"±...)
.)quelle
./fizzbuzz $(seq 40)
PScratch,
203185 BytesBytes aus dem golfed gezählt Textdarstellung , pro dieser Meta Post . Scratch ist nicht sehr platzsparend.
say
ist das, was Scratch am nächsten kommt: Das Sprite zeigt eine Sprechblase an, die alles enthält, was es sagt. In der Praxiswait n secs
wäre ein Block erforderlich, um diese Ausgabe tatsächlich zu lesen, aber für die Zwecke dieser Herausforderung erfüllt dieser Code die Anforderungen.quelle
y =
(in beiden Fällen)set y to ...
fehlt ein WertR
8883777170 BytesIch bin mir sicher, dass dies verbessert werden kann... und das mit Dank an @flodel. Ein paar weitere Bytes wurden dank eines Vorschlags von @njnnja und eines weiteren von @ J.Doe gespeichertquelle
x=1:100;i=!x%%3;j=!x%%5;x[i]="Fizz";x[j]="Buzz";x[i&j]="FizzBuzz";cat(x,sep="\n")
write
nichtcat
obwohlwrite
Aufruf kann eine 1 anstelle einer leeren Zeichenfolge annehmen, wasx=y=1:100;y[3*x]='Fizz';y[5*x]='Buzz';y[15*x]='FizzBuzz';write(y[x],1)
für 70 Bytes ein trivialer 1-Byte-Golf ist.Haskell, 84 Bytes
Annäherung an Henkmas 81 Bytes , aber noch nicht ganz da.
d = drop.(*4).mod n
ist der Schlüssel hier:d 3 "Fizz"
istdrop (n`mod`3 * 4) "Fizz"
. Dies ist,"Fizz"
wennn `mod` 3
0 und""
sonst ist.quelle
(%)=drop.(*4).mod n;main=mapM putStrLn[max(show n)$3%"Fizz"++5%"Buzz"|n<-[0..100]]
.n
ist nicht im Umfang. Hm.main=mapM putStrLn[max(show n)$3%"Fizz"++5%"Buzz"|n<-[0..100],(%)<-[drop.(*4).mod n]]
PHP, 54 Bytes
Gültig ab v5.5. Das
õ
ist Zeichen 245, ein bisschen invertiert\n
.Ich gehe von den Standardeinstellungen des Interpreters aus, da diese ohne ini sind. Wenn Sie sich nicht sicher sind, können Sie Ihre lokale INI mit deaktivieren
-n
as inphp -n fizzbuzz.php
.Eine Version, die mit absolut jeder Konfigurationsdatei fehlerfrei läuft, hat 62 Bytes :
quelle
short_open_tag
ist aus,E_NOTICE
ist an. Beides sind keine Standardeinstellungen.80386 Maschinencode + DOS, 75 Bytes
Hexdump des Codes:
Quellcode (TASM-Syntax):
Dieser Code zählt von 1 bis 100 in
ax
und erstellt die Ausgabenachricht vom Ende bis zum Anfang. Das Ende der Nachricht (Zeilenvorschub und das von$
DOS für das Nachrichtenende-Flag verwendete Zeichen) wird am Anfang des Codes angezeigt:Es wird als harmlose Anweisung ausgeführt (
or ax, 240ah
). Ich könnte es an einem konventionelleren Ort platzieren, wie nach dem Ende des Codes, aber es hat einen Vorteil, es an der Adresse 0x100 zu haben.Der Code verwendet außerdem 2 zusätzliche Leistungsindikatoren:
dl
dh
Wenn ein Zähler 0 erreicht, wird die Zeichenfolge
Fizz
oderBuzz
das Ende der Ausgabenachricht verschoben. In diesembx
Fall werden und verringertbh
wird Null sein. Dies wird als Bedingung für die Ausgabe der Zahl in Dezimalform verwendet.Hinweis: Ich verwende hier 32-Bit-Daten. Auf einem Computer vor 386 funktioniert dies nicht.
quelle
mov [mem], 'Fizz'
umFizz
in dieser Reihenfolge übereinstimmendedb
Anweisungen im Speicher zu speichern . Sehen Sie sich zum Beispiel meinen überkomplizierten "effizienten" YASM FizzBuzz an .std
, dannstosb
/stosd
? Sie müsstentest bh,bh
mitcmp di, 100h
oder etwas ersetzen . Anstatt den Zähler in AL zu speichern / wiederherzustellen, können Sie ihn in BL behalten und einfach eax löschen, wann immer Sie möchten. ZBsub bx, 4
/mov dword ptr [bx], 'zzuB'
ist 3 + 7 Bytes, richtig?mov eax, 'zzuB' / stosd
beträgt 6 + 2 Bytes (Operandengrößenpräfix auf beiden). Es wäre schön, wenn die Antwort die Demontage enthalten würde, damit die Anweisungsgrößen sichtbar wären.stosd
aber selbst keine Punkteverringerung feststellen. Seitstosd
Dekrementierungen imDI
Nachhinein verlieren Sie das nichtsub di, 4
und habenDI
am Ende 4 Bytes frei. Ich konnte-6 bytes
ein paar andere kleinere Verbesserungen verwenden, die ich schließlich als separate Antwort veröffentlichte (nur, weil ich möglicherweise nicht in alle Kommentare passen konnte). Ein dickes Lob!dc,
6462 BytesUngolfed:
quelle