Fizz Buzz without conditionals or booleans 8 months ago
The suckless approach
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
void fizzbuzz(int i) {
uint32_t r3 = i % 3;
uint32_t r5 = i % 5;
uint32_t is_nonzero_3 = (r3 | -r3) >> 31;
uint32_t is_nonzero_5 = (r5 | -r5) >> 31;
uint32_t is_zero_3 = is_nonzero_3 ^ 1;
uint32_t is_zero_5 = is_nonzero_5 ^ 1;
uint32_t idx = (is_zero_5 << 1) | is_zero_3;
const char *fmt[] = {
"%d\n",
"Fizz\n",
"Buzz\n",
"FizzBuzz\n"
};
printf(fmt[idx], i);
}
typedef void (*func_t)(int);
void run_loop(int i);
void stop_loop(int i) { exit(0); }
func_t actions[] = { stop_loop, run_loop };
void run_loop(int i) {
fizzbuzz(i);
int d = 99 - i;
uint32_t is_neg = ((uint32_t)d) >> 31;
}
func_t actions_table[] = { run_loop, stop_loop };
void run_loop_wrapper(int i) {
fizzbuzz(i);
int d = 99 - i;
uint32_t is_neg = ((uint32_t)d) >> 31;
actions_table[is_neg](i + 1);
}
int main() {
actions_table[0] = run_loop_wrapper;
run_loop_wrapper(1);
return 0;
}