HSP で FizzBuzz ワンライナー

どうしてプログラマに・・・プログラムが書けないのか?
事の発端
Fizz Buzz - Wikipedia
Wikipedia による解説
HSP3のスクリプトを垂れ流すブログ: FizzBuzz問題
HSP による回答例
実行結果図鑑 - HSP開発wiki
HSP での出題
まずは、普通に。まだまだ余裕はあります。
repeat 100,1:t=""+cnt:if cnt\3=0{t="Fizz"}if cnt\5=0{t="Buzz"}if cnt\15=0{t="FizzBuzz"}mes t:loop
"FizzBuzz"を消したい。
repeat 100,1:t="":if cnt\3=0{t="Fizz"}if cnt\5=0{t+"Buzz"}if t=""{mes cnt}else{mes t}loop
繰り返し処理のカウンター、cntをiにかえる。
repeat 100:i+:t="":if i\3=0{t="Fizz"}if i\5=0{t+"Buzz"}if t=""{mes i}else{mes t}loop
mes命令を一個にまとめてみる。
repeat 100:i+:t="":if i\3=0{t="Fizz"}if i\5=0{t+"Buzz"}if t=""{t=i}mes t:loop
繰り返しをrepeat~loopじゃなくて、各マクロ(do~until、while~wend、for~next)にかえてみる。
do~until
do:i+:t="":if i\3=0{t="Fizz"}if i\5=0{t+"Buzz"}if t=""{t=i}mes t:until i>99
while~wend
while i<100:i+:t="":if i\3=0{t="Fizz"}if i\5=0{t+"Buzz"}if t=""{t=i}mes t:wend
for~next
for i,1,101:t="":if i\3=0{t="Fizz"}if i\5=0{t+"Buzz"}if t=""{t=i}mes t:next

結果、 dountil マクロを使ったスクリプトと fornext マクロを使ったスクリプトが、それぞれ 75 バイトで最短でした。う~ん、 t=""if t="" が無駄っぽく感じます...む~、三項演算子か、文字列の掛け算( "hoge"*3 が "hogehogehoge" とか)できたら、もうちょっと短くなるんだけどなー。短く出来そうで出来ないこの感覚が...

今見直せば短くできるところはありました。

repeat版 ( 73 バイト)
repeat$64:i+:t="":if$=i\3{t="Fizz"}if$=i\5{t+"Buzz"}if""=t{t=i}mes t:loop
for 版( 72 バイト)
for i,1,101:t="":if$=i\3{t="Fizz"}if$=i\5{t+"Buzz"}if""=t{t=i}mes t:next

$ なんかを使ってスペースを削ってます。

文字列の掛け算(繰り返し、リフレイン)を追加するパッチ - chaperattaの日記なんかを使えばもっと短くできるのになー。もちろん公式なHSPで動くコードじゃないのでこれは認めない。

インフォメーション

公開日時
2007年6月15日 午後2時35分2秒
最終更新日時
2008年3月7日 午前9時54分37秒
カテゴリ
HSP