Skip to content

Instantly share code, notes, and snippets.

@judofyr
Forked from JEG2/fizzbuzz.rb
Created August 1, 2012 21:37
Show Gist options
  • Star 38 You must be signed in to star a gist
  • Fork 4 You must be signed in to fork a gist
  • Save judofyr/3230984 to your computer and use it in GitHub Desktop.
Save judofyr/3230984 to your computer and use it in GitHub Desktop.
Writing FizzBuzz with flip-flops
a=b=c=(1..100).each do |num|
print num, ?\r,
("Fizz" unless (a = !a) .. (a = !a)),
("Buzz" unless (b = !b) ... !((c = !c) .. (c = !c))),
?\n
end
@judofyr
Copy link
Author

judofyr commented Aug 2, 2012

The problem is that it branches. In the 2-flip-flop if the state is false and we want the next values to be [true, false], then there are two possible inputs. There's also several ways to achieve the same input. One solution to the "dividable by 3" is the input: {start:true, stop:false}, {stop:true}, {start:false}. This can be solved either by having the same 2-cycle (true, false, true, false) in both start and stop ((s = !s) .. (s = !s)), but you can also use two different variables having a separate 2-cycle ((a = !a) .. (b = !b)).

@judofyr
Copy link
Author

judofyr commented Aug 2, 2012

Yay, after some improvements in my verifier-program, I now know there are solutions for everything from 1 to 17 \o/

@DouglasAllen
Copy link

Using flip-flops has to be benchmarked. I think that there is nothing wrong with using faster, more common methods. It doesn't make sense to iterate every value of the 1 to 100 range and then still have to eval each condition of a flip-flop.
Have you done a ven test ever? Just a thought. Map the state at every eval.

@DouglasAllen
Copy link

I'm confused about the !
Is this a not or a bang?

@judofyr
Copy link
Author

judofyr commented Oct 5, 2012

And here's a version of FizzBuzzBazz:

a=b=c=d=(e=1..100).each do |num|
  print num, ?\r,
    ("Fizz" unless (a = !a) .. (a = !a)),
    ("Buzz" unless (b = !b) ... !((c = !c) .. (c = !c))),
    ("Bazz" unless ((d = !d) .. (d = !d)) ... (e = !e)),
    ?\n
end

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment