かつのりの日記2

わんくまでは珍しいJavaを中心とした日記です

目次

Blog 利用状況

書庫

日記カテゴリ

いろいろリンク

FizzBuzzを今更作ってみた

普通じゃ面白くないので、変わった作り方にチャレンジしました。言語はJavaScriptです。

まずはif文を使わないパターン。

f=['fizz','','buzz',''];
for(i=0;i<100;i++)
document.write(((f[(!(i%3)+'').length-4]+f[(!(i%5)+'').length-2])||i)+'<br>');

そして、極力短くしたパターン。

for(i=0;i<100;i++){a=i;b=!(i%3);if(b)a='fizz';if(!(i%5))a=(b?a:'')+'buzz';document.write(a+"<br>")}

if文を使わない代わりに三項演算子を使うなんてズルはしていません。true/falseを文字列化して、文字長を配列にマップしています。

極力短くしたパターンは実際にこれ以上短くできるのでしょうか・・・。実は7行テトリスに感化されています。

投稿日時 : 2007年11月8日 1:55

Feedback

# re: FizzBuzzを今更作ってみた 2007/11/08 7:14 Ozy

> if文を使わない代わりに三項演算子を使うなんてズルはしていません。

(b?a:'')の部分が三項演算子使ってますよー

# re: FizzBuzzを今更作ってみた 2007/11/08 10:07 かつのり

短いバージョンはifも三項演算子も使っていますよ~。

# re: FizzBuzzを今更作ってみた 2007/11/08 10:27 かつのり

キモになるのは!(i%3)ですね。
i%3が0になると!(0)と言うように評価され、
!(0)はtrueになります。
逆にfalseにしたい場合は!!(i%3)みたいな書き方もありです。

# re: FizzBuzzを今更作ってみた 2007/11/08 10:51 dayflower

極力短くしたパターンは0?99になってしまってますね。
そのコードを極力生かして素直に短縮すると,
for(i=0;i++<100;){a=i;b=i%3;if(!b)a='fizz';if(!(i%5))a=(b?'':a)+'buzz';document.write(a+"<br>")}
論理を反転させたりfor文とこをまとめると3文字短縮できます。

でも実はif文使うより%演算子と三項演算子を使うほうがもっともっと短くなります。
その辺は↑※のOzyさんのコード参照。golfでトップの短さです。
http://d.hatena.ne.jp/Ozy/20070225


if文も三項演算子も使わないという縛りだと例えば下記のような手もあります。
f='Fizz';b='Buzz';for(i=0;i++<100;)document.write(([f+b,,,f,,b,f,,,b,f,,b][i%15]||i)+'<br>')
でもこのサイズでもgolferには全然かないません。

# re: FizzBuzzを今更作ってみた 2007/11/08 10:57 dayflower

配列んとこ間違えました
[f+b,,,f,,b,f,,,f,b,,f]

# re: FizzBuzzを今更作ってみた 2007/11/08 11:09 dayflower

あともひとつテクとして
if(!(i%5))a=(b?'':a)+'buzz'
みたいな括弧の頻出するif文は
i%5||(a=(b?'':a)+'buzz')
みたく論理演算子を使うと短くなったりします。CとかJavaとかでも使える手です(JavaScriptなので余計な括弧が増えてますが)

以上長々と失礼しました。

# re: FizzBuzzを今更作ってみた 2007/11/08 11:20 かつのり

コメントありがとうございます。
IFなしバージョンすごいですね。
もうちょっと短縮化を試してみます。

# re: FizzBuzzを今更作ってみた 2007/11/08 14:15 かつのり

Ozyさんのコードをさらに縮めるのに挑戦して挫折orz

for(i=0;i++<100;document.write((i%5?a||i:a+"Buzz")+"<br>"))a=i%3?"":"Fizz"

単純にOzyさんのコードのprintをdocument.writeと<br>付に変更しました。
これより短いのは無理かも。

# re: FizzBuzzを今更作ってみた 2007/11/08 15:41 凪瀬

私も7行テトリスには感化された口ですw
でも、実際にやると短くコード書けねぇ!
読んで解析するだけでお腹一杯ですよぅ

タイトル  
名前  
Url
コメント