Post History
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'...
Answer
#2: Post edited
- # 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.
- # 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]);
- }
- }
- ```