■ FizzBuzz - Golf Challenge
FizzBuzzプログラムを書くのが流行っているみたいなので私も参加してみることに。
Perl部門
1. 目指せ最短 (perl -eも含めて56byte)
perl -e'die+map{(Fizz)[$_%3].(Buzz)[$_%5]||$_,$/}1..1e2'
※ perl -lオプションを使わずに最短を目指す。標準エラー出力がNGの場合はprintを使って57byteに
perl -e'print+(Fizz)[$_%3].(Buzz)[$_%5]||$_,$/for 1..1e2'
※ anarchy golf - FizzBuzz で換算すると48byteでPerl最短 (perl -eを含めない)
print+(Fizz)[$_%3].(Buzz)[$_%5]||$_,$/for 1..1e2
これだと perl FizzBuzz.pl と実行できて Code Golf に参加できます。
お約束の展開
2. ppencodeバージョンで
perl -e "print q q print q and print chr oct oct ord uc q map m and print chr oct oct oct ord uc q else and print chr ord uc qw q for q and print chr ord q tie gt and print chr length q x rename sethostent srand pack pipe setpwent syscall else eq split sleep endservent qw require symlink ne keys ord require x and print chr length q q splice srand getservbyname setnetent ne reset endprotoent foreach scalar rewinddir cos setnetent not else getprotobyname q and print chr oct oct oct ord uc q rmdir and print chr oct hex ord uc q dump and and print chr oct oct oct ord uc qw q binmode q and print chr oct hex ord uc q my m and print chr oct oct oct ord uc q oct no and print chr oct oct ord uc q rmdir and print chr oct hex ord uc qw q wait q and print chr oct oct ord uc qw q fcntl q and print chr oct hex ord q q eq and print chr ord uc qw q bind q and print chr ord q dump and and print chr length q q splice srand getservbyname setnetent ne reset endprotoent foreach scalar rewinddir cos setnetent not else getprotobyname q and print chr length q q splice srand getservbyname setnetent ne reset endprotoent foreach scalar rewinddir cos setnetent not else getprotobyname q and print chr oct oct oct ord uc q rmdir and print chr oct hex ord uc q dump and and print chr oct oct oct ord uc qw q bless q and print chr oct hex ord uc q my m and print chr oct oct oct ord uc q lc eval and print chr oct ord uc q each ne and print chr oct hex ord uc qw q wait q and print chr oct oct hex ord qw q die q and print chr oct oct hex ord qw q die q and print chr oct oct oct ord uc qw q binmode q and print chr oct hex ord uc q my m and print chr oct oct ord uc qw q bind q and print chr oct oct oct ord uc qw q binmode q and print chr oct oct ord uc qw q gt q and print chr ord qw q for q and print chr ord q xor x and print chr ord q or no and print chr ord q q q and print chr oct oct oct ord q eq ne and print chr oct oct ord uc qw q fcntl q and print chr oct oct ord uc qw q for q and print chr oct oct oct ord q eq le and print chr ord q ne sin and print chr hex ord q m alarm" | perl
※ perlの予約語だけでプログラミングした場合
他の Perl Monger の解答
3. 404 Blog Not Found:ブクマゴルフってどうよ? (66byte)
perl -le 'print $_%15?$_%5?$_%3?$_:Fizz:Buzz:FizzBuzz for(1..100)'
※オーソドックスな実装
4. ひおにっき(2007-05-09) [Program] FizzBuzz (56byte)
perl -le'print+(Fizz)[$_%3].(Buzz)[$_%5]||$_ for 1..100'
※インスパイヤの元ネタ。おそらくこれが最短でスマートな実装かも。hioさんの実装よりも短くしようと頑張ったけど、結局抜けませんでした。
5. Golf Challenge: FizzBuzz (この中から面白い実装をピックアップ)
perl -le 'print+($_,Fizz,Buzz,FizzBuzz)[3&19142723>>2*$_%30]for 1..100'
※ あとでググって見つけたページ。自分の解答もかぶっててちょっと悔しかったです。(><)
6. YappoLogs: FizzBuzzのPerlさいたんきろくたっせい(34ばいと) (Yappoさんのwarn実装)
perl -le'warn((Fizz)[$_%3].(Buzz)[$_%5]||$_)for 1..100'
※ FizzBuzz at -e line 1. みたいな表示になるけど、hioさんの実装より1byte短くなる
7. Acme::FizzBuzz を使えば、これ最強
SET PERL5OPT=-MAcme::FizzBuzz # MS-DOSの場合
setenv PERL5OPT="-MAcme::FizzBuzz" # tcsh系の場合
PERL5OPT="-MAcme::FizzBuzz"; export PERL5OPT # bash系の場合
※ 環境変数PERL5OPTを使う方法はmiyagawaさんに教えてもらいました。
perl -e1
やっぱりPerl最強です。Ruby や Python でもこの最短記録を抜けるのかな?
anarchy golf - FizzBuzz #Language Ranking ではPerlを抜いてBashが1位で43byte、すげー。どんなコードなんだろうか。興味津々です。
コメント
すみません。編集したときに複数トラックバックされてしまったようです。申し訳ありませんが、削除いただけると orz
投稿者: Makoto Kaga | 2007年05月13日 01:33
Makoto Kagaさん、PostScript面白いですねー。トラックバックありがとうございました。
投稿者: TAKESAKO | 2007年05月13日 21:36
どうやら、これらしいですね~。
> seq 100|sed '5~5s/.*/Buzz/;3~3s/[^B]*/Fizz/'
http://jarp.does.notwork.org/diary/200705a.html#200705092
投稿者: yamagata21 | 2007年05月16日 00:05
>yamagata21さん
おおおお。情報ありがとうございます!すげー。この発想はありませんでした。
awkじゃなくってGNU sedを使ってseqの結果を置換するのかー。目から鱗。
投稿者: TAKESAKO | 2007年05月16日 00:54
げげ、すみません、こちらのBlogの再構築中に余計なTrackback pingを2回も送信してしまいました。ごめんなさい、削除いただけると。
投稿者: Makoto Kaga | 2007年07月26日 13:01