Communities

Writing
Writing
Codidact Meta
Codidact Meta
The Great Outdoors
The Great Outdoors
Photography & Video
Photography & Video
Scientific Speculation
Scientific Speculation
Cooking
Cooking
Electrical Engineering
Electrical Engineering
Judaism
Judaism
Languages & Linguistics
Languages & Linguistics
Software Development
Software Development
Mathematics
Mathematics
Christianity
Christianity
Code Golf
Code Golf
Music
Music
Physics
Physics
Linux Systems
Linux Systems
Power Users
Power Users
Tabletop RPGs
Tabletop RPGs
Community Proposals
Community Proposals
tag:snake search within a tag
answers:0 unanswered questions
user:xxxx search by author id
score:0.5 posts with 0.5+ score
"snake oil" exact phrase
votes:4 posts with 4+ votes
created:<1w created < 1 week ago
post_type:xxxx type of post
Search help
Notifications
Mark all as read See all your notifications »
Challenges

Post History

80%
+6 −0
Challenges 1, 2, Fizz, 4, Buzz!

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'...

posted 4y ago by celtschk‭  ·  edited 4y ago by celtschk‭

Answer
#2: Post edited by user avatar celtschk‭ · 2020-11-20T14:18:54Z (about 4 years ago)
Added ungolfed version of the code with explanation in the comments
  • # 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]);
  • }
  • }
  • ```
#1: Initial revision by user avatar celtschk‭ · 2020-11-19T19:40:40Z (about 4 years ago)
# 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.