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

I don't have a proof, but it seems to me that it's impossible to make it return false for every 6th iteration. I've solved it for 1, 2, 3, 4, 5, 7, 8, 9, 10, but not 6 :-(

@practicingruby
Copy link

@judofyr: Try building a truth table for them. That might help.

@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