196
\$\begingroup\$

Introduction

In our recent effort to collect catalogues of shortest solutions for standard programming exercises, here is PPCG's first ever vanilla FizzBuzz challenge. If you wish to see other catalogue challenges, there is "Hello World!" and "Is this number a prime?".

Challenge

Write a program that prints the decimal numbers from 1 to 100 inclusive. But for multiples of three print “Fizz” instead of the number and for the multiples of five print “Buzz”. For numbers which are multiples of both three and five print “FizzBuzz”.

Output

The output will be a list of numbers (and Fizzes, Buzzes and FizzBuzzes) separated by a newline (either \n or \r\n). A trailing newline is acceptable, but a leading newline is not. Apart from your choice of newline, the output should look exactly like this:

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

The only exception to this rule is constant output of your language's interpreter that cannot be suppressed, such as a greeting, ANSI color codes or indentation.

Further Rules

  • This is not about finding the language with the shortest approach for playing FizzBuzz, this is about finding the shortest approach in every language. Therefore, no answer will be marked as accepted.

  • Submissions are scored in bytes in an appropriate preexisting encoding, usually (but not necessarily) UTF-8. Some languages, like Folders, are a bit tricky to score--if in doubt, please ask on Meta.

  • Nothing can be printed to STDERR.

  • Feel free to use a language (or language version) even if it's newer than this challenge. If anyone wants to abuse this by creating a language where the empty program generates FizzBuzz output, then congrats for paving the way for a very boring answer.

    Note that there must be an interpreter so the submission can be tested. It is allowed (and even encouraged) to write this interpreter yourself for a previously unimplemented language.

  • If your language of choice is a trivial variant of another (potentially more popular) language which already has an answer (think BASIC or SQL dialects, Unix shells or trivial Brainfuck derivatives like Alphuck and ???), consider adding a note to the existing answer that the same or a very similar solution is also the shortest in the other language.

  • Because the output is fixed, you may hardcode the output (but this may not be the shortest option).

  • You may use preexisting solutions, as long as you credit the original author of the program.

  • Standard loopholes are otherwise disallowed.

As a side note, please don't downvote boring (but valid) answers in languages where there is not much to golf; these are still useful to this question as it tries to compile a catalogue as complete as possible. However, do primarily upvote answers in languages where the authors actually had to put effort into golfing the code.

Catalogue

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>

\$\endgroup\$
14
  • 1
    \$\begingroup\$ Nothing can be printed to STDERR. Is this true only when running, or also when compiling (assuming that is a separate step?) \$\endgroup\$
    – AShelly
    Sep 24, 2015 at 20:47
  • 1
    \$\begingroup\$ @AShelly Only when running \$\endgroup\$
    – Beta Decay
    Sep 24, 2015 at 20:48
  • 1
    \$\begingroup\$ I’m not sure I like the fact that you hardcoded the 100 into the challenge. That way, a program that just generates the expected output is a valid entry, but is not interesting for this challenge. I think the challenge should expect the program to input the number of items to output. \$\endgroup\$
    – Timwi
    Sep 24, 2015 at 23:28
  • 9
    \$\begingroup\$ @Timwi While I agree that it would make it (only slightly) more interesting, I've very often seen FizzBuzz as strictly 1 to 100 (on Wikipedia and Rosetta Code, for example). If the goal is to have a "canonical" FB challenge, it makes sense. \$\endgroup\$
    – Geobits
    Sep 25, 2015 at 0:50
  • 76
    \$\begingroup\$ A "vanilla fizzbuzz" sounds delicious. \$\endgroup\$ Sep 25, 2015 at 15:12

416 Answers 416

1
\$\begingroup\$

Pinecone, 90 bytes

i:1|i<101|i:i+1@(i%3+i%5=0?print:"FizzBuzz"|i%3=0?print:"Fizz"|i%5=0?print:"Buzz"|print:i)
\$\endgroup\$
1
\$\begingroup\$

BRASCA, 58 bytes

1Hr,[0a:3%0=[a0`zziF`[o]]x:5%0=[a0`zzuB`[o]]A$=[x:n0]xxlo]

Try it online!

\$\endgroup\$
1
\$\begingroup\$

Knight, 50 48 43 bytes

;=n 0W>101=n+1nO|+*"Fizz"!%n 3*"Buzz"!%n 5n

Try it online!

-2 bytes: use string multiplication instead of IF

-5 bytes: I completely overlooked |, I assumed it had C semantics.

Ungolfed:

# start with n at 0
; = n 0
# increment n and loop while less than 101
: WHILE > 101 (= n + 1 n)
    # outlined from the output for clarity
    # concatenate:
    ; = fizzbuzz +
        # Fizz if n % 3 == 0
        : * "Fizz" ! (% n 3)
        # Buzz if n % 5 == 0
        : * "Buzz" ! (% n 5)
    # If fizzbuzz is not empty, output it, otherwise output n
    : OUTPUT | fizzbuzz n
\$\endgroup\$
1
\$\begingroup\$

C++20, 202 bytes

this is uncompetitive, but this was so fun I couldn't help but post it here.

#include <bits/stdc++.h>
using namespace std;auto f=[](int i){return i%15?(i%5?(i%3?to_string(i):"Fizz"):"Buzz"):"FizzBuzz";};int main(){for(auto i:views::iota(1,100)|views::transform(f))cout<<i<<endl;}
\$\endgroup\$
2
  • 1
    \$\begingroup\$ you have an extra space in 1, 100 \$\endgroup\$
    – hyper-neutrino
    Jul 14, 2021 at 3:19
  • \$\begingroup\$ @hyper-neutrino oh darn thanks \$\endgroup\$ Jul 14, 2021 at 3:23
1
\$\begingroup\$

PostScript, 73 bytes

Using binary encoding:

000000 31 88 01 88 64 7b 2f 69 92 3e 92 33 28 46 69 7a
000010 7a 42 75 7a 7a 29 69 88 0f 28 42 75 7a 7a 29 69
000020 20 35 28 46 69 7a 7a 29 69 88 03 33 7b 92 6a 30
000030 92 3d 7b 2f 69 92 3e 92 33 7d 7b 92 75 7d 92 55
000040 7d 92 83 69 20 3d 7d 92 48

Try it online! (thanks to tail spark rabbit ear, ignore TIO's character count).

This is a straight-forward encoding of the following 101 byte program (in binary encoding, 136 n is a signed 8-bit integer and 146 n is command n from the system name encoding list in appendix F of the PostScript language reference).

1 1 100{/i exch def(FizzBuzz)i 15(Buzz)i 5(Fizz)i 3 3{mod 0 eq{/i exch def}{pop}ifelse}repeat i =}for

Try it online!

The non-binary encoded version can be reduced to 98 bytes if we don't mind leaving /i on the stack.

/i 1 1 100{def(FizzBuzz)i 15(Buzz)i 5(Fizz)i 3 3{mod 0 eq{/i exch def}{pop}ifelse}repeat i =/i}for

Try it online!

\$\endgroup\$
2
  • 1
    \$\begingroup\$ I made you a TIO thing of the binary. \$\endgroup\$
    – user100411
    Aug 8, 2021 at 9:16
  • 1
    \$\begingroup\$ @tailsparkrabbitear: Thanks for that. I hadn't even considered that the TIO bash would include Ghostscript. Perhaps put a note on the Postscript Code Golf tips page. \$\endgroup\$ Aug 8, 2021 at 12:22
1
\$\begingroup\$

jq, 98 82 bytes

range(1;101)|if.%15<1then"FizzBuzz"elif.%3<1then"Fizz"elif.%5<1then"Buzz"else. end

Try it online!

Yet to golf it!

Removed superfluous spaces thanks to @DLosc.

\$\endgroup\$
2
  • 1
    \$\begingroup\$ Some simple golfs get you down to 82 bytes \$\endgroup\$
    – DLosc
    Sep 4, 2021 at 4:00
  • \$\begingroup\$ Thanks @DLosc, I didn't realize you could remove the spaces! \$\endgroup\$
    – AviFS
    Sep 4, 2021 at 4:31
1
\$\begingroup\$

Rockstar, 138 135 133 bytes

F takes I&S
let M be N/I
turn up M
if N-I*M
S's""

return S

N's0
while N-100
let N be+1
say F taking 3,"Fizz"+F taking 5,"Buzz" or N

Try it here (Code will need to be pasted in)

\$\endgroup\$
1
\$\begingroup\$

Pure Bash, 70 bytes 69 bytes 68 bytes 63 + 1 = 64 bytes

The following program must be saved as x, which is for 1 byte of penalty.

''
((++x%3))||Fizz
((x%5))||$_\Buzz
echo ${_:-$x}
((x>99))||. x

Try it online!

\$\endgroup\$
2
  • \$\begingroup\$ OBTW I am outputting garbages to stderr, which may be against the rules. \$\endgroup\$
    – user100411
    Nov 11, 2021 at 22:30
  • \$\begingroup\$ outgolfed \$\endgroup\$ Nov 5, 2022 at 3:01
1
\$\begingroup\$

RickRoll-Lang, 185 bytes

takemetourheart
give a up [*range(1,101)[::-1]]
togetherforeverandnevertopart
give i up a.pop()
give s up "Fizz"*(i%3<1)+"Buzz"*(i%5<1)
ijustwannatelluhowimfeeling [str(i),s][s>""]+"\n"

Explanation:

RickRoll-Lang keywords do not need spaces between them

takemetourheart                                   -- main() function declaration
give a up [*range(1,101)[::-1]]                   -- set a to reverse of int range [1, 101)
togetherforeverandnevertopart                     -- infinite loop
give i up a.pop()                                 -- pop last element of a and store in i
give s up "Fizz"*(i%3<1)+"Buzz"*(i%5<1)           -- string multiplcation to form fizzbuzz depending on modulus remainders
ijustwannatelluhowimfeeling [str(i),s][s>""]+"\n" -- print i if s is empty else s and a newline
                                                  -- implicit "say goodbye" (end block) at the end
                                                  -- another say goodbye

Try it online!

\$\endgroup\$
1
\$\begingroup\$

jq, 78 bytes

range(1;101)|. as $n|[(select(.%3==0)|"Fizz"),(select(.%5==0)|"Buzz")]|add//$n
\$\endgroup\$
1
\$\begingroup\$

Kotlin, 117 bytes

{for(i in 1..100){println("${if(i%3<1)"fizz" else ""}${if(i%5<1)"buzz" else ""}${if(!(i%3<1||i%5<1))"$i" else ""}")}}

Try it online!

as usual as it gets

edit: i hope the extra \n at the end is not a problem

\$\endgroup\$
1
\$\begingroup\$

JavaScript (code.golf), 62 56 bytes

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

This is a code.golf version, which allows usage of print instead console.log.

Here is the un-code.golfed version:

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

SQLite, 183 bytes

WITH F AS(SELECT 1 AS N UNION ALL SELECT N+1 FROM F WHERE N<100)SELECT CASE WHEN N%15=0 THEN'FizzBuzz'WHEN N%5=0 THEN'Buzz'WHEN N%3=0 THEN'Fizz'ELSE CAST(N AS VARCHAR)END AS F FROM F;

Try it online!

Ungolfed code:
WITH F AS(
  SELECT 
    1 AS N 
  UNION ALL 
  SELECT 
    N + 1 
  FROM 
    F 
  WHERE 
    N < 100
) 
SELECT 
  CASE WHEN N % 15 = 0 THEN 'FizzBuzz' WHEN N % 5 = 0 THEN 'Buzz' WHEN N % 3 = 0 THEN 'Fizz' ELSE CAST(N AS VARCHAR) END AS F 
FROM 
  F;
\$\endgroup\$
1
\$\begingroup\$

Boo, 114 bytes

for i in range(1,101):
 if i%15==0:print'FizzBuzz'
 elif i%5==0:print'Buzz'
 elif i%3==0:print'Fizz'
 else:print i

Try it online!

\$\endgroup\$
1
\$\begingroup\$

Squirrel, 131 bytes

for(local i=0;i++<100;)if(i%15==0)print("FizzBuzz\n")else if(i%5==0)print("Buzz\n")else if(i%3==0)print("Fizz\n")else print(i+"\n")

Try it online!

This is the original code that I created:

function fizzBuzz(n) {
  for (local i = 1; i <= n; i += 1) {
    if (i % 15 == 0)
      print ("FizzBuzz\n")
    else if (i % 5 == 0)
      print ("Buzz\n")
    else if (i % 3 == 0)
      print ("Fizz\n")
    else {
      print (i + "\n")
    }
  }
}

fizzBuzz(100);
\$\endgroup\$
1
\$\begingroup\$

Pascal, 162 B

See also Free Pascal. This program, however, requires a processor supporting features of ISO standard 10206 “Extended Pascal”, specifically the :0 width specifier in conjunction with string/char values. Usually, for numeric arguments the n in write(42:n) specifies a minimum width the decimal representation shall occupy. With string values, however, it specifies the exact width, i. e. possibly zero.

program p(output);var i:1..100;begin for i:=1 to 100 do if 0 in[i mod 3,i mod 5]then writeLn('Fizz':4*ord(i mod 3=0),'Buzz':4*ord(i mod 5=0))else writeLn(i:1)end.

For sake of readability the ungolfed version of above code plus some explanatory comments:

program fizzBuzz(output);
    var
        i: integer;
    begin
        { Remember, in Pascal `for`-loop limits are inclusive. }
        for i := 1 to 100 do
        begin
            { Create a `set of integer` and check membership of `0`: }
            if 0 in [i mod 3, i mod 5] then
            begin
                writeLn('Fizz':4 * ord(i mod 3 = 0), 'Buzz':4 * ord(i mod 5 = 0))
            end
            else
            begin
                { For numeric values `:0` would have the same effect as `:1`. }
                { Therefore this is in the `else` branch. }
                writeLn(i:1)
                { The `:1` just ensures there are no leading blanks }
                { regardless of implementation (the compiler) used. }
            end
        end
    end.

For a non-golfed version visit, for example, RosettaCode.

\$\endgroup\$
1
\$\begingroup\$

Phooey, 53 4847 bytes

[100+1@@@@%3{"Fizz">&<}&%5{"Buzz">&<}>{&$i}"
"]

Try it online!

Outgolfed the creator at his own language. 😏


[100            while cell is not 100
   +1             increment cell
   @@@@           push four copies to the stack
   %3             set cell to cell mod 3
   {              if cell is not zero
     "Fizz"            print fizz
     >&<               pop value into the next cell to mark it
   }              endif
   &              pop original value from stack
   %5{"Buzz">&<}  repeat for buzz
   >              move to the next cell
   {              if neither fizz or buzz set the next cell
     &                 Pop to the cell
     $i                print number
   }              endif 
   "\n"         print newline
                  all paths popped the value to this cell, loop
]               end

The stack and tape are all filled with a lot of junk (as in ~200 numbers on the stack 100 items on the tape) and at the end since I don't consistently move the pointer or pop the same amount of times, but I don't care. 😏

I may make fun of the interpreter, but it is a pretty nice language.

  • -5 bytes: Use stack instead of tape, and don't restore the tape and stack
  • -1 byte: Simplify the logic to avoid the extra pop (in exchange for double the stack usage 😛).
\$\endgroup\$
1
\$\begingroup\$

Assembly (MIPS, SPIM), 202 bytes

main:add$7 1
li$2 4
la$4 F
rem$6 $7 3
bnez$6 n
syscall
n:rem$5 $7 5
bnez$5 o
or$4 5
syscall
j e
o:beqz$6 e
abs$4 $7
li$2 1
syscall
e:li$2 11
li$4 10
syscall
bne$7'd'main
j$ra
.data
F:.asciiz"Fizz""Buzz"

Try it online!

Explanation

This does a lot of SPIM abuse 😏

This assumes the following features of an empty program:

  • $a3/$7 is 0
  • .data is otherwise empty and therefore page-aligned (address of F is 0x10010000)
# initial SPIM state:
#   $a0 ($4): argc
#   $a1 ($5): argv
#   $a2 ($6): envp
#   $a3 ($7): 0
main:
    add     $a3, 1         # Increment accumultor (initially 0)
    li      $v0, 4         # v0 = PRINT STRING
    la      $a1, FizzBuzz  # a1 = "Fizz\0Buzz\0"
test_fizz:
    rem     $a2, $a3, 3    # a2 = acc % 3
    bnez    $a2, test_buzz # skip if not multiple of 3
fizz:
    syscall                # print("Fizz")
test_buzz:
    rem     $a1, $a3, 5    # a3 = acc % 5
    bnez    $a1, test_num  # skip if not multiple of 5
buzz:
    or      $a0, 5         # FizzBuzz is aligned, FizzBuzz | 5 == FizzBuzz + 5
    syscall                # print("Buzz")
    j       newline        # print newline
test_num:
    beqz    $a2, newline   # skip if acc % 3 == 0
num:
    abs     $a0, $a3       # abs is shorter than move for positive nums
    li      $v0, 1         # v0 = PRINT NUMBER
    syscall                # print(acc)
newline:
    li      $v0, 11        # v0 = PRINT CHARACTER
    li      $a0, '\n'      # a0 = '\n'
    syscall                # print('\n')
    bne     $a3, 100, main # Loop if not 100 (I use 'd' to avoid a space)
    j       $ra            # return

    .data
FizzBuzz:
    .asciiz "Fizz"         # 0x10010000 = "Fizz\0"
    .asciiz "Buzz"         # 0x10010005 = "Buzz\0"
\$\endgroup\$
1
\$\begingroup\$

Whitespace(v0.3 on ideone.com), 210 bytes

code visualized with replacing space,tab,newline to 's','t','n':

sssnnsssnssstntssssnsssststtstsstnsstttnnstnssstttstttststnssttstnnstntssnntstnsnstnstnsstnssststsnsnssnstnsstssntsstnttsnnnnnssnstssttnsnttsttnttssnsnssssttsssstntstttnsstnsssssttttstsnsnstnsstnsssssnnssssnntn

Show result on ideone

Notice: This code works fine on ideone.com, though, has a wrong result on tio.com because of a difference in behavior of "putc" with a large number ( > 255 ).
Show wrong result on tio.com

Without the rule "Nothing can be printed to STDERR", this code can be shortened to 207 bytes with omitting an "end"(nnn) instruction.

Here is the disassembled code ( created with my original tool ).

push +0(0b)   # 0000: ss-s-n
mark +0(0b)   # 0004: nss-s-n
push +1(1b)   # 0009: ss-st-n
add           # 0014: tsss
dup           # 0018: sns
push +361(9b)  # 0021: ss-ststtstsst-n
push -3(2b)   # 0034: ss-ttt-n
call null     # 0040: nst--n
push +1909(11b)  # 0044: ss-stttstttstst-n
push -5(3b)   # 0059: ss-ttst-n
call null     # 0066: nst--n
mul           # 0070: tssn
jzero -0(0b)  # 0074: nts-t-n
dup           # 0079: sns
puti          # 0082: tnst
mark -0(0b)   # 0086: nss-t-n
push +10(4b)  # 0091: ss-ststs-n
dup           # 0099: sns
dup           # 0102: sns
putc          # 0105: tnss
mul           # 0109: tssn
sub           # 0113: tsst
jneg +0(0b)   # 0117: ntt-s-n
end           # 0122: nnn
mark null     # 0125: nss--n
copy +3(2b)   # 0129: sts-stt-n
swap          # 0136: snt
mod           # 0139: tstt
jneg +0(1b)   # 0143: ntt-ss-n
dup           # 0149: sns
push +97(7b)  # 0152: ss-sttsssst-n
mod           # 0163: tstt
putc          # 0167: tnss
putc          # 0171: tnss
push +122(7b)  # 0175: ss-sttttsts-n
dup           # 0186: sns
putc          # 0189: tnss
putc          # 0193: tnss
push +0(0b)   # 0197: ss-s-n
mark +0(1b)   # 0201: nss-ss-n
ret           # 0207: ntn
\$\endgroup\$
1
\$\begingroup\$

Klong [klongpy], 62 bytes

,/{Z:::[x!3;"";"Fizz"],:[x!5;"";"Buzz"];:[Z;Z;$x],:#10}'1+!100

A nifty little K-like language I found on reddit. Uses the klongpy interpreter rather than the official C Klong interpreter.

Explained

,/{...}'1+!100
       '       :" To each item (x) in...
        1+!100 :" the range [0, 100) + 1 -> [1, 100]...
  {...}        :" map the function described in the next code block
,/             :" join into a single string
Z:::[x!3;"";"Fizz"],:[x!5;"";"Buzz"];:[Z;Z;$x],:#10
Z::                                                   :" Define Z to be:
                   ,                                  :" The concatenation of:
   :[x!3;"";"Fizz"]                                   :" "Fizz" if x % 3 == 0, else "" (note that the condition isn't actually x % 3 == 0 - it'd need to be something like 0=x!3. The order of the truthy and falsey branches has been swapped to accomodate this)
                    :[x!5;"";"Buzz"]                  :" and "Buzz" if x % 5 == 0, else "" (same note applies as above)
                                    ;:[Z;Z;$x]        :" if Z isn't empty, return whatever Z is, else str(x)
                                              ,:#10   :" And add a newline (chr(10)) to that
\$\endgroup\$
1
\$\begingroup\$

GFortran, 138 bytes

character(8)s;do i=1,100;s=''
if(mod(i,3)<1)s='fizz';if(mod(i,5)<1)s=trim(s)//'buzz'
if(s>'')print'(A)',s;if(s<'A')print'(i0)',i;enddo;end

Try it Online!   145 bytes

Could save bytes using print*, but the output is untidy

\$\endgroup\$
1
\$\begingroup\$

Pyt, 91 bytes

11`ŕĐĐ5%⇹3%?ŕ:ŕ8⬡2+ƇĐ2ᴇ5+Ƈ7⬠Ƈ5Ș;?ŕ:ŕ8⬡2+ƇĐ9⬠Ƈ6⬡Ƈ4Ș;ǰĐĐąɬɔĐƩ?ŕ⇹ą⇹*ǰ⇹ąɬą\ǰƖ⇹ƥ:ŕŕŕƖĐƥ;⁺Đ2ᴇ⁺<łĉ

Try it online!

Code Action
1 Pushes 1
1`ŕ...ł Do... while top of stack is truthy
ĐĐ5%⇹3% Gets n mod 5 and n mod 3
?ŕ:ŕ8⬡2+ƇĐ2ᴇ5+Ƈ7⬠Ƈ5Ș; If n mod 3 is 0, push "Fizz"
?ŕ:ŕ8⬡2+ƇĐ9⬠Ƈ6⬡Ƈ4Ș; If n mod 5 is 0, push "Buzz"
ǰĐĐąɬɔĐƩ?ŕ⇹ą⇹*ǰ⇹ąɬą\ǰƖ⇹ƥ:ŕŕŕƖĐƥ; If the stack contains any letters, print only the letters; otherwise, print the number
⁺Đ2ᴇ⁺< Is the number less than 100?
ĉ Clears the stack
\$\endgroup\$
1
\$\begingroup\$

Thunno H N, \$ 27 \log_{256}(96) \approx \$ 22.22 bytes

e1+D35d%0="FBiuzzzz"Zlz*Js~

Attempt This Online!

Thunno H d, \$32 \log_{256}(96) \approx\$ 26.34 bytes

R{1+zt3%!"Fizz"*s5%!"Buzz"*+s~ZK

Attempt This Online!

Explanations:

           # The H flag implicitly pushes 100 to the stack
e1+        # Map over range(100) and add one each time:
   D       #   Duplicate the number
    35d    #   Push the digits of 35 - [3, 5]
       %0= #   Push [divisible by 3, divisible by 5]
"FBiuzzzz" #   Push string "FBiuzzzz"
Zl         #   Uninterleave to get ["Fizz", "Buzz"]
  z*J      #   Multiply element-wise and join
     s~    #   Swap and logical or with the number
           # After the map, the N flag joins by newlines
           # The H flag implicitly pushes 100 to the stack
R{         # Loop through range(100):
  1+       #   Add one
    zt     #   Triplicate so it is on the stack three times
      3%!  #   Is it divisible by 3?
"Fizz"*    #   Multiply this by the string "Fizz"
           #   i.e. push "Fizz" if it's divisible by 3, "" otherwise
       s   #   Swap so the number is back on top
5%!        #   Is it divisble by 5?
   "Buzz"* #   Multiply this by the string "Buzz"
           #   i.e. push "Buzz" if it's divisible by 5, "" otherwise
+          #   Add them togther, so we have "Fizz", "Buzz", "FizzBuzz", or ""
 s~        #   Swap and perform `or`, so we get the number if it's ""
   ZK      #   Print with a newline
           # After the loop, the d flag stops the implicit output
\$\endgroup\$
1
\$\begingroup\$

Aubergine, 225 bytes ( 222 bytes with error )

:Ba=aA-A1=ba-b1:BA-Ai+Ai+a1=bi=oA+a1:bA+a1+iA=a1-ii?		\0B*Fizz\0\0FBuzz\0[-aa=aA-aA+ai-ai=bi-bi+iA=ab-a1=oA=oB=bi-bi+B1+b1=oB+b1-aa:aB+ii=a1=aA+A1+A1-aa=aA-a1-a1=bA-a1-bA=Ab-ib-a1-AA-a1-AA-aa-a1-A1-a1=bA-a1-Ab-a1+A1-a1-iAo01


* four \0 mean NUL(ASCII 0) character

Try it online!

The equivalent pseudo code in C is like below;


#include <stdio.h>
#include <stdint.h>

#define I(x) ((intptr_t)&&x)
#define P(x) *(void*)(x)

static void nop(void) {}

int main(void) {
  intptr_t
    *cp,*cpt,t,p,
    pvars0[] =
      { I(Tj3)-I(Tj1), I(Tj2)-I(Tj1), I(Tj2)-I(Tj1), 0, I(Tc1)-I(Tj3),
        I(Lb), 3, 'F', 'i', 'z', 'z', 0, I(Lb)-I(Tx2), },
    pvars1[] =
      { I(Lj), 5, 'B', 'u', 'z', 'z', 0, I(Lc)-I(Tx2), },
    dvars[] = { I(Tc2)-I(Tj3), '0', '1', '\n', 10, },
    *pbase[] = { &pvars0[6], &pvars1[1] },
    *dbase3=&dvars[2], *dbase1=&dvars[4];
  int i=0;

Lx: // Fizz/Buzz print ( i=0 for Fizz, i=1 for Buzz )
  // decrement counter
  cp = pbase[i];
  *cp-=1;
  if ( *cp!=0 ) goto P(*(cp-1));  // skip printing and jump to Lb/Jj
  *cp+=3; // restore the counter to 3 ( add more 2 for Buzz in Lc )
  cp+=1;
  p=I(Tx1);
Tx1: // putchar loop
  putchar(*cp);
  cp+=1;
  if ( *cp!=0 ) goto P(p); // jump to Tx1
  goto P(I(Tx2)+*(cp+1)); // jump to Lb/Lc
Tx2:

Lb: // Buzz print
  i=1;
  goto Lx;

Lj: // number print and post process
  cp=pbase[0];
  // select &pvars[0] thru &pvars[2] as jump offset
  cp-=*cp;
  cp-=3;
  cpt=dbase3;
  goto P( I(Tj1)+*cp ); // jump to Tj3(when Fizz) or Tj1/Tj2
Tj1: // print the upper digit
  cp=cpt-1;
  putchar(*cp);
Tj2: // print the lower digit
  putchar(*cpt);
Tj3: // print a new line and increment the lower digit
  cp=dbase3;
  *cp+=1;
  cp+=1;
  putchar(*cp);
  cp+=1;
  i=0;
  if ( *cp!=0 ) goto Lx; // next iteration
  return 0; // exit

Lc: // after Buzz
  // add more 2 to the Buzz counter
  cp=pbase[1];
  *cp+=2;
  // switch pvars0[3] ( jump offset ) between 0 and pvars0[4]
  cp=pbase[0]-2;
  t=*cp;
  cp-=1;
  t-=*cp;
  *cp=t;
  goto P( I(Tc1)-t ); // jump to Tc1/Tj3
Tc1: // carry up
  // reset jump offsets in pvars[1],pvars[2]
  // so that the 1st "goto" in Lj jump to Tj1 instead of Tj2
  cp-=1;
  *cp=0;
  cp-=1;
  *cp=0;
  // decrement global loop counter
  cp=dbase1;
  *cp-=1;
  // decrease the lower digit by 10
  cp-=1;
  t=*cp;
  cp-=1;
  *cp-=t;
  // increment the upper digit
  cp-=1;
  *cp+=1;
  cp-=1;
  goto P(I(Tc2)-*cp); // jump to Tj3
Tc2:
  nop(); // not reached
}

Each code block handles;

  • Label Lx
    Print Fizz ( when i=0 ) or Buzz ( when i=1 ) if n is the multiple of 3 or 5.
  • Label Lb
    Just jump to Lx after setting i=1.
  • Label Lj
    Print n itself ( when Fizz or Buzz are not printed ) and do post-process.
  • Label Lc
    Carry-up operation.

In Aubergine code, each address range corresponds to;

  • 0 thru 2
    The 1st instruction :Ba has no effect, but stores pbase[].
    pbase[0] is ord(':')=58, pbase[1] is ord('B')=66.
  • 3 thru 50
    The code block with label Lx.
    Lx: =aA-A1=ba-b1:BA-Ai+Ai+a1=bi=oA+a1:bA+a1+iA, Tx1: =a1-ii
    * set i=0 ( -ii ) to implement goto Lx
  • 51
    A blank area.
  • 52 thru 72
    Stores pvars0[] and pvars1[]
  • 73 thru 135
    The code block with Label Lj.
    Lj: -aa=aA-aA+ai-ai=bi-bi+iA, Tj1: =ab-a1=oA, Tj2: =oB, TJ3: =bi-bi+B1+b1=oB+b1-aa:aB+ii
    The last instruction +ii jumps to an address out of range to stop the program.
  • 136 thru 219
    The code block with Label Lc.
    Lc: =a1=aA+A1+A1-aa=aA-a1-a1=bA-a1-bA=Ab-ib, Tc1: -a1-AA-a1-AA-aa-a1-A1-a1=bA-a1-Ab-a1+A1-a1-iA
  • 220 thru 224
    Stores dvars[]
    This area is accessed via minus addresses such as dbase1=-1 or dbase3=-3.

The 222 bytes version, which is shown below, outputs some error.

:Ba=aA-A1=ba-b1:BA-Ai+Ai+a1=bi=oA+a1:bA+a1+iA=a1-ii?		\0Q*Fizz\0\0\x9aBuzz\0=a1=aA+A1+A1-aa=aA-a1-a1=bA-a1-bA=Ab+ib-a1-AA-a1-AA-aa-a1-A1-a1=bA-a1-Ab-a1+A1-a1+iA-aa=aA-aA+ai-ai=bi-bi+iA=ab-a1=oA=oB=bi-bi+B1+b1=oB+b1-aa:aB$01


* \0 is NUL, and \x9a is a byte 232

This code cannot be run on TIO because TIO requires codes to be UTF-8 clean. ( a single \x9a is not valid as UTF-8 byte sequence )

The differences between 225B version and this 222B version are;

  • Exchange the position in code of the Lj code block and the Lc code block.
  • Replace relative backward jump instructions -ib, -iA in Lc code block to forward jumps +ib, +iA.
  • Omit the instruction +ii, which works to stop the code, from Lj code block.
    * The code stops in error when the instruction pointer points the dvars area just after the Lj code block.
\$\endgroup\$
1
\$\begingroup\$

sclin, 63 bytes

100I-a \; tap
"Fizz""Buzz", over3 5, % ! ** c>< dup \pop |# n>o

Try it on scline!

My collection grows once again

\$\endgroup\$
0
\$\begingroup\$

Python 2, 72 bytes

for x in range(100):print('Fizz'*(x%3>1)+'Buzz'*(x%5>3)or str(x+1))+'\n'

Not as clever as feersum's solution, but it avoids casting exec magic.

EDIT: with just two more parentheses, it works in Python 3 AND Python 2:

for x in range(100):print(('Fizz'*(x%3>1)+'Buzz'*(x%5>3)or str(x+1))+'\n')
\$\endgroup\$
1
  • \$\begingroup\$ even simpler, supress +'\n' and some parenbthesis : for x in range(100):print('Fizz'*(x%3>1)+'Buzz'*(x%5>3)or x+1) so 63 bytes Pthon 3 \$\endgroup\$
    – Malo
    Sep 2, 2021 at 19:53
0
\$\begingroup\$

APL, 56 50 bytes

⊣{1+⍵⊣⎕←∊2↑((0=3 5|⍵)/'Fizz' 'Buzz'),''(⍕⍵)}⍣100⊢1

Note: The very first should suppress output in GNU APL. Replace it with to get correct results in Dyalog, etc, or with portable assignment to some variable X← adding one byte.

A+, 51 bytes

(x←100)do↓⊃2↑((0=3 5|1+x)/4⊂'FizzBuzz'),⌽2↑<1↓⍕1+x;
\$\endgroup\$
3
  • \$\begingroup\$ These seem quite different, so why not put them in different answers? \$\endgroup\$ Nov 9, 2015 at 7:47
  • \$\begingroup\$ While I wouldn't call A+ a “trivial variant,” it's a direct derivative of APL and I think any solution in one would translate to similar byte count in another. Also, I just updated it making the answers work exactly the same way. \$\endgroup\$
    – user46915
    Nov 9, 2015 at 9:22
  • \$\begingroup\$ The APL solution goes to 101 instead of stopping at 100. \$\endgroup\$
    – Mark Reed
    Dec 6, 2022 at 15:12
0
\$\begingroup\$

ShapeScript, 57 bytes

0'1+0?3%1<"Fizz"*1?5%1<"Buzz"*+"#0?"1?_1<*!@"
"@'554***!#

Try it online!

How it works

0          Push 0 (accumulator).
'          Push a string that, when evaluated, does the following:
  1+         Increment the accumulator.
  0?         Push a copy.
  3%1<       Check if the remainder of its division by 3 is zero.
  "Fizz"*    Push "Fizz" for True, "" for False.
  1?         Push another copy of the accumulator.
  5%1<       Check if the remainder of its division by 5 is zero.
  "Buzz"*    Push "Buzz" for True, "" for False.
  +          Concatenate the potential fizzes and buzzes.
  "          Push a string that, when evaluated, does the following:
    #          Discard the topmost stack item.
    0?         Push a copy of the item below it (accumulator).
  "
  1?         Push a copy of the concatenation.
  _1<        Check if its length is zero.
  *!         Execute "#0?" once for True, zero times for False.
  @          Swap the generated output with the accumulator.
  "          Push "\n".
  "
  @          Swap it with the accumulator.
'
554**      Push 5 * 5 * 4 = 100.
*!         Execute the '...' string 100 times.
#          Discard the accumulator.
\$\endgroup\$
0
\$\begingroup\$

Javascript ES6, 77 chars

"\n".repeat(100).replace(/(?=\n)/g,(m,i)=>(++i%3?m:"Fizz")+(i%5?m:"Buzz")||i)

Test:

"\n".repeat(100).replace(/(?=\n)/g,(m,i)=>(++i%3?m:"Fizz")+(i%5?m:"Buzz")||i) == document.querySelector("pre").textContent
\$\endgroup\$
4
  • \$\begingroup\$ Here's my ES6 attempt, with parts stolen from yours (89 chars): "0".repeat(99).split(0).map((m,i)=>{return(++i%3?m:"Fizz")+(i%5?m:"Buzz")||i}).join("\n") \$\endgroup\$ Jan 7, 2016 at 6:48
  • \$\begingroup\$ @starbeamrainbowlabs, why do you use {return ...} instead of expression? \$\endgroup\$
    – Qwertiy
    Jan 7, 2016 at 10:21
  • \$\begingroup\$ Because I couldn't get the expression to work :( \$\endgroup\$ Jan 7, 2016 at 16:20
  • \$\begingroup\$ Save a byte by using template strings + literal newline at front. \$\endgroup\$ Jan 29, 2016 at 0:34
0
\$\begingroup\$

///, 229 bytes

/x/Buzz//b/
x//f/
Fizz/1
2f
4bf
7
8fb
11f
13
14fx
16
17f
19bf
22
23fb
26f
28
29fx
31
32f
34bf
37
38fb
41f
43
44fx
46
47f
49bf
52
53fb
56f
58
59fi
61
62f
64bf
67
68fb
71f
73
74fx
76
77f
79bf
82
83fb
86f
88
89fx
91
92f
94bf
97
98fb
\$\endgroup\$
3
  • \$\begingroup\$ Out-golfed \$\endgroup\$ May 15, 2017 at 2:58
  • \$\begingroup\$ @Challenger5 Well done. \$\endgroup\$
    – Leaky Nun
    May 15, 2017 at 2:59
  • \$\begingroup\$ @LeakyNum I have A CJam script that finds common substrings in the input. It's useful for /// golfing. \$\endgroup\$ May 15, 2017 at 5:55

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.