HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2011
0825
k.FizzBuzz問題の解答 in HSP29解決


k.

リンク

2011/8/25(Thu) 13:17:54|NO.40840

こんにちは。
HSPでのFizzBuzz問題への解答を集めてみたいと思い、投稿しました。

[FizzBuzz問題とは]
・1から順に数を出力していきます
・ただし、数えようとした数が
 3の倍数の時は「Fizz」
 5の倍数の時は、「Buzz」
 15の倍数の時は、「FizzBuzz」
 とだけ出力せねばなりません。

[出力例]

1 2 Fizz 4 Buzz Fizz 7 8 Fizz Buzz 11 Fizz 13 14 FizzBuzz 16

[このスレッド内でのルール]
・HSPの一つのソースで完結する(他のプログラムとの連携禁止)
・出力には「mes」命令を使う
・改行は0バイト、英数字は1バイト、2バイト文字は2バイトとし、できるだけ短いコードのほうが良いコードとする。
・出力は100まで実行する。(100含む)

以上のルールでお願いします。
なお、私が適当に書いたコードは

repeat 100,1 if cnt\15=0:mes "FizzBuzz":else:if cnt\5=0:mes "Buzz":else:if cnt\3=0:mes "Fizz":else:mes ""+cnt loop
の112バイトです。では、よろしくお願いします。



この記事に返信する


Cookies

リンク

2011/8/25(Thu) 13:51:27|NO.40842

こんにちは。ブログやっております。
いや、別にブログの宣伝してるわけではなくてですね、ブログに書いたことありますってことです。

http://blogs.yahoo.co.jp/tastycookies146/2747945.html
#runtime "hsp3cl"は付いてますが、それを除けばmesで出力してるし別にいいかと。
ちょうど100までですし。

一番短いコードを一応写しておきます。

for i,1,100:F=""+i,"Fizz","Buzz","FizzBuzz":mes F.((i\3=0)+(i\5=0)*2):next
74バイト。
記事内でも言っている通り、メモリ使用だの非効率だのはしりません。
あくまでバイト数を少なくしたのです!



FizzBuzz問題時、「余剰記号を使わない。」っていう縛りは、結構楽しいですよw



Cookies

リンク

2011/8/25(Thu) 14:00:32|NO.40843

ちょっと短くなりました。

for i,1,101:F=""+i,"Fizz","Buzz",F.1+F.2:mes F.((i\3=0)+(i\5=0)*2):next
72バイト。
ついでに、さっきのが99まで出力しなかったのを修正。



k.

リンク

2011/8/25(Thu) 14:19:30|NO.40845

>Cookiesさん
なるほど〜
文字列を配列に書きこんでおいてから、その添字を計算して出力するわけですね。
FizzBuzzの添字3は、Fizzの添字1+Buzzの添字2であるところがミソですね。
いきなり縮められてしまいましたw
(#ついでに、こちらの環境(Win XP,HSP 3.2)だと、#runtime "hsp3cl"無しでも動きました)

>FizzBuzz問題時、「余剰記号を使わない。」っていう縛りは、結構楽しいですよw
たしかにそうなのですが、問題がかなり難しくなり、参加する人が少なくなってしまうので(自分含め)
そういう制限は無しとしましたw

初心者のかたも上級者の方も、どんどん書き込んでいってくださいね。



k.

リンク

2011/8/25(Thu) 14:28:12|NO.40846

あ、#runtime "hsp3cl"は、CUIにするためのランタイムだったんですね
早とちりしてすみませんでした。



れみはる

リンク

2011/8/25(Thu) 18:57:54|NO.40849

配列とブーリアン値をうまく利用して
repeat 100,1:x=cnt:r=""+x,"Fizz","Buzz",r.1+r.2:mes r(2*(x\3==0)+(x\5==0)):loop
…と書こうとしましたが
"=="と"!"を"="と"!"と表記できたり、 HSPにもfor文があったのを今頃ここで知りましたよ cookieさんの物の配列のドットを消して70バイト(笑)
for i,1,101:F=""+i,"Fizz","Buzz",F.1+F.2:mes F((i\3=0)+(i\5=0)*2):next



who

リンク

2011/8/25(Thu) 19:29:14|NO.40850

ちょっと趣旨が違いますが、
FizzBuzzを考えていると、
「2進数について偶数桁の数値の和から奇数桁の数値の和を引いたかずが3の倍数になる数は3の倍数である。」
が成り立つことに気がつきました(証明済)。役に立たないけど。



Cookies

リンク

2011/8/25(Thu) 20:29:11|NO.40851

>>れみはるさん

>"=="と"!"を"="と"!"と表記できたり、
そうなんですよね。
自分も普段は「==」,「!=」と書くようにしているつもりなんですが、
バイト数を短くするために。

>HSPにもfor文があったのを今頃ここで知りましたよ
for〜next制御は、プリプロセッサのマクロ機能を使って実現されています。
ってHDLには書いてあります。
CやJava等に近い記述をしたいような場合にお使い下さい。
初心者の方には、repeat〜loop命令か、if命令による繰り返し記述を推奨します。
とも。
基本的にforはあまり使ってほしくないみたいですね。
repeatはcntが便利ですが、"repeat"と6文字ですし、
forで「i」などの一文字変数名を使ったほうが短くなるかと。


あまり細かいことで、言おうか迷いましたが。。。
>cookieさんの物
Cookie"s"ですw
別に大文字小文字は気にしませんが、やっぱり複数形はね。


>配列のドットを消して70バイト(笑)
その発想はなかったwww



who

リンク

2011/8/25(Thu) 20:35:53|NO.40852

Cookiesさんじゃないですか。
ひよこだったのできずきませんでした。



Cookies

リンク

2011/8/25(Thu) 20:43:25|NO.40853

>Cookiesさんじゃないですか。
なんかずっと前にも違う人に同じことを言われた気が…
もしかしたら同一人物!?w

>ひよこだったのできずきませんでした。
じゃあなんだったら気づきます?w
昔からずっとひよこでしたけど。
一時期なんて「ひよこ」ってハンネだったんですからね。



スレの本題と関係のない話をしてしまったことにお詫び申し上げます。



who

リンク

2011/8/25(Thu) 20:46:29|NO.40854

こちらも、スレの本題と関係のない話を申し上げてしまったことにに深くお詫び申し上げます。



通りすがり

リンク

2011/8/25(Thu) 20:50:57|NO.40855

ルールの悪用(?)

「改行は0バイト」を上に反映させただけ。

for i,1,101
F=""+i,"Fizz","Buzz",F.1+F.2 mes F((i\3=0)+(i\5=0)*2) next

[67Byte]



れみはる

リンク

2011/8/25(Thu) 21:52:38|NO.40856

>>40855
あ、改行はバイト数増えなかったですか。
67Biteが限界かな?

だが諦めない(キリッ


>>40851
複数形でしたね Σ(´∀`;)
これは失礼しました。



……

リンク

2011/8/25(Thu) 22:18:57|NO.40858


#include"f"

fというファイルにFizzBuzzを書いておく
11byte



Cookies

リンク

2011/8/25(Thu) 22:22:10|NO.40859

>HSPの一つのソースで完結する(他のプログラムとの連携禁止)
これにひっかかるのでは?



……

リンク

2011/8/25(Thu) 23:06:19|NO.40860

見てなかった……

じゃあHSP自体に100までのFizzBuzzを出力するfという命令を追加する
これなら1Byte



Cookies

リンク

2011/8/25(Thu) 23:35:27|NO.40861

そんなことするくらいなら、
どっかのネタ言語がHello World出力するみたいに、0バイトのソースはFizzBuzzするとか。

というかそれ、もはやHSPじゃないし。



hexa.hemi

リンク

2011/8/26(Fri) 01:18:36|NO.40862

パソコンの中にファイルがあったので

for i,1,101 b="" if i\3=0:b="Fizz" if i\5=0:b+"Buzz" if""=b:b+i mes b next
68Byteかな?



hexa.hemi

リンク

2011/8/26(Fri) 01:21:17|NO.40863

連投すいません

for i,1,101 b=" if i\3=0:b="Fizz if i\5=0:b+"Buzz if""=b:b+i mes b next
65Byteかも



Cookies

リンク

2011/8/26(Fri) 01:30:53|NO.40864

え、なにそれ。
行末の"って省略できるの!?
しかもb+iって。。。

見た瞬間は、別の言語かと思いました。。。。



ORZ

リンク

2011/8/26(Fri) 08:37:03|NO.40865

ひたすらダイエットをしているこの流れに俺はあえて反逆するぞ

notesel code noteadd "#runtime \"hsp3cl\""; for i,1,101 F=""+i,"Fizz","Buzz",F.1+F.2 noteadd "mes \""+F((i\3=0)+(i\5=0)*2)+"\"" next notesave "fizzbuzz.hsp"
FizzBuzzを100までど根性で出力するコードを出力するぞ。



KA

リンク

2011/8/26(Fri) 09:32:52|NO.40866

技法的に簡素化するのか、書式のゆらぎを突いて短く
するのか良く分らないスレです。

スクリプト上で短くても、実行時のサイズや速度が大
きかったら意味が無いのでは。

質問者の狙いが、何処に有るのかにもよりますが。



kitu

リンク

2011/8/26(Fri) 10:06:09|NO.40867

>kAさん
ハイスペックなパソコンとかで開発してると、意識しづらいですが
実行速度もソースの見易さも何もかも度外視してソースの短さだけを追求するコーディングは
実用面でも意外に重要だったりしますよ〜

例えばポケコン等での開発だと、ソースを置ける領域が目茶苦茶に小さいので
ありとあらゆる省略法を駆使して、1行にみっちり255文字詰め込んで
自分以外読めないんじゃね!?っていうようなコードにしなければ
大きなプログラムを組めなかったりします^^;

仮にポケコン等にHSPのインタプリタが搭載されて、そこでカツカツの開発をすることになったら
Cookiesさんや、hexa.hemiさんみたいなコードが採用されることになると思います〜
(もちろん場合によっては速度との兼ね合いも必要ですけども)
ダブルクォーテーションの省略とかの仕様に明記されていない省略法を使うのも基本テクのひとつです


…っていうかそこまで深く考えなくても、FizzBuzz系の問題はゲームみたいなものなので
実用面でのツッコミは不要だと思いますよ〜(-▽-*



いなえ

リンク

2011/8/26(Fri) 10:48:15|NO.40868

hexa.hemiさんのコードを改変。
63Byte

for i,1,101 b="Fizz if i\3:b=" if i\5=0:b+"Buzz if""=b:b+i mes b next



Cookies

リンク

2011/8/26(Fri) 11:37:02|NO.40869

>>KAさん
>技法的に簡素化するのか、書式のゆらぎを突いて短くするのか良く分らないスレです。
両方を駆使して一番短くすればいいじゃないですか。
書式のゆらぎというか、条件がそうなんですから。
条件に一番合ったソースを乗せればそれが一番よいかと。

>スクリプト上で短くても、実行時のサイズや速度が大きかったら意味が無いのでは。
まあ、そりゃあそうですけども、FizzBuzzってのはもともと意味ないことですから。遊び。
ソースを短くすることだけに熱中すればよいのです!



塩弟

リンク

2011/8/26(Fri) 17:04:54|NO.40879

今更な質問かもしれませんが、初心者ですのでお許しください。
100まで表示できれば、100以上もついでにできてもいいのでしょうか?
for i,1,101
next

repeat
i++
loop
ではダメなんでしょうか? まぁ、フリーズするんですが・・・。



who

リンク

2011/8/26(Fri) 17:09:41|NO.40880

[このスレッド内でのルール]
・HSPの一つのソースで完結する(他のプログラムとの連携禁止)
・出力には「mes」命令を使う
・改行は0バイト、英数字は1バイト、2バイト文字は2バイトとし、できるだけ短いコードのほうが良いコードとする。
・出力は100まで実行する。(100含む)



k.

リンク

2011/8/26(Fri) 18:15:34|NO.40881

申し訳ありませんが、このスレの意向と明らかに反する解法
(HSP自体にFizzBuzz機能をつける、など)は評価の対象外とさせて頂きます。
ルールの曖昧さをお詫び申し上げます。

>>KAさん
>技法的に簡素化するのか、書式のゆらぎを突いて短く
>するのか良く分らないスレです。
こちらとしましては、どちらも目指して欲しいです。理由は
・技術的に簡素化したコードを読む&書くことによって、未知のアルゴリズムを発見することができる
・短く書くことによって、HSPの未知の書式を発見することができる
などからです。

>>ORZさん
ある意味最強のコードですね…
なんか惚れましたw

>>hexa.hemiさん
>>いなえさん
>b+"Buzz
この書き方は勉強になりました。
>if""=b:b+i
ダブルクォーテーションならば、ifの後に続けて書くことも可能なんですね
初めて知りましたw

>>塩弟さん
申し訳ありませんが、100以降の出力はしてはいけないことにします。
ルールに明確に書いておくべきでした。すみません。
また、初心者歓迎致します。



Lisa

リンク

2011/8/26(Fri) 21:09:53|NO.40885

いなえさんのコードを改変。
62バイトです


do i+ s="Fizz if i\3:s=" if i\5=0:s+"Buzz if""=s:s+i mes s until$63<i



KA

リンク

2011/8/27(Sat) 14:49:18|NO.40894

>まあ、そりゃあそうですけども、FizzBuzzってのはもともと意味ないことですから。遊び。
→そういうものでしたか納得しました。

>>・技術的に簡素化したコードを読む&書くことによって、未知のアルゴリズムを発見することができる
→これは納得できます。

>>・短く書くことによって、HSPの未知の書式を発見することができる
→「推奨されない書式」も発見できるでしょう。(これが一番言いたかった)


目的自体は納得できたので、いらぬコメント失礼しました。



ONION software Copyright 1997-2023(c) All rights reserved.