akadama

そこらへんにいるプログラマが適当にやってます

「「コードゴルフに挑戦! in 東京Ruby会議10」に挑戦してみた」にさらに挑戦してみた

先日のエントリ、最終結果を見たら78バイトは13位だった。

なんかくやしかったからShibuya.rbでもくもくしてみた

元のはこれ

1
eval('%d.upto(%d){|x|puts ("FizzBuzz "[n=x**4%%-15,n+13]||x.to_s).strip}'%$*)

FizzBuzz判定のロジックは@mametterさんのこのスライドを読んだときに知ったものだったが、行末の空白のためにバイト数を使ってしまっている
ここは判定にバイト数を使ってもいいかもしれないと3項演算子やらを使ってみた

1
eval('%d.upto(%d){|x|puts "FizzBuzz"[n=(z=x**4%%-15)<0?z+1:z,n+12]||x}'%$*)

2バイトの削減に成功

@tyabeさんに「スペース無ければシンボルに出来るのに…」と言われていたのでそれを試してみる

1
eval('%d.upto(%d){|x|puts :FizzBuzz[n=(z=x**4%%-15)<0?z+1:z,n+12]||x}'%$*)

1バイトの削減に成功

そういえばevalにつけてるカッコはいらないのでは?と試してみた

1
eval'%d.upto(%d){|x|puts :FizzBuzz[n=(z=x**4%%-15)<0?z+1:z,n+12]||x}'%$*

動いた!! 2バイトの削減に成功

もしかしたらputsの前のスペースもいらない?と試してみた

1
eval'%d.upto(%d){|x|puts:FizzBuzz[n=(z=x**4%%-15)<0?z+1:z,n+12]||x}'%$*

動いた!!!! 1バイトの削減に成功

これで72バイト!!
今のロジック的にはここが限界かなぁ…?