Comments on 1, 2, Fizz, 4, Buzz!
Parent
1, 2, Fizz, 4, Buzz!
The task
Output the first 100 elements of the infamous FizzBuzz sequence.
How?
The FizzBuzz sequence is the sequence of decimal integers from 1 to 100 inclusive, but:
- If the integer is divisible both by 3 and 5, output the string
FizzBuzz
- Else, if the integer is divisible by 3, output the string
Fizz
instead - Else, if the integer is divisible by 5, output the string
Buzz
instead - Else, output the integer itself
Output
The output will be a list of these elements separated by either a space (U+0020
) or a newline (U+000A
).
Here is a sample output with newline separation:
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
Rules
- Your code may not print anything to STDERR. Warnings are fine.
- This is code-golf, so lowest byte-count in each language is the winner.
C (gcc), 113 Bytes ``` i;mai …
4y ago
[RoadLang], 340 bytes ` …
4y ago
goruby, 1 byte ```ruby f …
4y ago
[JavaScript (Node.js)], 64 byt …
4y ago
[Shakespeare Programming Langu …
4y ago
C (gcc), 108 bytes ```c h, …
4y ago
Japt `-R`, 28 bytes Lõ@ …
4y ago
[AWK], 72 bytes BEGIN{f …
3y ago
Japt `-R`, 27 bytes Lõ@ …
3y ago
Canvas, 24 bytes zz+¹┘%!* …
4y ago
Vyxal `Hj`, 10 bytes …
3y ago
[C (gcc)], 103 bytes Using …
3y ago
[shortC], 95 93 91 bytes …
3y ago
[Haskell], 110 bytes …
3y ago
[Python 3], 64 62 bytes …
3y ago
[Lua], 126 118 bytes …
3y ago
[Julia 1.0], 79 bytes …
3y ago
Rockstar, 138 135 133 bytes …
3y ago
Sclipting, (UTF-16) 62 bytes …
3y ago
[AWK], 62 61 60 56 bytes …
6mo ago
[PHP], 114 bytes Ph …
3y ago
Post
C (gcc), 113 Bytes
i;main(){while(i++<100){char*h[]={"%d "," "},**p=h;i%3||(*p++="Fizz%2$s");i%5||(*p="Buzz ");printf(*h,i,h[1]);}}
This compiles with several warnings, but no errors.
Here's an ungolfed version with explanations:
/* the following include is omitted; while using printf
without including it is not conforming to the current
C standard, with gcc it only generates a warning
and works flawlessly. Note that omission was valid K&R C */
#include <stdio.h>
/* Declare a global int variable. The golfed code omits the
type because of the old implicit-int rule, which only
generates a warning also in modern gcc. Also note that
global variables without initializer are zero-initialized;
this is still defined behaviour today. In this ungolfed
code I've added the implied initializer for clarity. */
int i=0;
/* The main function. Again, the golfed code makes use of the
old implicit int rule. */
int main()
{
/* loop up to 100; since we increment before entering the
loop body, the first number in the loop is 1. */
while(i++<100)
{
/* In this array of two strings, the first will be used as
format string to a printf later, while the second will
be the third argument for the same printf. As is, the
format string will tell printf to format the second
argument (which will be i) as number, followed by a space.
The third argument, a single-space string, is ignored
in that case. */
char *h[] = { "%d ", " " };
/* This second variable (which in the golfed version is
declared in the same declaration as h) points to the first
entry of h. It is used to change the entries of h, and
it is separate because pointer arithmetic is used to
modify different strings depending on the condition. */
char **p = h;
/* This is basically an if-not statement. If i%3 is not
nonzero (that is, if i is divisible by 3), this statement
replaces the format string with one that prints "Fizz"
followed by the content of the third argument of printf
as string, which is the second string in h. At this
point it contains just a space. Also, when replacing the
format string, the pointer p is incremented, so it then
points to the second element of h. */
i%3 || (*p++ = "Fizz%2$s");
/* This if-in-disguise handles divisibility by 5. It stores
a pointer to "Buzz " into whatever p points to. If i
is not divisible by 3, this still is the format string,
so if instructs the following printf to just print "Buzz "
and ignore any further arguments. Otherwise, p points
to the final string argument, so that after the "Fizz"
it prints "Buzz " instead of just a space. */
i%5 || (*p = "Buzz ");
/* This finally is the printf statement talked about
in the previous comments. Note that *h is equivalent
to h[0] */
printf(*h,i,h[1]);
}
}
1 comment thread