FizzBuzz solved using only bit twiddling
gist.github.com
gist.github.com
Also there's a pretty obvious conversion to recursion.
Either implementation can be even funnier if you memoize results in an array cache (so if you've already figured out the hard way that 999999mod3=0 then next time around when you check 1000000 you need not cycle all the way down to 0 for 1000000 because once you hit 999999 you already know from last time around how 999999 turned out. Bonus points for making your "cache" smaller, like implementing a LRU (or simpler) algorithm for the last several lookups rather than memoizing all one million results.
There's also a devilish way of (ab)using IEEE float arithmetic rounding errors which I forget at this moment.
If your language or a library attached to it handles arbitrary bases, there's a certain pattern to the last digit WRT multiples of 5 when expressing the number in base 5... so just to be a jerk you do the math for 3-mults in base 3, 5-mults in base 5, and your 0 to 100decimal counter in base 7 for the pure hell of it. OR amuse the interviewer because the base wasn't spec'd by running up to 100base7 (which is probably going to be a new ethernet standard soon enough).
Another fun form of rebellion is to implement an emulator for any machine language machine you can remember running simple BCD math. So here's a lame little Z80 emulator and a Z80 assembly routine to solve this using simple BCD math.
Deviant forms of trig obfuscation can be funny, essentially you rely on the trig libraries overflow behavior to dance 1/5 of the way around a unit circle each time, and when you're all done, if your angle is close enough to zero, I guess its divisible by 5. This is much funnier if you implement essentially a pentagon and then rotate it using quaternions
I think programmer brain puzzles are kind of dumb, when I was younger I would have just walked out of the room, but as I age the likelihood of a total smartass answer like above increases over time.
(edited to add a hilarious one: Using a unit testing framework only permit proper fizzbuzz, then feed with with 10e3 monkeys on typewriters trying to generate Shakespeare technology and trust the testing framework...)
I suppose for a low level CRUD app job knowing what modular math is and how to run a loop, aka fizzbuzz, is probably massive skill overkill but there are higher level jobs out there...
I'm racking my brain right now trying to think of a "funny" way to do fizzbuzz for a high freq trading interview as in another story on HN today. So to test mod3 you'd submit a buy order followed by two half sized sell orders repetitively all in a couple milliseconds and let the market maker routine clear the market, and orders left over, if any, would tell you if you submitted a multiple of 3 orders so you could print "fizz"?
FizzBuzz is a simple "can you code at all" filter. If you write the obvious solution, you move on to the actual interview. If you write an elegant and amusing solution, you move on to the actual interview.
Surprisingly most applicants for programming positions cannot write any code that uses a for loop or an if statement at all, and fizzbuzz is a 3-minute test to prevent everyone from wasting their time.
echo 1 10 Fizz 100Also, I don't think I could write a z80 emulator on a whiteboard ;)
The f[0-4] and t[0-2] functions emulate the state of a deterministic finite automata which determine divisibility of binary strings. The bits represent the binary strings. The left shift operator is used to "eat" bits.
See these two DFAs for an explanation:
http://stackoverflow.com/questions/15330027/regular-expressi...
http://ugccomputerscience.blogspot.com/2012/02/dfa-of-binary...
EDIT:
For those showing ways to do it with just addition and the like, I originally titled this "FizzBuzz using only bit twiddling" but a mod appears to have changed it...
fizz = [nil,nil,'Fizz'].cycle
buzz = [nil,nil,nil,nil,'Buzz'].cycle
(1..100).zip(fizz,buzz) {|a| n,*fb=a.compact; puts fb.empty? ? n : fb.join }
I can't claim credit for this one. Very elegant, I thought when I saw it. perl -e 'print $_ + 1 . " " . ((("") x 2, "Fizz") x 34)[$_] . ((("") x 4, "Buzz") x 20)[$_] . "\n" foreach (0..99)'
Edit: unnecessary complexity removed.python -c 'print "\n".join(w or str(i+1) for i, w in enumerate(("..Fizz..Buzz.Fizz...Fizz.Buzz..Fizz...FizzBuzz."*7).split(".")[:100]))'
If you actually want to do the math, you can make your python shorter: http://stackoverflow.com/a/6890045
import sys
n = 1000
modthree = 0
modfive = 0
for i in range(n):
if modthree == 3:
modthree = 0; sys.stdout.write("fizz")
if modfive == 5:
modfive = 0; sys.stdout.write("buzz")
if modthree and modfive:
sys.stdout.write(i)
sys.stdout.write("\n")
modthree += 1; modfive += 1Any reason for not just using print? Or if you want all of them on the same line, you can put a comma at the end of print, like...
for q in range(10):
print q, print q,
sys.stdout.softspace = 0
But really, this wart is one of the reasons Python 3 has a new way of printing.[1] - https://github.com/EnterpriseQualityCoding/FizzBuzzEnterpris...
.say for (('' xx 2, 'Fizz') xx * Z~ ('' xx 4, 'Buzz') xx *) Z|| 1 .. 100;
Yet another way, this time in Perl 6. It generates two infinite lists, one containing two empty strings and Fizz repeated forever. Second contains four empty strings and Buzz repeated forever. They are concatenated. Next, everything is zipped with `1..100` range using `||` operator. The `||` operator returns first argument if it's true, false otherwise. Because the range is finite, the list ends.Functional programming for the win.
fizz = cycle ["","","Fizz"]
buzz = cycle ["","","","","Buzz"]
fizzbuzz = zipWith (++) fizz buzz
fb = zipWith (\n cs -> if cs == "" then show n else cs) [1..] fizzbuzz
mapM_ putStrLn fbPoetry.
In python:
from itertools import *
fizz = cycle(["", "", "fizz"])
buzz = cycle([""] * 4 + ["buzz"])
fizzbuzz = izip(fizz, buzz, xrange(1,100))
print "\n".join(map(lambda (x,y,z): x+y if x or y else str(z), fizzbuzz))
(bugs found by marekmroz fixed)Can you do [1,2,3] * 4 in haskell as well ?
Admittedly mine was not as elegant as I haven't thought of using izip with 3 iterables. Still, I don't think that lambda and islice is really needed... xrange(100) guarantees a finite number of iterations already.
from itertools import *
fizzer = cycle(['Fizz','',''])
buzzer = cycle(['Buzz','','','',''])
fizzbuzzer = izip(xrange(100), fizzer, buzzer)
for f in fizzbuzzer:
print f[1] + f[2] if f[1] or f[2] else f[0]
EDIT:
the output from your version does not look right. "Fizz" and "Buzz" are on the wrong index positions.
0
1
fizz
3
buzz
fizz
6
7
fizz
buzz
...You're also correct islice is not needed.
concat $ replicate 4 [1,2,3]http://stackoverflow.com/questions/5284898/implement-divisio...
See:
http://stackoverflow.com/questions/15330027/regular-expressi...
http://ugccomputerscience.blogspot.com/2012/02/dfa-of-binary...
To check if a number is divisible by 5, just check if the last digit is 0 or 5.
1 % 3 = 1
10 % 3 = 1
100 % 3 = 1
...
since things congruent modulo 3 are either both divisable by 3 or neither we can do this (because 10 and 3 are relatively prime): (a * 1000 + b * 100 + c * 10 + d) % 3 = (a + b + c + d) % 3
Hmmm 16 and 3 are relatively prime as well, and: 16 % 3 = 1
256 % 3 = 1
4096 % 3 = 1
...
Ergo the sum of hexadecimal digits follows the same rule in hexadecimal ! Hurray !So :
def divby3(x):
s = 0
while x != 0:
s += x & 15
x = x >> 4
if s >= 16:
return divby3(s)
return s in [0,3,6,9,12,15]
Also, 5 works "like 3" in hexadecimal: def divby5(x):
s = 0
while x != 0:
s += x & 15
x = x >> 4
if s >= 16:
return divby5(s)
return s in [0,5,0xa,0xf] use List::Enumerator qw/E/;
my $fizzbuzz =
E(1)->countup
->zip(
E("", "", "Fizz")->cycle,
E("", "", "", "", "Buzz")->cycle
)
->map( sub {
my ($n, $fizz, $buzz) = @$_;
$fizz . $buzz || $n;
});
$fizzbuzz->take(20)->each(sub {
say $_;
});
The Fizzbuzz solution comes from the author of List::Enumerator CPAN module - https://metacpan.org/pod/List::Enumerator 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
endI generally hate FizzBuzz, as it seems like a waste of everyone's time in most cases. Then again, it's fun to see how you can abuse your development environment to produce it.
Now, onto seeing if I can create FizzBuzz using bash + sleep, a la sleep sort http://rosettacode.org/wiki/Sorting_algorithms/Sleep_sort#UN...
#!/usr/bin/env rc
for (i in `{seq 100}) {
toPrint = $i
toPost = ''
if (~ $i *5 || ~ $i *0 ) {
toPrint = Buzz
toPost = Buzz }
if (~ $i ([369] [147][258] [258][147] [369][0369]))
toPrint = Fizz ^ $toPost
echo $toPrint
} fizzBuzz x = if null str then show x else str
where str = concat [tag | (n,tag) <- tags, x `rem` n == 0]
tags = [(3,"Fizz"), (5,"Buzz")]
main = mapM_ (putStrLn . fizzBuzz) [1..100]
Extendable.