2018年以降の記事はGitHub Pagesに移行しました

RubyでFizzBuzzみじかいのに挑戦した

FizzBuzz自体は組んだことあるけど、短いのは考えたことがなかったのでこれを機会に挑戦。

一つ目

101.times{|i|p(i%15==0?'FizzBuzz':i%3==0?'Fizz':i%5==0?'Buzz':i)}
101.times{ |i|
	p (
		i % 15 == 0 ? 'FizzBuzz' 
			: i % 3 == 0 ? 'Fizz'
					: i % 5 == 0 ? 'Buzz' : i
	)
}
  • do〜endが文字数消費するので{}を使った
  • if〜elseが文字数消費するので三項演算子を使った
  • アウトプットをpにして文字数を稼いだ

三項演算子の入れ子なんて初めて使ったからどうインデントしたら綺麗に見えるのかもわからん! しかもこれで66byte…某Y!社に入れないなぁ。

また、どうもFizzBuzzって1から100でやるらしく、上記のソースだと0から100まで実行してしまうので他の部分も含めてちょっと考え直し……。

二つ目

(1..100).each{|i|p(i%15>0?i%5>0?i%3>0?i:'Fizz':'Buzz':'FizzBuzz')}
(1..100).each{ |i|
	p (
		i % 15 > 0 ?
			i % 5 > 0 ?
				i % 3 > 0 ? i
				: 'Fizz'
			: 'Buzz'
		: 'FizzBuzz'
	)
}
  • eachにしてループを1から100までにした
  • 条件を割り切れたら(i%15==0)から割り切れなかったら(i%15>0)に変更

条件式で3byte縮めたけどtimesからeachに交えたせいで67byteに増えた……。

その後、最短方法をいろいろググッてみると配列使うテクニックとかがあるみたいすなあ。"FizzBuzz"の出力の仕方でもうちょい短縮できそうかな。