1, 2, Fizz, 4, Buzz


148

introduzione

Nel nostro recente sforzo di raccogliere cataloghi delle soluzioni più brevi per esercizi di programmazione standard, ecco la prima sfida FizzBuzz alla vaniglia di PPCG. Se desideri vedere altre sfide del catalogo, c'è "Hello World!" e "Questo numero è un numero primo?" .

Sfida

Scrivi un programma che stampa i numeri decimali da 1 a 100 inclusi. Ma per multipli di tre stampa "Fizz" anziché il numero e per multipli di cinque stampa "Buzz". Per i numeri multipli di tre e cinque stampare "FizzBuzz".

Produzione

L'output sarà un elenco di numeri (e Fizzes, Buzzes e FizzBuzzes) separati da una nuova riga (o \no \r\n). Una nuova riga finale è accettabile, ma una nuova riga iniziale non lo è. A parte la scelta di newline, l'output dovrebbe apparire esattamente come questo:

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

L'unica eccezione a questa regola è l'output costante dell'interprete della tua lingua che non può essere soppresso, come un saluto, codici colore ANSI o rientro.

Ulteriori regole

  • Non si tratta di trovare la lingua con l'approccio più breve per giocare a FizzBuzz, si tratta di trovare l'approccio più breve in ogni lingua. Pertanto, nessuna risposta verrà contrassegnata come accettata.

  • Le iscrizioni vengono classificate in byte in una codifica preesistente appropriata, di solito (ma non necessariamente) UTF-8. Alcune lingue, come Cartelle, sono un po 'difficili da segnare - in caso di dubbi, si prega di chiedere su Meta.

  • Nulla può essere stampato su STDERR.

  • A differenza delle nostre solite regole, sentiti libero di usare una lingua (o versione linguistica) anche se è più recente di questa sfida. Se qualcuno vuole abusare di questo creando una lingua in cui il programma vuoto genera l'output di FizzBuzz, allora si congratula per aver spianato la strada a una risposta molto noiosa.

    Si noti che deve essere presente un interprete per poter testare l'invio. È permesso (e persino incoraggiato) di scrivere questo interprete per una lingua precedentemente non implementata.

  • Se la tua lingua preferita è una variante banale di un'altra lingua (potenzialmente più popolare) che ha già una risposta (pensi a dialetti BASIC o SQL, shell Unix o banali derivati ​​Brainfuck come Alphuck e ???), considera di aggiungere una nota all'esistente rispondere che la stessa o una soluzione molto simile è anche la più breve nell'altra lingua.

  • Poiché l'output è fisso, è possibile codificare l'output (ma questa potrebbe non essere l'opzione più breve).

  • È possibile utilizzare soluzioni preesistenti, purché si accrediti l'autore originale del programma.

  • Le scappatoie standard non sono altrimenti vietate.

Come nota a margine, si prega di non sottovalutare le risposte noiose (ma valide) in lingue in cui non c'è molto da golf; questi sono ancora utili a questa domanda in quanto tenta di compilare un catalogo il più completo possibile. Tuttavia, valuta principalmente le risposte nelle lingue in cui gli autori hanno effettivamente dovuto sforzarsi di giocare a golf con il codice.

Catalogare

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>


1
Nothing can be printed to STDERR. È vero solo durante l'esecuzione o anche durante la compilazione (supponendo che sia un passaggio separato?)
AShelly

@AShelly Solo durante l'esecuzione
Decadimento beta

Non sono sicuro che mi piace il fatto che tu abbia codificato il 100 nella sfida. In questo modo, un programma che genera solo l'output previsto è una voce valida, ma non è interessante per questa sfida. Penso che la sfida dovrebbe aspettarsi che il programma inserisca il numero di elementi da produrre.
Timwi,

6
@Timwi Anche se concordo sul fatto che lo renderebbe (solo leggermente) più interessante, ho visto molto spesso FizzBuzz come strettamente da 1 a 100 (su Wikipedia e Rosetta Code, ad esempio). Se l'obiettivo è quello di avere una sfida "canonica" FB, ha senso.
Geobits il

58
Un "fizzbuzz alla vaniglia" sembra delizioso.
iamnotmaynard,

Risposte:


76

Python 2, 56

i=0;exec"print i%3/2*'Fizz'+i%5/4*'Buzz'or-~i;i+=1;"*100

6
Dang, è un genio insanguinato. Posso rubare la tua idea di moltiplicare la stringa per il risultato mod?
AdmBorkBork,

@TimmyD Vai avanti.
feersum,

15
Un metodo diverso per 56 (da qui ): i=1;exec"print'FizzBuzz'[i%-3&4:12&8-i%5]or i;i+=1;"*100. Qualcuno vuole forzare le espressioni di ricerca della forza per cercare di ottimizzare il bit bashing?
xnor

1
Tecnica molto bella, adoro la divisione del risultato del modulo per renderlo binario! Ho un miglioramento per portare il tuo metodo a 54 caratteri ... Naturalmente non lo
pubblicherei

2
@Tersosauros Vai avanti ... il mio metodo non è molto difficile da trovare e senza dubbio è stato scoperto in modo indipendente da molte persone.
feersum

76

Esagonia , 91 byte

Grazie per la generosità :)

Wow, non avrei mai immaginato di poter battere la soluzione Hexagony di Martin . Ma - chi l'avrebbe mai provato - l'ho fatto. Dopo diversi giorni di fallimento, perché non avevo né il colorante Hexagony né EsotericIDE per controllare la mia soluzione. Ho sbagliato diversi aspetti della specifica, quindi ho prodotto alcune "soluzioni" sbagliate usando solo carta e penna e un editor di testo. Bene, finalmente ho superato la mia pigrizia e clonato entrambi i repository, scaricato VisualStudio e li ho compilati. Caspita, che strumenti utili sono! Come puoi vedere, sono ben lungi dall'essere qualcuno che chiameresti un programmatore (voglio dire, dai! Non avevo nemmeno VisualStudio installato e non ho praticamente idea di come compilare un programma);)

Mi ci è voluto ancora un po 'per trovare una soluzione funzionante, ed è piuttosto stipata e caotica, ma qui è in tutto il suo splendore:

Fizzbuzz in un esagono taglia 6:

3}1"$.!$>)}g4_.{$'))\<$\.\.@\}F\$/;z;u;<%<_>_..$>B/<>}))'%<>{>;e"-</_%;\/{}/>.\;.z;i;..>(('

Layout esagonale:

      3 } 1 " $ .
     ! $ > ) } g 4
    _ . { $ ' ) ) \
   < $ \ . \ . @ \ }
  F \ $ / ; z ; u ; <
 % < _ > _ . . $ > B /
  < > } ) ) ' % < > {
   > ; e " - < / _ %
    ; \ / { } / > .
     \ ; . z ; i ;
      . . > ( ( '

E la bellissima interpretazione, grazie a Hexagony Colorer di Timwi :

Colorized Hexagony FizzBuzz solution

Quindi, ecco un'animazione GIF lunga 110 secondi a 2 fps, che mostra il flusso del programma durante i primi 6 numeri 1, 2, Fizz, 4, Buzz, Fizz, i primi 220 tick del programma (fare clic sull'immagine per ingrandirla):

enter image description here

Mio Dio, grazie al software di composizione Natron l'animazione del puntatore era ancora noiosa da creare, ma gestibile. Salvare 260 immagini della memoria è stato meno divertente. Sfortunatamente EsotericIDE non può farlo automaticamente. Ad ogni modo, goditi l'animazione!

Dopotutto, una volta che avvolgi la testa attorno al modello di memoria e all'avvolgimento piuttosto controintuitivo di percorsi che attraversano i bordi dell'esagono, Hexagony non è così difficile da lavorare. Ma giocare a golf può essere una seccatura. ;)

È stato divertente!


1
Molto bella! :) Questo è quello che ottengo dimenticando di provare me stesso la lunghezza laterale 6. ;) (Sarebbe interessante vedere se la mia soluzione si adatta più facilmente al lato 6 più facilmente.)
Martin Ender

@ MartinBüttner Mi piacerebbe vederlo :)
ML

2
Sono meno programmatore di te, perché cos'è Visual Studio? : P
Rɪᴋᴇʀ

5
Sfortunatamente EsotericIDE non può farlo automaticamente. - Per favore, vai avanti e invia un suggerimento sulla funzionalità , potrei iniziare a farlo un giorno :)
Timwi

1
(oops questo si presenta dopo 6 mesi dall'ultima risposta) Puoi golf 1 byte dalla fine del programma spostando il percorso grigio di 1 byte e posizionando un "Annullamento op" nel percorso arancione come 3}1"$.!$>)}g4_'{$))}\<$\.\.@\;F\$/;z;u;<%<_>_..$>B/<>}))'%<>{>;e"-</_%;\/{}/>.\)(z;i;..>('. Ora c'è un extra (dopo la z, che può essere "cancellata" con a) o inserendo la z lì. Ora è a) che invia tutti i comandi sul percorso arancione 1 segno di spunta più tardi, e sono tornato con la no-op che era sulla linea 3. Tra l'altro ho anche installato Visual Studio a causa di Hexagony Colorer e Esoteric IDE: P
Sunny Pun

44

Labyrinth , 94 byte

"):_1
\ } 01/3%70.105
" :   @ "     .
"  =";_""..:221
+  _
"! 5%66.117
_:= "     .
="*{"..:221

Sotto-100! Questo è stato divertente.

Spiegazione

Cominciamo con un breve primer su Labyrinth - sentiti libero di saltare questo se hai già familiarità con le basi:

  • Labyrinth ha due pile: una pila principale e una pila ausiliaria. Entrambi gli stack hanno un numero infinito di zeri nella parte inferiore, ad esempio +su uno stack vuoto aggiunge due zero, spingendo così lo zero.

  • Il flusso di controllo in Labyrinth è deciso da giunzioni, che guardano in cima allo stack per determinare dove andare dopo. Negativo significa svoltare a sinistra, zero significa andare dritto e positivo significa svoltare a destra ... ma se colpiamo un muro allora invertiamo la direzione. Ad esempio, se sono possibili solo dritto e svoltare a sinistra, ma la parte superiore della pila è positiva, quindi poiché non possiamo girare a destra, invece giriamo a sinistra.

  • Cifre in Labyrinth pop x e push 10*x + <digit>, il che rende facile costruire grandi numeri. Tuttavia, ciò significa che abbiamo bisogno di un'istruzione per spingere 0 per iniziare un nuovo numero, che si trova _in Labyrinth.

Ora passiamo al codice reale!

enter image description here

Rosso

L'esecuzione inizia "dall'angolo in alto a sinistra, che è un NOP. Il prossimo è) , che incrementa la parte superiore dello stack, spingendo 1 al primo passaggio e incrementando nad ogni passaggio successivo.

Quindi dupliciamo ncon :. Poiché nè positivo, giriamo a destra, eseguendo }(sposta la parte superiore dello stack principale in ausiliario) e :. Raggiungiamo un vicolo cieco, quindi ci voltiamo ed eseguiamo }e :ancora una volta, lasciando le pile simili

Main [ n n | n n ] Aux

Ancora una volta, nè positivo e giriamo a destra, eseguendo il _101/quale si divide nper 101. Se nè 101, allora n/101 = 1andiamo in @, che termina il programma. Altrimenti, la nostra situazione attuale è

Main [ n 0 | n n ] Aux

Arancione 1 (mod 3)

3trasforma lo zero superiore in 3 ( 10*0 + 3 = 3) ed %esegue un modulo. Se n%3è positivo, giriamo a destra nel giallo ". Altrimenti eseguiamo 70.105.122:.., quali output Fizz. Si noti che non è necessario inviare nuovi zero con _poiché n%3era zero in questo caso, quindi possiamo sfruttare gli zero infiniti nella parte inferiore dello stack. Entrambi i percorsi si incontrano di nuovo in azzurro.

Azzurro

La parte superiore dello stack è attualmente n%3, il che potrebbe essere positivo, quindi il _;giusto spinge uno zero e lo fa immediatamente scoppiare per assicurarci di andare dritto, invece di trasformarci in @. Usiamo quindi =per scambiare le cime delle pile principali e ausiliarie, dando:

Main [ n | n%3 n ] Aux

Orange 2 (mod 5)

Questa è una situazione simile a prima, eccetto che 66.117.122:..genera Buzzifn%5 è zero.

Blu scuro

La sezione precedente lascia le pile simili

Main [ n%5 | n%3 n ] Aux

{sposta la parte n%3posteriore nello stack principale e *moltiplica i due moduli.

Se uno dei due moduli è zero, il prodotto è zero, quindi andiamo direttamente in giallo. =scambia la parte superiore delle pile e _spinge uno zero per assicurarsi di andare dritto, dando

Main [ n 0 | 0 ] Aux

Altrimenti, se entrambi i moduli sono diversi da zero, il prodotto è diverso da zero e trasformiamo a destra in verde. =scambia le cime delle pile, dando

Main [ n | (n%5)*(n%3) ] Aux

dopo di che usiamo :per duplicare n, girare a destra, quindi usare !per l'output n.

Viola

A questo punto, la pila principale ha uno o due oggetti, a seconda del percorso preso. Dobbiamo sbarazzarci dello zero dal percorso giallo, e per farlo usiamo +, che si comporta n + 0in un certo ordine per entrambi i casi. Finalmente,\ genera una nuova riga e siamo di nuovo all'inizio.

Ogni iterazione aggiunge un extra (n%5)*(n%3)allo stack ausiliario, ma per il resto facciamo di nuovo la stessa cosa.


7
Amare la spiegazione.
The_Basset_Hound il

29

Perl 5, 49 byte

46 byte di script + 3 byte -E"..."

L'uso say(che richiede -E"...") può ridurlo ulteriormente a 46 byte poiché sayinclude automaticamente una nuova riga (Grazie @Dennis !):

say'Fizz'x!($_%3).Buzz x!($_%5)||$_ for 1..100

Perl 5, 50 byte

print'Fizz'x!($_%3).Buzz x!($_%5)||$_,$/for 1..100

È possibile salvare alcuni byte utilizzando say.
Dennis,

Hai rotto il tabellone ...
LegionMammal978,

@ LegionMammal978 Sì. Sì, l'ho fatto ... Proverò a riscrivere il titolo allora! Argh!
Dom Hastings,

Non sono -E"..."8 byte? Spazio + Dash + Opzione + Argomento (+ Virgolette).
Erik the Outgolfer,

1
@EriktheGolfer quindi da quando ho pubblicato questo, il consenso è che -Eè 0 byte, ma poiché la risposta di Primo è stata segnata escludendo le virgolette, ho optato per renderlo equo e includere le virgolette tra le mie e +1 per -E. Il motivo per cui è accettato come gratuito è che Perl è di solito gestito tramite perl -ee perl -Enon è più byte (ho pensato -M5.010o use 5.010può anche essere libero, ma forse non rileggere il meta post). Quando si aggiunge -po -nquesto viene conteggiato come +1 come si farebbe con perl -pe. Spero che aiuti! Meta riferimento: meta.codegolf.stackexchange.com/a/7539
Dom Hastings

27

Rubino, 50 byte

Richiede la versione 1.8, che sembra essere popolare tra i golfisti:

1.upto(?d){|n|puts'FizzBuzz
'[i=n**4%-15,i+13]||n}

Nel moderno Ruby, si sostituisce ?dcon 100una soluzione a 51 byte.

Questo sembra essere il record mondiale.


1
È diabolico, lo adoro.
Camden Narzt,

?dè giusto 100. La FizzBuzzstringa ha una nuova riga, è valida in Ruby. string[i, s]è una sezione, che inizia con il carattere i(indicizzato 0), continua per i scaratteri, ignorando gli indici che puntano all'esterno della stringa. Se l'argomento putsha già una nuova riga, viene eliminato. La formula dovrebbe essere semplice da leggere? Fa tutto il lavoro qui. Non l'avrei trovato senza l'aiuto di alcuni golfisti davvero pro Ruby.
Lynn,

nota a margine: se ti fosse permesso di aggiungere 0 all'inizio dell'input (non lo sei), potresti invece salvare 2 byte usando ?e.times.
Shelvacu,

Puoi spiegare la [i=n**4%-15,i+13]parte per favore? Non riesco a avvolgerci la testa
Piccolo

2
@Piccolo Questo frammento aiuta? Se i==-14la fetta è fuori limite, allora otteniamo nil. Se i==-9dividiamo i i+13==4caratteri a partire dal nono carattere dalla fine, così 'Fizz'. Se i==-5tagliamo 8 caratteri a partire dal 5 ° carattere dalla fine, quindi 'Buzz\n'. (Proviamo a tagliare 8 ma ce ne sono solo 5, quindi otteniamo 5.) Eccetera.
Lynn,

26

Java, 130 byte

Questo è per le recenti versioni di Java (7+). In quelli più vecchi puoi radere un po 'di più usando il enumtrucco, ma non penso che la logica si accorcia di così (86 all'interno main).

class F{public static void main(String[]a){for(int i=0;i++<100;)System.out.println((i%3<1?"Fizz":"")+(i%5<1?"Buzz":i%3<1?"":i));}}

Non credo che il trucco del blocco di inizializzatore sia utile qui, poiché la domanda specifica lo stderr vuoto.
feersum,

Hmm. Conosco il trucco statico stampato su stderr, ma ho pensato che enum funzionasse perfettamente. Buono a sapersi :)
Geobits il

4
battermi di 14 byte! Usare <1 invece di == 0 è un ottimo modo per salvare!
ESP,

2
class F{public static-> interface F{staticin java 8
TheNumberOne

1
Questo non è abbastanza come funzionano le enumerazioni. Dovresti farlo enum F{;public..., quindi non risparmierai alcun byte.
HyperNeutrino

23

Pyth, 30

VS100|+*!%N3"Fizz"*!%N5"Buzz"N

Provalo qui

Spiegazione:

VS100|+*!%N3"Fizz"*!%N5"Buzz"N
VS100                            : for N in range(1,101)
     |                           : logical short-circuiting or
      +*!%N3"Fizz"               : add "Fizz" * not(N % 3)
                                 : Since not gives True/False this is either "" or "Fizz"
                  *!%N5"Buzz"    : Same but with 5 and Buzz
                             N   : Otherwise N
                                 : The output of the | is implicitly printed with a newline

23

Retina , 317 139 134 132 70 63 60 55 byte

.100{`^
_
*\(a`(___)+
Fi;$&
\b(_{5})+$
Bu;
;_*
zz
'_&`.

Provalo online!

Spiegazione

.100{`^
_

La .è la bandiera silenziosa globale che disattiva uscita implicito alla fine del programma. 100{avvolge il resto del programma in un ciclo che viene eseguito per 100 iterazioni. Infine, il palco stesso inserisce solo a_ all'inizio della stringa, il che aumenta efficacemente un contatore di loop unario.

*\(a`(___)+
Fi;$&

Più configurazione. *\(avvolge il resto del programma in un gruppo, stampa il suo risultato con un avanzamento riga finale, ma mette anche l'intero gruppo in una fase a secco, il che significa che il suo risultato verrà scartato dopo la stampa, in modo che il nostro contatore di loop non sia effettivamente modificato . aè un modificatore regex personalizzato che ancora il regex all'intera stringa (che salva un byte sull'uso ^e in modo $esplicito).

Lo stadio atomico stesso si occupa di Fizz. La divisibilità 3può essere facilmente verificata in modo unario: basta verificare se il numero può essere scritto come ripetizione di ___. In questo caso, anteponiamo Fi;alla stringa. Il punto e virgola è in modo che ci sia ancora un limite di parole davanti al numero per la fase successiva. Se trasformassimo la linea nella Fizz___...posizione tra ze _non saremmo considerati un limite, perché regex tratta sia le lettere che i caratteri di sottolineatura come caratteri di parole. Tuttavia, il punto e virgola ci consente anche di rimuovere la zzduplicazione da Fizze Buzz.

\b(_{5})+$
Bu;

Facciamo lo stesso per la divisibilità per 5e Bu;, anche se non abbiamo bisogno di mantenere la _s in questo momento. Quindi otterremmo un risultato simile

_
__
Fi;___
____
Bu;
Fi;______
...
Fi;Bu;
...

Questo rende molto facile sbarazzarsi dei caratteri di sottolineatura solo in quelle righe che contengono Fizz, compilando anche zzi messaggi di testo:

;_*
zz

Cioè, trasformiamo ogni punto e virgola in zzma consumiamo anche tutto il resto _subito dopo. A questo punto abbiamo finito con FizzBuzz in unario. Ma la sfida vuole un output decimale.

'_&`.

&indica un condizionale: questa fase viene eseguita solo se la stringa contiene un carattere di sottolineatura. Pertanto, Fizz, Buzze FizzBuzzle iterazioni non vengono toccati. In tutte le altre iterazioni (ovvero quelle che non sono né divisibili per 3 né 5), contiamo solo il numero di caratteri, convertendo il risultato in decimale.


20

gs2 , 1

f

Una citazione di Mauris, il creatore di gs2:

Volevo un byte di 1 byte di gorubyHello, world! , quindi ... Questo stampa "1\n2\nFizz\n4\nBuzz\n...". :)

Aggiornamento : aggiunta una risposta a 27 byte che non utilizza f.


20

Perl 5, 45 byte

say((Fizz)[$_%3].(Buzz)[$_%5]or$_)for+1..100

Richiede l' -Eopzione, considerata come una. Questo deve essere eseguito dalla riga di comando, ovvero:

perl -Esay((Fizz)[$_%3].(Buzz)[$_%5]or$_)for+1..100

Citazioni attorno al comando sono inutili, se si evita l'uso di spazi o altri caratteri che possono agire come separatori riga di comando ( |, <,> , &, etc.).


Perl 5, 48 byte

print+(Fizz)[$_%3].(Buzz)[$_%5]||$_,$/for 1..100

Se le opzioni della riga di comando vengono conteggiate come una a testa, -lsi risparmierebbe un byte (sostituendolo $/). Secondo le regole classiche di Perlgolf , tuttavia, ciò conterrebbe 3: uno per il -, uno per il le uno per lo spazio necessario.


Puoi usare say, con l' -Einterruttore, che ha una distanza di modifica da 1 a -e, quindi dovrebbe contare come 1 byte.
Dennis,

Ehi primo, mi sento come se stessi tradendo la mia risposta per l'utilizzo say, ho pensato che -Epotesse essere usato al posto di quello -eche ti porterebbe a 44 anziché a 46. Non penso sia giusto che stia segnando diversamente da te, qual è il meccanismo di punteggio preferito? In genere lo uso printper evitarlo! Più vicino a un consenso sarebbe questo ?
Dom Hastings,

La mia opinione personale è che ogni byte aggiuntivo sulla riga di comando dovrebbe segnare 1. In particolare per say, se il tuo codice può essere scritto su una riga evitando qualsiasi separatore del sistema operativo, segna 1 per -E. Se è necessario utilizzare le virgolette, ad esempio il -E"$a||$b"punteggio 3. Se non è possibile ottenerlo su una riga, segnare 5 per -M5.01. Ma a quel punto probabilmente staresti meglio usando -l. Non sono d'accordo sul fatto che dovrebbe essere gratuito per impostazione predefinita, per due motivi: 1) il miglioramento è banale e poco interessante, e 2) non esiste una versione dell'interprete per cui è abilitata per impostazione predefinita.
primo

20

cera d'api ,104 89 81 byte

Imballaggio più denso consentito per tagliare altri 8 byte.

Soluzione più breve (81 byte), stesso flusso di programma, imballaggio diverso.

p?@<
p?{@b'gA<
p@`zzuB`d'%~5F@<f`z`<
 >~P"#"_"1F3~%'d`Fiz`b
 d;"-~@~.<
>?N@9P~0+d

La modifica del concetto mi ha permesso di ridurre il codice di 15 byte. Volevo sbarazzarmi del doppio test mod 5 nella soluzione, quindi ho implementato una bandiera.

Breve spiegazione:

se n%3=0Fizz viene stampato e la bandiera viene impostata. La bandiera si realizza semplicemente spingendo il valore lstack superiore sul gstack (istruzioni f).

Se n%5=0, quindi n%3=0(caso FizzBuzz) o n%3>0(caso Buzz). In entrambi i casi, Buzz viene stampato e la bandiera viene ripristinata facendo scoppiare la pila fino a quando non è vuota (istruzioni ?).

Ora i casi interessanti:

Se n%5>0, allora o abbiamo avuto n%3=0(stampando la custodia Fizz, n non deve essere stampato) o n%3>0(Fizz non è stata stampata, quindi n deve essere stampato). È ora di controllare la bandiera. Questo si ottiene spingendo la lunghezza di gstack sopra gstack (istruzioni A). Se n%3 was 0la lunghezza del gstack è> 0. Se n%3 was >0la lunghezza di gstack è 0. Un semplice salto condizionale assicura che n venga stampato solo se la lunghezza di gstack era 0.

Ancora una volta, dopo aver stampato uno qualsiasi di n, Fizz e / o Buzz e la nuova riga, lo gstack viene visualizzato due volte per assicurarsi che sia vuoto. gstack è vuoto [], il che porta a [0]dopo le istruzioniA (spingere la lunghezza di gstack su gstack), oppure contiene uno zero ( [0], il risultato di n% 3), che porta a [0 1], poiché [0] ha la lunghezza 1. Popping da un la pila vuota non cambia la pila, quindi è sicuro far scoppiare due volte.

Se guardi più da vicino puoi vedere che, in linea di principio, ho piegato

>      q
d`Fizz`f>

dentro, come moto a luogo, andare da dentro a fuori: I put my hand inTO my pocket = metto la mano in tasca

<f`z`<
d`Fiz`b

che aiuta a sbarazzarsi di tutto lo spazio sprecato tra Ae <alla fine della riga seguente nella soluzione precedente di seguito:

q?{@b'gA<       p      <

Nuova soluzione concettuale (89 byte) con spiegazione animata:

q?@ <
 q?{@b'gA<       p      <
p?<@`zzuB`b'%~5F@<f`zziF`b'<
>N@9P~0+.~@~-";~P"#"_"1F3~%d

Layout esagonale:

   q ? @   <
    q ? { @ b ' g A <               p             <
 p ? < @ ` z z u B ` b ' % ~ 5 F @ < f ` z z i F ` b ' <
> N @ 9 P ~ 0 + . ~ @ ~ - " ; ~ P " # " _ " 1 F 3 ~ % d

Animazione dei primi 326 tick a 2 fps, con stack locali e globali, e output su STDOUT.

beeswax FizzBuzz animation


Per un confronto, di seguito sono riportati gli overlay di percorso della soluzione più vecchia e complessa. Forse è anche la soluzione più bella, dal punto di vista visivo;)

Program with path overlay


2
Questo è pazzo e bello come Hexagony. Prendi un +1!
ETHproductions

@ETHproductions Ho ancora bisogno di provare Hexagony, ma da quello che posso dire dalle specifiche della lingua, la mia cera d'api non si avvicina nemmeno alla follia di Hexagony.
ML


Come stai realizzando quelle animazioni?
baordog,

18

> <> , 68 66 65 64 byte

1\2+2foooo "Buzz"<
o>:::3%:?!\$5%:?!/*?n1+:aa*)?;a
o.!o"Fizz"/oo

L'unico trucco è moltiplicare i resti come condizione per la stampa numerica. In questo modo, se uno di questi è 0, non stamperemo il numero.

Puoi provarlo qui .

Salvato un byte grazie a Sp3000 e un altro grazie a randomra. Grazie molto!


1
Molto ben golfista, adoro il riutilizzo del "\" sulla prima riga e quello sulla seconda riga.
Cole

1
-1 byte se si sposta la ofine della seconda riga nello spazio vuoto all'inizio della riga, credo.
Sp3000,

@ Sp3000 In effetti, ho passato così tanto tempo a giocare a golf, non so come questo non mi sia venuto in mente
Aaron,

1
Chi ha bisogno del ronzio quando puoi avere foooo Buzz?
caird coinheringaahing

17

gs2 , 28 27 (senza f)

Esadecimale:

1b 2f fe cc 04 46 69 7a 7a 09 07 42 75 7a 7a 19 06 27 2d d8 62 32 ec 99 dc 61 0a

Spiegazione:

1b    100
2f    range1 (1..n)
fe    m: (map rest of program)

cc    put0 (pop and store in register 0)
04    string-begin
Fizz
09    9
07    string-separator
Buzz
19    25
06    string-end-array (result: ["Fizz"+chr(9) "Buzz"+chr(25)])

27    right-uncons
2d    sqrt
d8    tuck0 (insert value of register 0 under top of stack)
62    divides
32    times (string multiplication)
ec    m5 (create block from previous 5 tokens, then call map)

99    flatten
dc    show0 (convert register 0 to string and push it)
61    logical-or
0a    newline

Incorporare 3 e 5 nella costante di stringa non funziona perché \x05termina i valori letterali di stringa.

Nota: questo problema può essere risolto in 1 byte con gs2 utilizzando il built-in f.


16

C, 85 byte

i;main(){for(;i++<=99;printf("%s%s%.d\n",i%3?"":"Fizz",i%5?"":"Buzz",(i%3&&i%5)*i));}

-2 grazie a schizzinosi.


Cerca di compilare qui ma non gccriconosce la nuova riga all'interno della stringa come \ n. Mi dà un errore di compilazione. Devo passare qualche parametro al compilatore? A proposito, ti sei perso <=nel tuo post (ho contato 88 byte con <= ... quindi suppongo che manchi).
wendelbsilva,

oops. perso l'errore negli avvisi. Aggiunge 2 caratteri.
AShelly,

Le variabili globali sono inizializzate su zero, quindi invece di main(i)provare i;main(). Quindi puoi sbarazzarti di i--all'inizio del for()ciclo. Non è nemmeno necessaria l'interruzione di linea. Ciò dovrebbe portare il conteggio dei byte a 85.
ossifrage squeamish

2
A seconda di come UB vuoi ottenere, puoi fare 73, 74 o 75 byte. Ecco la mia risposta a 74 byte .
Lynn,

1
OMG ho trascorso forse 3 ore a cercare di ottenere questa cosa con solo un byte più piccolo. Ecco qui. Sostituiscilo (i%3&&i%5)*icon i%3*i%5?i:0vado a letto
Albert Renshaw,

16

CJam, 35 byte

100{)_[Z5]f%:!"FizzBuzz"4/.*s\e|N}/

Provalo online nell'interprete CJam .

Come funziona

100{)_[Z5]f%:!"FizzBuzz"4/.*s\e|N}/
100{                             }/  For each integer I between 0 and 99:
    )_                                 Increment I and push a copy.
      [Z5]                             Push [3 5].
          f%                           Map % to push [(I+1)%3 (I+1)%5].
            :!                         Apply logical NOT to each remainder.
              "FizzBuzz"4/             Push ["Fizz" "Buzz"].
                          .*           Vectorized string repetition.
                            s\         Flatten the result and swap it with I+1.
                              e|       Logical OR; if `s' pushed an empty string,
                                       replace it with I+1.
                                N      Push a linefeed.

3
Soluzione più semplice:100{):I3%!"Fizz"*I5%!"Buzz"*+Ie|N}/
aditsu,

16

MUMPS, 56 54 byte

f i=1:1:100 w:i#5=0 "Fizz" w:i#3=0 "Buzz" w:$X<3 i w !

Cos'è questa w:$X<3 icosa, chiedi? $Xè una variabile magica (un "intrinseco") che memorizza la posizione orizzontale del cursore di output (come un numero di caratteri dal bordo sinistro del terminale). wè la forma abbreviata del WRITEcomando. La sintassi command:condition argsè post-condizionale - "if condition, then docommand args ".

Quindi stiamo verificando se il cursore di output è stato avanzato di più di due caratteri (il che significherebbe che almeno uno "Fizz"o "Buzz"è stato scritto sul terminale) e, in caso contrario, la scrittura isul terminale. La $Xvariabile - e quindi questa sorta di profonda inseparabilità dal terminale - è una caratteristica di prima classe di MUMPS. Yikes.


15

Gelatina , 24 20 byte

³µ3,5ḍTị“¡Ṭ4“Ụp»ȯµ€G

Provalo online!

Come funziona

³µ3,5ḍTị“¡Ṭ4“Ụp»ȯµ€G  Main link. No input.

³                     Yield 100.
 µ                    Begin a new, monadic chain.
                 µ€   Apply the preceding chain to all integers n in [1, ..., 100].
  3,5ḍ                Test n for divisibility by 3 and 5.
      T               Get all truthy indices.
                      This yields [1] (mult. of 3, not 5), [2] (mult. of 5, not 3),
                      [1, 2] (mult. of 15) or [].
        “¡Ṭ4“Ụp»      Yield ['Fizz', 'Buzz'] by indexing in a dictionary.
       ị              Retrieve the strings at the corr. indices.
                ȯ     Logical OR hook; replace an empty list with n.
                   G  Grid; join the list, separating by linefeeds.

ancora nessuno ha giocato a golf (tranne per la risposta HQ9 + style)
noɥʇʎԀʎzɐɹƆ

15

Brainfuck, 206 byte

++>+++++>>>>>++++++++++[>+>>+>>+>+<<<[++++<-<]<,<,-<-<++<++++[<++>++++++>]++>>]>
[+[[<<]<[>>]+++<[<.<.<..[>]]<<-[>>>[,>>[<]>[--.++<<]>]]+++++<[+[-----.++++<<]>>+
..<-[>]]<[->>,>+>>>->->.>]<<]<[>+<<<,<->>>+]<]

formattato:

++>+++++>>>>>
++++++++++[>+>>+>>+>+<<<[++++<-<]<,<,-<-<++<++++[<++>++++++>]++>>]
>
[
  +
  [
    [<<]
    <[>>]
    +++<
    [
      Fizz
      <.<.<..
      [>]
    ]
    <<-
    [
      >>>
      [
        ,>>[<]
        >[--.++<<]
        >
      ]
    ]
    +++++<
    [
      Buzz
      +[-----.++++<<]
      >>+..
      <-
      [>]
    ]
    <[->>,>+>>>->->.>]
    <<
  ]
  <[>+< <<,<->>>+]
  <
]

Provalo online

Il layout della memoria è

0 a 122 105 70 b f 0 t d1 s d2 c d 10 0

dove fcicli di 3, bcicli di 5, d1è una cifra, d2è cifra decina, sè una bandiera per se stampare la cifra di decine, dcicli per 10, cè lo spazio di copia per d, tè lo spazio di lavoro che contiene 0 o dati spazzatura o una bandiera per non -divisible-by-3 e adetermina la fine del programma spostando il puntatore dopo che Buzz è stato stampato 20 volte.


14

C #, 128 126 125 124 byte

class A{static void Main(){for(var i=0;i++<100;)System.Console.Write("{0:#}{1:;;Fizz}{2:;;Buzz}\n",i%3*i%5>0?i:0,i%3,i%5);}}

89 byte senza il codice del boilerplate in giro.

Fatto con l'uso della formattazione condizionale di C # .

Con due separatori di sezione ;, Fizz o Buzz vengono stampati se il valore dalla loro condizione è zero.


Salvataggio totale di 4 byte grazie a @RubberDuck, @Timwi e @Riokmij.


Sarebbe più breve chiamare Writee aggiungere la nuova riga direttamente alla stringa, giusto?
RubberDuck,

È anche più corto di un byte scrivere i%3*i%5>0?i:0invece di i%3*i%5==0?0:i.
Timwi,

Puoi salvare un altro byte forfor(var i=0;i++<100;)
sull'istruzione

1
Puoi salvare altri tre byte sfruttando l' interpolazione delle stringhe da C # 6.0 e incorporando gli argomenti del formato nella stringa stessa (ad es. $"{(i%3*i%5>0?i:0):#}...\n")
LiamK,

1
può fare con 121 byte oggi -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");}}
Jerri Kangasniemi,

14

Clojure, 113 106 101 100 91 byte

Il mio primo golf!

(dotimes[i 100](println(str({2'Fizz}(mod i 3))({4'Buzz}(mod i 5)({2""}(mod i 3)(inc i))))))

Ungolfed:

(dotimes [i 100] ; account for off-by-one later
  (println (str ({2 'Fizz} ; str converts symbols to strings
                 (mod i 3))
                ({4 'Buzz} ; 4 instead of 0 because of off-by-one
                 (mod i 5)
                 ({2 ""} ; shortest way to write when-not
                  (mod i 3)
                  (inc i))))))

1
È possibile rimuovere 5 caratteri gestendoli printlncome nella soluzione Java , ad es. (doall(map #(let[t(=(mod % 3)0)](println(str(if t"Fizz""")(if(=(mod % 5)0)"Buzz"(if t""%)))))(range 1 101)))
resueman,

1
@resueman Grazie! In realtà ha finito per essere 7, perché (if t"Fizz""")può essere semplificato (if t"Fizz"). :)
Sam Estep,

+1 Bel trucco del modulo, all'inizio pensavo che avessi errori off-by-one.
coredump,

14

brainfuck , 411 350 277 258 byte

modifiche:

  • -61 byte memorizzando i valori di "Fizz Buzz" come "BuziF" "BuziG" e ripetendo la sezione di stampa numerica.

  • -71 byte ripetendo la sezione di stampa del numero di modulo, suddividendo il contatore di loop e il contatore di numeri e riutilizzando la cella newline come valore mod, tra le altre cose

  • -19 byte rendendosi conto che non ci sono 0 in nessun numero FizzBuzz. Inoltre aggiunta spiegazione

+[-[>+<<]>-]>--[>+>++>++>++++++>+>>>++++++[<<<]>-]<+++++[>+>+>->>->++>>>-->>>++[<<<]>>>-]>[>]+++>>[>+<<<-[<]<[>+++>+<<-.+<.<..[<]<]>>-[<<]>[.>.>..>>>>+[<]+++++<]>[>]>>[[->+>-[>+>>]>[+[-<+>]>+>>]<<<<<<]>[-<+>]>,>[>]<[>-[<+>-----]<---.,<]++++++++++>]<.<<<<,>-]

Provalo online!

Invece di verificare se il numero era divisibile per 5 o 3 avevo due contatori che tenevano traccia del modulo del numero, diminuendoli per ciascun numero e stampando la parola corrispondente quando raggiungevano 0.

Come funziona:

+[-[>+<<]>-]>--  Generate the number 61
[>+>++>++>++++++>+>>>++++++[<<<]>-] Set the tape to multiples of 61
TAPE: 0 0' 61  122 122 110 61  0 0 110
           "=" "z" "z" "n" "="
<+++++[>+>+>->>->++>>>-->>>++[<<<]>>>-]>[>]+++>> Modify values by multiples of 5
TAPE: 0' 5 66  117 122 105 71  3 0 100' 0 0 10
           "B" "u" "z" "i" "G"
Some info:
  5     - Buzz counter
  "Buz" - Buzz printing
  "ziG" - Fizz printing. Modifying the G in the loop is shorter than modifying it outside
  3     - Fizz counter
  0     - This is where the Fizz|Buzz check will be located
  100   - Loop counter
  0     - Number counter. It's not worth it to reuse the loop counter as this.
  0     - Sometimes a zero is just a zero
  10    - Value as a newline and to mod the number by

[ Loop 100 times
  >+<<<  Increment number counter
  -[<]<  Decrement Fizz counter
  [ If Fizz counter is 0
    >+++ Reset the Fizz counter to 3
    >+<< Set the Fizz|Buzz check to true
    -.+<.<.. Print "Fizz"
  [<]<] Sync pointers
  >>-[<<]> Decrement Buzz counter
  [ If Buzz counter is 0
    .>.>.. Print "Buzz"
    >>>>+  Set the Fizz|Buzz check to true
    [<]+++++< Reset the Buzz counter to 5
  ]
  >[>]>> Go to Fizz|Buzz check
  [ If there was no Fizz or Buzz for this number
    TAPE: 3% BuziG 5% 0 Loop Num' 0 10
    [->+>-[>+>>]>[+[-<+>]>+>>]<<<<<<]  Mod the number counter by 10
    TAPE: 3% BuziG 5% 0 Loop 0' Num 10-Num%10 Num%10 Num/10
    >[-<+>] Move Num back in place
    >,>[>]< Reset 10-Num%10
    [ For both Num/10 (if it exists) and Num%10
      >-[<+>-----]<--- Add 48 to the number to turn it into the ASCII equivilent
      .,< Print and remove
    ]
    ++++++++++> Add the 10 back
  ]
  <. Print the newline
  <<<<, Remove Fizz|Buzz check
  >- Decrement Loop counter
]

Ben fatto Jo! Un giorno potrei provare a batterlo :)
Forzato Vintier il

13

PowerShell, 78 68 61 54 byte

1..100|%{(($t="Fizz"*!($_%3)+"Buzz"*!($_%5)),$_)[!$t]}

Modifica: salvato 10 byte grazie a feersum

Edit2: ho realizzato che con il trucco di feersum non ho più bisogno di formulare $ t come blocchi di stringhe di codice

Edit3: salvato altri 7 byte grazie a Danko Durbić

Simile nello spirito alla risposta del codice Rosetta di serie , ma è sceso un po 'giù.

Spiegazione

1..100|%{...} Crea una raccolta da 1 a 100, quindi esegui per ogni oggetto in quella raccolta

(...,$_)crea una nuova raccolta di due elementi: 0) $t=...imposta la variabile $tuguale a una stringa; 1) il $_nostro numero corrente del loop

"Fizz"*!($_%3)prendi il nostro numero corrente, modificalo di 3, quindi NON il risultato. Moltiplica "Fizz" per quello e aggiungilo alla stringa (e simile per 5). PowerShell considera qualsiasi numero diverso da zero come $TRUE, e quindi il NOT di un numero diverso da zero è 0, il che significa che solo se il nostro numero corrente è un multiplo di 3 "Fizz" verrà aggiunto alla stringa.

[!$t] si indicizza nella raccolta che abbiamo appena creato, in base al valore della stringa $t : non vuota, stampala, altrimenti stampa il nostro numero corrente


In alternativa, anche 54 byte

1..100|%{'Fizz'*!($_%3)+'Buzz'*!($_%5)-replace'^$',$_}

Grazie a TesselatingHeckler

Simile nel concetto, questo utilizza l'inline -replace operatore e un'espressione regolare per scambiare una stringa vuota ^$con il nostro numero corrente. Se la stringa non è vuota, non viene scambiata.


In alternativa, anche 54 byte

1..100|%{($_,('Fizz'*!($_%3)+'Buzz'*!($_%5))|sort)[1]}

Questa è la stessa struttura ad anello di cui sopra, ma al suo interno ordina la coppia (n, stringa) e si basa sul fatto che una stringa vuota ordina prima di un numero, ma una stringa FizzBuzz ordina dopo un numero. Quindi indicizza il risultato del secondo ordinamento.


A parte questo, se PowerShell avesse mai implementato l' ||operatore, come in C #, potremmo probabilmente scendere a 43 byte con qualcosa di simile a 1..100|%{"Fizz"*!($_%3)+"Buzz"*!($_%5)||$_}... dubbio, dato che si |tratta di un operatore speciale così importante in PowerShell, ma posso sognare ...
AdmBorkBork,

1
Che ne dici 1..100|%{'Fizz'*!($_%3)+'Buzz'*!($_%5)-replace'^$',$_}di 54?
Tessellating Heckler,

Puoi sostituirlo if($t){$t}else{$_}con qualcosa del genere($t,$_)[!$t]
Danko Durbić,

1
... quindi ottieni 1..100|%{(($t="Fizz"*!($_%3)+"Buzz"*!($_%5)),$_)[!$t]}anche 54 come il suggerimento di @ TessellatingHeckler
Danko Durbić,

@TessellatingHeckler PowerShell è nulla se non flessibile.
AdmBorkBork,

13

JavaScript, 62 byte

for(i=0;++i<101;console.log(i%5?f||i:f+'Buzz'))f=i%3?'':'Fizz'

Penso che questa sia la soluzione Javascript più corta ora.


Wow solo Wow! Ma tutte le altre risposte JS usano console.log; è molto meno fastidioso che dover premere "OK" su 100 caselle pop-up di fila. Potresti cambiare questo, per favore? Sarà solo 62 byte, ancora tre meglio del mio.
ETHproductions

Domani dovrò farlo, dato che ho già modificato 5 dei miei post e non posso più modificarli ...
Mama Fun Roll

2
Oh, non avevo realizzato che ci fosse un limite al montaggio ...
ETHproductions

12

C, 74 byte

main(i){for(;i<101;puts(i++%5?"":"Buzz"))printf(i%3?i%5?"%d":0:"Fizz",i);}

L' 0argomentazione printfinvece di ""è sospetta, ma sembra funzionare sulla maggior parte delle piattaforme su cui ci provo.putssegfault quando provi la stessa cosa, però. Senza di essa, si ottengono 75 byte.

Esistono soluzioni a 73 byte che funzionano sul golf dell'anarchia e ne ho trovata una che scava nei posti giusti su Internet, ma si basano su comportamenti specifici della piattaforma. (Come avrai intuito, è una specie di forma puts("Buzz"±...).)


Bel trucco per ottenere i = 1 per il caso no args (argc = 1). È una caratteristica: puoi iniziare la sequenza da qualsiasi punto eseguendo ./fizzbuzz $(seq 40): P
Peter Cordes

12

Scratch, 203 185 byte

Byte conteggiati dalla rappresentazione testuale golfizzata , per questo meta post . Scratch non è molto efficiente in termini di spazio.

sayè la cosa più vicina a uno stdout Scratch: lo sprite mostra un fumetto contenente tutto ciò che sta dicendo. In pratica, wait n secssarebbe necessario un blocco per leggere effettivamente questo output, ma ai fini di questa sfida questo codice soddisfa i requisiti.


Ti mancano i numeri dopo il y =(in entrambi i casi)
Decadimento beta

@BetaDecay Siamo spiacenti? Non seguo
Timoteo,

All'interno del ciclo di ripetizione, set y to ...manca un valore
Decadimento beta

1
@BetaDecay Questa è la stringa vuota. :) se fai clic sull'immagine, puoi vederla in azione!
Timoteo,

Ohhh haha ​​scusa per aver dubitato di te;)
Decadimento beta

12

R, 88 83 77 71 70 byte

Sono sicuro che questo può essere migliorato ... ed è stato merito di @flodel. Un altro paio di byte salvati grazie a un suggerimento di @njnnja e un altro di @ J.Doe

x=y=1:100;y[3*x]='Fizz';y[5*x]='Buzz';y[15*x]='FizzBuzz';write(y[x],1)

Una risposta da gatto. Il mouse è sopra :)
Silviu Burcea,

1
Ho trovato un po 'meglio:x=1:100;i=!x%%3;j=!x%%5;x[i]="Fizz";x[j]="Buzz";x[i&j]="FizzBuzz";cat(x,sep="\n")
flodel,

@njnnja Grazie per il suggerimento. L'ho implementato writepiuttosto che catattraverso
MickyT il

2
Negromanzia qui! La writechiamata può richiedere un 1 invece di una stringa vuota, quindi x=y=1:100;y[3*x]='Fizz';y[5*x]='Buzz';y[15*x]='FizzBuzz';write(y[x],1)è un banale golf da 1 byte per 70 byte.
J.Doe,

68 byte . Il bytecount include tre backspaces non stampabili e non funziona correttamente in TIO.
J.Doe,

12

Haskell, 84 byte

main=mapM f[1..100]
f n|d<-drop.(*4).mod n=putStrLn$max(show n)$d 3"Fizz"++d 5"Buzz"

Avvicinarsi agli 81 byte di henkma , ma non ancora del tutto.

d = drop.(*4).mod nè la chiave qui: d 3 "Fizz"è drop (n`mod`3 * 4) "Fizz". Questo è "Fizz"quando n `mod` 3è 0 e in caso ""contrario.


Riassetto golfs giù a 82, credo: (%)=drop.(*4).mod n;main=mapM putStrLn[max(show n)$3%"Fizz"++5%"Buzz"|n<-[0..100]].
CR Drost,

Aspetta, quindi nnon rientra nell'ambito. Hm.
CR Drost,

Sì, non funziona, ma ho trovato una soluzione alternativa a 85 byte che assomiglia molto a questo:main=mapM putStrLn[max(show n)$3%"Fizz"++5%"Buzz"|n<-[0..100],(%)<-[drop.(*4).mod n]]
Lynn,

Perché non usare un'interruzione di linea? È corto come un punto e virgola ma meno illeggibile.
dfeuer

1
Ti suggerisco di riconsiderare la tua ricerca di codice leggibile su un sito web di golf da codice :)
Lynn,

11

PHP, 54 byte

<?for(;$i++<100;)echo[Fizz][$i%3].[Buzz][$i%5]?:$i,~õ;

Valido per v5.5 in poi. Il õpersonaggio è 245, un po 'invertito\n .

Presumo le impostazioni predefinite dell'interprete, in quanto sono senza ini. Se non si è sicuri, è possibile disabilitare la propria ini locale con-n come in php -n fizzbuzz.php.

Una versione che verrà eseguita senza errori con qualsiasi file di configurazione è di 62 byte :

<?php
for(;$i++<100;)echo@([Fizz][$i%3].[Buzz][$i%5]?:$i),"
";

L'operatore STFU @ non significa necessariamente che il codice sia privo di errori.
sitilge,


@Kzqai ideone.com/0zRA9e short_open_tag è spento, E_NOTICEè acceso. Nessuna di queste sono impostazioni predefinite.
primo

Ricevo un sacco di errori su 3v4l.org
un programmatore il

Meta post rilevante di @acoder . 3v4l.org sembra utile.
primo

11

80386 codice macchina + DOS, 75 byte

Hexdump del codice:

0D 0A 24 B1 64 33 C0 BA-03 05 BB 00 01 40 50 FE
CE 75 0C 83 EB 04 66 C7-07 42 75 7A 7A B6 05 FE
CA 75 0C 83 EB 04 66 C7-07 46 69 7A 7A B2 03 84
FF 74 0C D4 0A 04 30 4B-88 07 C1 E8 08 75 F4 52
8B D3 B4 09 CD 21 5A 58-E2 C0 C3

Codice sorgente (sintassi TASM):

    .MODEL TINY

    .CODE
    .386
    org 100h

MAIN PROC
    db 13, 10, '$'
    mov cl, 100
    xor ax, ax
    mov dx, 503h

main_loop:
    mov bx, 100h
    inc ax
    push ax

    dec dh
    jnz short buzz_done
    sub bx, 4
    mov dword ptr [bx], 'zzuB'
    mov dh, 5
buzz_done:

    dec dl
    jnz short fizz_done
    sub bx, 4
    mov dword ptr [bx], 'zziF'
    mov dl, 3
fizz_done:

    test bh, bh
    jz short num_done

decimal_loop:
    aam;
    add al, '0'
    dec bx
    mov [bx], al
    shr ax, 8
    jnz decimal_loop

num_done:
    push dx
    mov dx, bx;
    mov ah, 9
    int 21h
    pop dx
    pop ax

    loop main_loop
    ret

MAIN ENDP
    END MAIN

Questo codice conta da 1 a 100 pollici ax, costruendo il messaggio di output dalla fine all'inizio. La fine del messaggio (newline e il $carattere che DOS usa per il flag di fine messaggio) appare all'inizio del codice:

db 10, 10, '$'

Viene eseguito come un'istruzione innocua (or ax, 240ah ). Potrei metterlo in un posto più convenzionale, come dopo la fine del codice, ma averlo all'indirizzo 0x100 ha un vantaggio.

Il codice utilizza anche 2 contatori aggiuntivi:

  • Conteggio da 3 a 0 pollici dl
  • Conteggio da 5 a 0 pollici dh

Quando un contatore raggiunge 0, invia la stringa Fizzo Buzzalla fine del messaggio di output. Se ciò accade, bxverrà ridotto ebh sarà zero. Questo è usato come condizione per emettere il numero in forma decimale.

Nota: sto usando i dati a 32 bit qui. Questo non funzionerà su un computer pre-386.


TASM gestisce davvero costanti di caratteri multi-byte nell'ordine opposto rispetto a NASM ? In NASM, scrivi mov [mem], 'Fizz'per memorizzare Fizzin quell'ordine in memoria, facendo corrispondere le dbdirettive. Ad esempio, vedi il mio YASM FizzBuzz "efficiente" troppo complicato .
Peter Cordes,

1
Salva qualche byte da usare std, quindi stosb/ stosd? Dovresti sostituire test bh,bhcon cmp di, 100ho qualcosa del genere. Invece di salvare / ripristinare il contatore in AL, è possibile mantenerlo in BL e bloccare ogni volta che lo si desidera. Ad esempio sub bx, 4/ mov dword ptr [bx], 'zzuB'è 3 + 7 byte, giusto? mov eax, 'zzuB' / stosdè 6 + 2 byte (prefisso di dimensione dell'operando su entrambi). Sarebbe bello se la risposta includesse lo smontaggio in modo che le dimensioni delle istruzioni fossero visibili.
Peter Cordes,

1
Questa è un'ottima risposta: abusare delle istruzioni benigne per i dati e utilizzare lo spazio di memoria PSP mai usato. @PeterCordes Ho giocato con i tuoi suggerimenti usando stosdma non sono riuscito a ottenere da solo una riduzione del punteggio. Poiché in seguito i stosddecrementi DInon si perde il sub di, 4e quindi si hanno DI4 byte di sconto alla fine. Sono stato in grado di -6 bytesutilizzare alcune altre modifiche minori che ho finito per pubblicare come risposta separata (solo perché non potevo inserirmi in un commento). Complimenti!
640 KB

11

dc, 64 62 byte

[[Fizz]P]sI[[Buzz]P]sU[dn]sNz[zdd3%d0=Ir5%d0=U*0<NAPz9B>L]dsLx

Ungolfed:

[[Fizz]P]sI  # macro I: print "Fizz"
[[Buzz]P]sU  # macro U: print "Buzz"
[dn]sN       # macro N: print current stack depth

z            # increase stack depth

[            # Begin macro
  zdd           # Get current stack depth and ducplicate it twice
  3%d0=I        # Check modulo 3 and leave a duplicate. If it's 0, run macro I
  r             # Rotate top two elements, bringing up the stack depth again
  5%d0=U        # Check modulo 5 and leave a duplicate. It it's 0, run macro U
  *             # Multiply the duplicates of modulos of 3 and 5 ...
  0<N           # ... if it's not 0, run macro N
  AP            # Print a newline (`A` is 10)
                # The macro leaves the stack with one more element each time
  z9B>L      # Run macro L if stack depth is less than "ninety eleven" (101)
]         # End macro

dsLx  # store the macro in register L and execute it
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.