# Smallest FizzBuzz program

**URL:** <https://www.ruby-forum.com/t/smallest-fizzbuzz-program/87441>\
**Category:** Ruby\
**Created:** [March 2, 2007, 5:10pm UTC](https://www.ruby-forum.com/t/smallest-fizzbuzz-program/87441 "2007-03-02T17:10:47Z")\
**Posts on this page:** 20\
**Page:** 1

<div class="post-metadata">

**Author:** ![zakifataya](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/z/c89c15/32.png) [@zakifataya](https://www.ruby-forum.com/u/zakifataya)\
**Post date:** [March 2, 2007, 5:10pm UTC](https://www.ruby-forum.com/t/smallest-fizzbuzz-program/87441/1 "2007-03-02T17:10:47Z")

</div>

This is really bugging me. Someone posted a golf challenge to write a  
smallest FizzBuzz program here:

[anarchy golf - FizzBuzz](http://golf.shinh.org/p.rb?FizzBuzz) (although the site was down when I  
checked it a few minutes ago)

Basically, the challenge is to write the smallest Ruby program that will  
print the numbers from 1 to 100 except:

- substitute Fizz for numbers that are multiples of 3
- substitute Buzz for numbers that are multiples of 5
- substitute FizzBuzz for numbers that are multiples of both 3 and 5

Also see:  
[http://weblog.raganwald.com/2007/01/dont-overthink-fizzbuzz.html](http://weblog.raganwald.com/2007/01/dont-overthink-fizzbuzz.html)

The winning entry is at 56 bytes and I can’t get below 65 bytes with the  
following:

1.upto(100){|i|puts"FizzBuzz#{i}"[i%3\<1?0:i%5\<1?4:8,i%15\<1?8:4]}

I think if the substring indices could be computed mathematically  
instead of logically, it might work, but it’s possible an entirely new  
approach is necessary.

It works correctly, so to see acceptable output, just run it.

1  
2  
Fizz  
4  
Buzz  
Fizz  
7  
8  
Fizz  
Buzz  
11  
Fizz  
13  
14  
FizzBuzz  
…

Can any Ruby guru out there get it down to 56 bytes?

Brian

---

<div class="post-metadata">

**Author:** ![zakifataya](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/z/c89c15/32.png) [@zakifataya](https://www.ruby-forum.com/u/zakifataya)\
**Post date:** [March 2, 2007, 5:34pm UTC](https://www.ruby-forum.com/t/smallest-fizzbuzz-program/87441/2 "2007-03-02T17:34:49Z")

</div>

1.upto(100){|i|p"FizzBuzz#{i}"[i%3\<1?0:i%5\<1?4:8,i%15\<1?8:4]}

Shaves off 3 bytes. 🙂

On 3/2/07, Brian A. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> - substitute FizzBuzz for numbers that are multiples of both 3 and 5  
> approach is necessary.  
> 8
> 
> Brian

–  
[http://www.jeremymcanally.com/](http://www.jeremymcanally.com/)

My free Ruby e-book:  
[http://www.humblelittlerubybook.com/book/](http://www.humblelittlerubybook.com/book/)

My blogs:

> **[Site not found · DreamHost](http://www.mrneighborly.com/)**
>
> The owner of this domain has not yet uploaded their website.

[http://www.rubyinpractice.com/](http://www.rubyinpractice.com/)

---

<div class="post-metadata">

**Author:** ![zakifataya](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/z/c89c15/32.png) [@zakifataya](https://www.ruby-forum.com/u/zakifataya)\
**Post date:** [March 2, 2007, 6:01pm UTC](https://www.ruby-forum.com/t/smallest-fizzbuzz-program/87441/3 "2007-03-02T18:01:51Z")

</div>

> 1.upto(100){|i|p"FizzBuzz#{i}"[i%3\<1?0:i%5\<1?4:8,i%15\<1?8:4]}
> 
> Shaves off 3 bytes. 🙂

But it messes with the output a bit…  
You can save one byte doing this: 1.upto(?d)

Regards,  
Rimantas

---

<div class="post-metadata">

**Author:** ![zakifataya](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/z/c89c15/32.png) [@zakifataya](https://www.ruby-forum.com/u/zakifataya)\
**Post date:** [March 2, 2007, 6:15pm UTC](https://www.ruby-forum.com/t/smallest-fizzbuzz-program/87441/4 "2007-03-02T18:15:54Z")

</div>

On 02.03.2007 17:34, Jeremy McAnally wrote:

> 1.upto(100){|i|p"FizzBuzz#{i}"[i%3\<1?0:i%5\<1?4:8,i%15\<1?8:4]}
> 
> Shaves off 3 bytes. 🙂

100.times{|i|p"FizzBuzz#{i}"[i%3\<1?0:i%5\<1?4:8,i%15\<1?8:4]}

another two. 🙂

robert

---

<div class="post-metadata">

**Author:** ![zakifataya](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/z/c89c15/32.png) [@zakifataya](https://www.ruby-forum.com/u/zakifataya)\
**Post date:** [March 2, 2007, 6:16pm UTC](https://www.ruby-forum.com/t/smallest-fizzbuzz-program/87441/5 "2007-03-02T18:16:54Z")

</div>

Rimantas L. wrote:

> > 1.upto(100){|i|p"FizzBuzz#{i}"[i%3\<1?0:i%5\<1?4:8,i%15\<1?8:4]}
> > 
> > Shaves off 3 bytes. 🙂
> 
> But it messes with the output a bit…  
> You can save one byte doing this: 1.upto(?d)

Awesome, ASCII value of letter d ! Only 8 more bytes to shave off 🙂

---

<div class="post-metadata">

**Author:** ![zakifataya](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/z/c89c15/32.png) [@zakifataya](https://www.ruby-forum.com/u/zakifataya)\
**Post date:** [March 2, 2007, 6:10pm UTC](https://www.ruby-forum.com/t/smallest-fizzbuzz-program/87441/6 "2007-03-02T18:10:53Z")

</div>

Jeremy McAnally wrote:

> 1.upto(100){|i|p"FizzBuzz#{i}"[i%3\<1?0:i%5\<1?4:8,i%15\<1?8:4]}
> 
> Shaves off 3 bytes. 🙂

Thanks, but that breaks the output by adding “”, so it won’t do.

---

<div class="post-metadata">

**Author:** ![zakifataya](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/z/c89c15/32.png) [@zakifataya](https://www.ruby-forum.com/u/zakifataya)\
**Post date:** [March 2, 2007, 6:18pm UTC](https://www.ruby-forum.com/t/smallest-fizzbuzz-program/87441/7 "2007-03-02T18:18:54Z")

</div>

Robert K. wrote:

> On 02.03.2007 17:34, Jeremy McAnally wrote:
> 
> > 1.upto(100){|i|p"FizzBuzz#{i}"[i%3\<1?0:i%5\<1?4:8,i%15\<1?8:4]}
> > 
> > Shaves off 3 bytes. 🙂
> 
> 100.times{|i|p"FizzBuzz#{i}"[i%3\<1?0:i%5\<1?4:8,i%15\<1?8:4]}
> 
> another two. 🙂

Nope. 100.times is not equivalent to 1.upto(100) - off by one error.

---

<div class="post-metadata">

**Author:** ![zakifataya](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/z/c89c15/32.png) [@zakifataya](https://www.ruby-forum.com/u/zakifataya)\
**Post date:** [March 2, 2007, 6:17pm UTC](https://www.ruby-forum.com/t/smallest-fizzbuzz-program/87441/8 "2007-03-02T18:17:54Z")

</div>

On 02.03.2007 18:00, Rimantas L. wrote:

> > 1.upto(100){|i|p"FizzBuzz#{i}"[i%3\<1?0:i%5\<1?4:8,i%15\<1?8:4]}
> > 
> > Shaves off 3 bytes. 🙂
> 
> But it messes with the output a bit…  
> You can save one byte doing this: 1.upto(?d)

?d.times{|i|puts"FizzBuzz#{i}"[i%3\<1?0:i%5\<1?4:8,i%15\<1?8:4]}

Hm…

robert

---

<div class="post-metadata">

**Author:** ![zakifataya](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/z/c89c15/32.png) [@zakifataya](https://www.ruby-forum.com/u/zakifataya)\
**Post date:** [March 2, 2007, 6:22pm UTC](https://www.ruby-forum.com/t/smallest-fizzbuzz-program/87441/9 "2007-03-02T18:22:55Z")

</div>

On Mar 2, 2007, at 12:15 PM, Robert K. wrote:

> ?d.times{|i|puts"FizzBuzz#{i}"[i%3\<1?0:i%5\<1?4:8,i%15\<1?8:4]}

This approach does 0…99 though… ☹  
-Mat

---

<div class="post-metadata">

**Author:** ![zakifataya](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/z/c89c15/32.png) [@zakifataya](https://www.ruby-forum.com/u/zakifataya)\
**Post date:** [March 2, 2007, 8:16pm UTC](https://www.ruby-forum.com/t/smallest-fizzbuzz-program/87441/10 "2007-03-02T20:16:13Z")

</div>

On Mar 2, 11:06 am, Brian A. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> - substitute FizzBuzz for numbers that are multiples of both 3 and 5  
> …  
> Can any Ruby guru out there get it down to 56 bytes?

55 bytes:  
1.upto(?d){|i,x|i%3\<1&&x=:Fizz;puts i%5\<1?“#{x}Buzz”:i}

Replace ?d with 100 if you want 56 bytes 🙂

---

<div class="post-metadata">

**Author:** ![zakifataya](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/z/c89c15/32.png) [@zakifataya](https://www.ruby-forum.com/u/zakifataya)\
**Post date:** [March 2, 2007, 6:40pm UTC](https://www.ruby-forum.com/t/smallest-fizzbuzz-program/87441/11 "2007-03-02T18:40:56Z")

</div>

On 02.03.2007 18:22, Mat S. wrote:

> On Mar 2, 2007, at 12:15 PM, Robert K. wrote:
> 
> > ?d.times{|i|puts"FizzBuzz#{i}"[i%3\<1?0:i%5\<1?4:8,i%15\<1?8:4]}
> 
> This approach does 0…99 though… ☹

Darn. Golf is just not my sport - never was. 🙂

robert

---

<div class="post-metadata">

**Author:** ![zakifataya](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/z/c89c15/32.png) [@zakifataya](https://www.ruby-forum.com/u/zakifataya)\
**Post date:** [March 2, 2007, 8:22pm UTC](https://www.ruby-forum.com/t/smallest-fizzbuzz-program/87441/12 "2007-03-02T20:22:16Z")

</div>

Ummm… funny… I see 9 and 12 in the output when I ran this 🙂

---

<div class="post-metadata">

**Author:** ![zakifataya](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/z/c89c15/32.png) [@zakifataya](https://www.ruby-forum.com/u/zakifataya)\
**Post date:** [March 2, 2007, 8:30pm UTC](https://www.ruby-forum.com/t/smallest-fizzbuzz-program/87441/13 "2007-03-02T20:30:18Z")

</div>

1.upto(?d){|i,x| i%3\<1&&x=:Fizz;puts (i%3\<1||i%5\<1)?"#{x}Buzz":i} is  
back up to 65. Shame.

---

<div class="post-metadata">

**Author:** ![zakifataya](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/z/c89c15/32.png) [@zakifataya](https://www.ruby-forum.com/u/zakifataya)\
**Post date:** [March 2, 2007, 8:31pm UTC](https://www.ruby-forum.com/t/smallest-fizzbuzz-program/87441/14 "2007-03-02T20:31:19Z")

</div>

vsv wrote:

> > - substitute Buzz for numbers that are multiples of 5
> > - substitute FizzBuzz for numbers that are multiples of both 3 and 5  
> > …  
> > Can any Ruby guru out there get it down to 56 bytes?
> 
> 55 bytes:  
> 1.upto(?d){|i,x|i%3\<1&&x=:Fizz;puts i%5\<1?"#{x}Buzz":i}
> 
> Replace ?d with 100 if you want 56 bytes 🙂

Interesting. But it doesn’t produce proper output ☹

---

<div class="post-metadata">

**Author:** ![zakifataya](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/z/c89c15/32.png) [@zakifataya](https://www.ruby-forum.com/u/zakifataya)\
**Post date:** [March 2, 2007, 8:32pm UTC](https://www.ruby-forum.com/t/smallest-fizzbuzz-program/87441/15 "2007-03-02T20:32:19Z")

</div>

On Mar 2, 2:21 pm, “Kyle S.” [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> Ummm… funny… I see 9 and 12 in the output when I ran this 🙂

it is my fault, last second optimization is always wrong  
(my lunch is too short and I can’t use ruby in the office ☹ ),  
best I can get if 58 chars:

1.upto(?d){|i,x|i%3\<1&&x=:Fizz;puts i%5\<1?“#{x}Buzz”:x||i}

hope it works OK 🙂

---

<div class="post-metadata">

**Author:** ![zakifataya](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/z/c89c15/32.png) [@zakifataya](https://www.ruby-forum.com/u/zakifataya)\
**Post date:** [March 2, 2007, 9:49pm UTC](https://www.ruby-forum.com/t/smallest-fizzbuzz-program/87441/16 "2007-03-02T21:49:29Z")

</div>

On 3/3/07, Brian A. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> Nice work. I removed ,x from |i,x| on a whim and it still works - 57  
> bytes! (you have to count file size which as an EOF char)
> 
> 1.upto(?d){|i|i%3\<1&&x=:Fizz;puts i%5\<1?“#{x}Buzz”:x||i}

Slight variant, though sadly the same length:

1.upto(?d){|i|puts [“%sBuzz”%x=[:Fizz][i%3]][i%5]||x||i}

martin

---

<div class="post-metadata">

**Author:** ![zakifataya](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/z/c89c15/32.png) [@zakifataya](https://www.ruby-forum.com/u/zakifataya)\
**Post date:** [March 2, 2007, 8:40pm UTC](https://www.ruby-forum.com/t/smallest-fizzbuzz-program/87441/17 "2007-03-02T20:40:21Z")

</div>

vsv wrote:

> 

Nice work. I removed ,x from |i,x| on a whim and it still works - 57  
bytes! (you have to count file size which as an EOF char)

1.upto(?d){|i|i%3\<1&&x=:Fizz;puts i%5\<1?"#{x}Buzz":x||i}

---

<div class="post-metadata">

**Author:** ![zakifataya](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/z/c89c15/32.png) [@zakifataya](https://www.ruby-forum.com/u/zakifataya)\
**Post date:** [March 3, 2007, 1:06am UTC](https://www.ruby-forum.com/t/smallest-fizzbuzz-program/87441/18 "2007-03-03T01:06:54Z")

</div>

On 3/2/07, Martin DeMello [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> martin

1.upto(?d){|i|p [“%sBuzz”%x=[:Fizz][i%3]][i%5]||x||i}

Code golfing is against my religious beliefs however.

–  
Rick DeNatale

My blog on Ruby  
[http://talklikeaduck.denhaven2.com/](http://talklikeaduck.denhaven2.com/)

---

<div class="post-metadata">

**Author:** ![zakifataya](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/z/c89c15/32.png) [@zakifataya](https://www.ruby-forum.com/u/zakifataya)\
**Post date:** [March 3, 2007, 1:21am UTC](https://www.ruby-forum.com/t/smallest-fizzbuzz-program/87441/19 "2007-03-03T01:21:55Z")

</div>

On 3/3/07, Rick DeNatale [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> > 1.upto(?d){|i|puts [“%sBuzz”%x=[:Fizz][i%3]][i%5]||x||i}
> > 
> > martin
> 
> 1.upto(?d){|i|p [“%sBuzz”%x=[:Fizz][i%3]][i%5]||x||i}
> 
> Code golfing is against my religious beliefs however.  
> good decision 😉 'cause you are cheating, the output format of p is  
> not what is required ☹  
> Robert

---

<div class="post-metadata">

**Author:** ![zakifataya](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/z/c89c15/32.png) [@zakifataya](https://www.ruby-forum.com/u/zakifataya)\
**Post date:** [March 3, 2007, 1:30am UTC](https://www.ruby-forum.com/t/smallest-fizzbuzz-program/87441/20 "2007-03-03T01:30:56Z")

</div>

On 3/2/07, Robert D. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> On 3/3/07, Rick DeNatale [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> > 1.upto(?d){|i|p [“%sBuzz”%x=[:Fizz][i%3]][i%5]||x||i}
> > 
> > Code golfing is against my religious beliefs however.  
> > good decision 😉 'cause you are cheating, the output format of p is  
> > not what is required ☹  
> > Robert

And here I could have sworn that I’d actually tried that very code in  
irb.

That’s why I’m against code golfing, rots the brain! 😉

–  
Rick DeNatale

My blog on Ruby  
[http://talklikeaduck.denhaven2.com/](http://talklikeaduck.denhaven2.com/)

[Next page](https://www.ruby-forum.com/t/smallest-fizzbuzz-program/87441.md?page=2)
