投稿
おちゃめ ochame_nako
第1回プチコン3号コードゴルフを開催します。 指定されたコードゴルフはお題に沿ってできるだけ短い(文字数の少ない)プログラムを作るというものです。 今回のお題は超有名な「FizzBuzz」です。 1から順番に数字を画面に表示していくのですが、3の倍数の時は数字の代わりにFizzと表示して5の倍数の時はBuzzと表示します。3の倍数かつ5の倍数の時はFizzBuzzと表示します。 例えば1~20までの表示例はこんな感じになります。 1 2 Fizz 4 Buzz 6 7 8 Fizz Buzz 11 Fizz 13 14 FizzBuzz 16 17 Fizz 19 Buzz 中上級者は腕試しとして、初心者は文字数に拘らずこの動作をするプログラムを作ってもいいと思います。 細かいルール等はコメントにて。
8そうだね
プレイ済み
返信[1]
親投稿
おちゃめ ochame_nako
今回は1~100までの結果を表示してください。 外部ファイル(スロット)を使っても良いですが、その外部ファイルを生成するプログラムも文字数にカウントします。 これは、例えばFIZZBUZZ関数(関数名はF)を作ってそれをプログラムスロット1に入れた状態実行したら「USE 1F」の6文字でFizzBuzzが完成」というわけではなくプログラムスロット1の文字数もカウントするということです。 改行した場合に限り文字数には改行コードを含みます。(3行で記述した時は改行コードを2つ分加算) つまり、改行無し、コロン無しの方が文字数では有利になります。 投稿の際はネタバレチェックを入れるのを忘れないようにお願いします。 締め切りは5月17日(日)23:00です。
0そうだね
プレイ済み
返信[2]
親投稿
おちゃめ ochame_nako
以下、私がプチコン3号で即興で作ってみたプログラムです。 mkIIで作ったものよりも10文字も長くなっていますが、これはmkIIから仕様変更されたのが影響しています。 できるだけ投稿する前には見ないようにお願いします。 見た後でもさらに短くできる方法があればそれをネタバレで書き込んでもらえるとすごくうれしいです。
0そうだね
プレイ済み
返信[3]
親投稿
おちゃめ ochame_nako
71文字
0そうだね
プレイ済み
返信[4]
親投稿
MIKI ifconfig
ゴルフ苦手なんですがやってみました。100より多いのはごめんなさいってことで
0そうだね
プレイ済み
返信[5]
親投稿
けい kei0baisoku
挑戦してみました。 コードを意図的に短く書くというの自体が、普段と真逆の初体験です……(・・;) 一応、仕様を満たした上で素直に書いて、変にムダな所は無いは…ず
0そうだね
プレイ済み
返信[6]
親投稿
けい kei0baisoku
やべえ、WAIT 10 消し忘れた(^^; 恥ずかしいw 脳内削除してご覧頂けますと幸いですm(__)m (ひとりごと)ベテラン初心者さんや普通の初心者さんは参加しないのかなー(´з`)
2そうだね
プレイ済み
返信[7]
親投稿
けい kei0baisoku
別解。反則版。 36文字。(`・ω・´)
5そうだね
プレイ済み
返信[8]
親投稿
ナツキ natukin1978
1~20までの表示例に間違いが…… 6は3の倍数なのにそのまま表示されてます。
0そうだね
プレイ済み
返信[9]
親投稿
VSYNC 38 NZMKN1038
本気で考えた結果です。
1そうだね
プレイ済み
返信[10]
親投稿
ツララ LongIceSword
世界のナベアツさんのあのネタって元はプログラムネタだったんですね。知らなかったー。
3そうだね
プレイ済み
返信[11]
親投稿
printf printf
皆さん凄い短い! LOCATE 0,って!なにそれ凄い! キャリッジリターンがあればなーって悩み所だったから、目から鱗雲がモクモクと! BASICは奥が深いなー\(´д`)/
1そうだね
プレイ済み
返信[12]
親投稿
pinfu ANNAININ
初心者だから、 なるだけ丁寧に、結果もちゃんと見ることの出来る様にしてみました♪ 結果、1画面プログラム! てか、皆さん凄すぎ(笑) やるからには、自分なり方法で挑戦したいけど、知らない書き方ありすぎだなぁ(笑) うん。今は参加賞レベルでいい!
0そうだね
プレイ済み
返信[13]
親投稿
改行は、IF THEN文でENDIFをスッ飛ばすのに使えそうですね。
0そうだね
プレイ済み
返信[14]
親投稿
3DSマークでソースが隠れてたので、見易いように改行を入れました。内容は先程と同じ。
0そうだね
プレイ済み
返信[15]
親投稿
KU kerorinU
FizzBuzzが1byteで記述できる。そう、HQ9F+ならね。 コンテスト投稿にはネタで返すのが私のポリシーです
0そうだね
プレイ済み
返信[16]
親投稿
初心者なのでドストレートにやってみました。アレを使うのかな? ネタバレはまだ見ずにもうちょっと揉んでみたいです。
0そうだね
プレイ済み
返信[17]
親投稿
結局無駄を省くくらいしかできませんでした……。
0そうだね
プレイ済み
返信[18]
親投稿
おちゃめ ochame_nako
すみませんが、多忙のためまとめやレスは明後日くらいに書きます
3そうだね
プレイ済み
返信[19]
親投稿
おちゃめ ochame_nako
まとめが遅れてすみません。 とりあえず、考え方と私が作ったプログラムの簡単な解説をしておきます。 FizzBuzzのプログラムを作るポイントは「3の倍数」と「5の倍数」をどのように判断するかということになります。 「3の倍数」というのは「3で割ったら割り切れる数」であるため「3で割ったら余りがゼロになる数」かどうかで判断すれば良いです。 プチコン3号には剰余を求める(割り算の余りを求める)演算子であるMODが用意されています。 これを使えば「Aが3で割り切れる場合」というのは IF A MOD 3==0 THEN ~ と表記できます。 あと「5で割り切れる場合」と「3で割り切れる、かつ、5で割り切れる場合」を判定してやれば完成です。
0そうだね
プレイ済み
返信[20]
親投稿
おちゃめ ochame_nako
これで基本的な考え方が分かったと思うので私が作ったプログラムの解説をします。 3の倍数というのは3で割った余りが0なので上記のようにI MOD 3==0という条件式になりますが、論理反転(!)を使うことで!(I MOD 3)とすることができます。 論理反転はfalseとtrueを反転する演算子です。 プチコン3号ではfalseは0ですが、0以外の数字はtrueとして扱われるためI MOD 3は3で割り切れない時はtrueとして扱われるのでそれを反転した!(I MOD 3)は3で割り切れる場合になるためです。
0そうだね
プレイ済み
返信[21]
親投稿
おちゃめ ochame_nako
表示する場合に"Fizz"*!(I MOD 3)とすると!(I MOD 3)の値はIが3で割り切れる場合には1になるため"Fizz"を1個表示し、3で割り切れない場合には値は0になるため"Fizz"を0個表示(=表示しない)となります。 Buzzも同様に"Buzz"*!(I MOD 5)とするとIが5の倍数の時のみBuzzと表示可能です。 FizzやBuzzを表示する場合は数字の表示は行わないようにしなくてはなりません。 これはFizzやBuzzを表示する場合は0個数字を表示すれば解決です。これはさらに論理反転を追加して!!という形にすることで「0を0」に「0以外の値を1」にできます。 STR$(I)*!!(I MOD 3)*!!(I MOD 5)
0そうだね
プレイ済み
返信[22]
親投稿
おちゃめ ochame_nako
以上を組み合わせるとSTR$(I)*!!(I MOD 3)*!!(I MOD 5))+"Fizz"*!(I MOD 3)+"Buzz"*!(I MOD 5)を表示すれば良いことが分かります。 アルゴリズムを変えない限りはここから根本的に短くするのは無理なのでここから無駄な部分を省いて1文字ずつ短くしていきます。 まず、気付くのはI MOD 3とI MOD 5が2カ所使われているという点です。 これはそれぞれ別の変数に入れることで短縮が可能です。 それによって演算優先順位の関係で必要不可欠だったカッコも省略でき!A、!Bで済むようになります。 FOR I=1TO 100:A=I MOD 3:B=I MOD 5:?STR$(I)*!!A*!!B+"Fizz"*!A+"Buzz"*!B:NEXT
0そうだね
プレイ済み
返信[23]
親投稿
おちゃめ ochame_nako
ここからすぐに短縮可能と気づくのはコロンが省略できるということです。 ただし、PRINT(?)とNEXTの間のコロンは省略できません。 これは!!A*!!Bを!!(A*B)とすることで解決できます。(カッコの後のコロンは省略できる) 今回は結果がスクロールされてもOKだったのですが、もしも、画面内に1~100までの結果をすべて表示するという場合にはPRINTの最後の部分に”,:”を付ければOKです。 PRINTの最後が「,」になるため今度はコロンが省略できないということです。 過去にmkIIで作ったプログラムをプチコン3号にベタ移植しただけなので私のプログラムは最短では無いですが、リスト短縮の仕組みが大体でも分かれば良いかなと思います。
0そうだね
プレイ済み
返信[24]
親投稿
おちゃめ ochame_nako
みき★さんへ 3と5の最小公倍数である15単位で表示を行うというのは今回の場合だと最短には繋がりませんでしたが、良いアイデアですね。 パターン化できるものを見つけ出すということが短縮への一歩になりますので。 けいさんへ (WAIT 10削除で)81文字(スペース、改行込み)なので普通に考えれば短い部類です。 今回の最短のための重要ポイントであるLOCATE 0,は含まれていたもののIF~THENを使ったのが最短を逃した原因ですね。 36文字のやつはネタとしてはありだと思いますよ(笑)
1そうだね
プレイ済み
返信[25]
親投稿
おちゃめ ochame_nako
うえこうさんへ 1から100までの結果をそのままリスト上で記述して表示するというのは本来は無駄な作業ですが、今回のように結果が正しければ問題ないという場合にはこれでも正解です。 2行で作っている方は3つのIF文の判定の関係で改行しないと正常に動作しませんが、3の倍数や5の倍数をフラグを用いて判断しているのは良いと思います。 ナツキさんへ 指摘ありがとうございます。 まともに校正してない書き込みというのが丸わかりなミスですね(笑)
1そうだね
プレイ済み
返信[26]
親投稿
おちゃめ ochame_nako
VSYNCさんへ 66文字(スペース込み)で今回最も短かったです。 おめでとうございます。 今回はLOCATE 0,を使うことが最短への要でしたね。 もちろん、その他の部分も無駄な部分は一切ありません。すばらしい! ツララさんへ 3の倍数だけではなく3が付く数字も○○するというのはFizzBuzzとは少し異なるためプログラムを作ってみるのもいいかもしれませんね。 各桁の数字をどうやって取得するのかも様々な方法があるため楽しめそうです。
1そうだね
プレイ済み
返信[27]
親投稿
おちゃめ ochame_nako
pinfuさんへ 分かりやすいコード、きちんと整形して表示というのはコードゴルフとは全く異なるものですが、普通に作るならばこれはベターな選択肢だと思いますよ。 コア/co.aさんへ 3DSでMiiverseを見ると3D文字が邪魔になってしまいますからね。 (余分な改行を除いて)77文字というのは結構短いと思います。 あと画面内に結果が収まるというのも良いですね。
0そうだね
プレイ済み
返信[28]
親投稿
おちゃめ ochame_nako
KUさんへ 確かにHQ9F+ならばFizzBuzzは1文字で作れるけどHQ9F+のインタープリタのサイズを考えると・・・(笑) でも、HQ9F+を書く人がいるとは思いませんでしたのでネタとしては十分OKです。 あんぱん うまたろうさんへ その無駄を省くことからすべてが始まります。 そこで限界まで達したら別の表記方法(別のアルゴリズム)がないかを検討していけば良いです。
0そうだね
プレイ済み
返信[29]
親投稿
おちゃめ ochame_nako
というわけで、今回のコードゴルフのトップはVSYNCさんの66文字でした。 一旦数字を表示しておいてLOCATE 0,によってY座標を保持してX座標のみ0にすることで数字の上にFizzやBuzzという文字を上書きするという考えは思いつきませんでした。 mkIIのリスト短縮法は開拓しつくした感じがあったのですが、プチコン3号では私もまだまだみたいですね。
0そうだね
プレイ済み
返信[30]
親投稿
おちゃめ ochame_nako
第1回となる今回は超有名なFizzBuzzで行いました。 第2回のネタは見つかったので今週末には開催しようと思います。 第3回以降は未定になっています。 ネタはこのトピで随時募集を行っているので気軽にご提案ください。 リスト短縮を意識せず、マルチステートメントで記述しなくても1画面に収まるくらいのシンプルな内容のものが望ましいです。 第2回は金曜の晩~日曜の晩に掛けての48時間程度(丸2日程度)にしようと思うのですが、開催期間などでも「第1回と同じく1日(24時間程度)の方が良い」「3日(4日)くらいは欲しい」などのご意見があれば気軽に言ってください。 もちろん私の代わりにプチコン3号コードゴルフを開催してくれる人がいれば私に遠慮せずどんどん行ってください。
2そうだね
プレイ済み
返信[31]
親投稿
けい kei0baisoku
お忙しい中、解説とまとめありがとうございました(^O^) !とかけ算を使った表記は、回答後におちゃめさんの参考コード見て初めて気付きました(´Д`) プログラム覚えたての頃は使ったこともあったのですが、最近は普段、専ら可読性を重視した書き方を続けてるので思い浮かびませんでした………ぐぬぬ、悔しいです(><) 第二回も楽しみにしています(^^) 期間は、24時間だと投稿に気が付いた時点で終わっちゃってる可能性があるので、個人的には48時間以上あると嬉しいです(^^;
1そうだね
プレイ済み
返信[32]
親投稿
pinfu ANNAININ
解説お疲れ様でした♪ 実はMODを使うの初めてでした(笑) とりあえず参加だけでも!と思い参加した訳ですが、 皆さんの書き方を見て、こんな風に出来るのかぁ。と、勉強になりました。 うん。みんなスゴ過ぎ(笑)
1そうだね
プレイ済み
返信[33]
親投稿
MIKI ifconfig
勉強になります! そしておちゃめさんの画面写したから 15n+6 が fizz にならないバグ!!orz ゴルフの次は IOBCC とかどうですか?
0そうだね
プレイ済み
返信[34]
親投稿
けい kei0baisoku
そう言えばほかの人の回答の感想書くの忘れてました(´з`) pinfuさんとみき先生が苦手そうなのは意外でした。 そして、個人的にはうえこうさんが経験の割にかなりスマートにまとまっていて驚きました。 こういうの、かなり得意なのでは。
0そうだね
プレイ済み
返信[35]
親投稿
きわめて丁寧な解説とまとめ、ありがとうございました。 今回の白眉はLOCATEを使ったワザでしたね、完全に盲点でした。コードゴルフ、奥が深い…。
0そうだね
プレイ済み
返信[36]
親投稿
おちゃめ ochame_nako
けいさんへ 確かに私自身も毎日Miiverseを見ているわけではないので24時間程度の期限だと気づいた時に終わっていたということになりかねないですね。 したがって、第2回は少し長めにしてみました。 ちなみに私はけいさんとは逆に普段は可読性よりも短く書くことを考えています(笑) pinfuさんへ 参加することに意義があると思います。 今回はみんな自分の書き方でコードを書いていて見ていていろいろ楽しめました。
1そうだね
プレイ済み
返信[37]
親投稿
おちゃめ ochame_nako
みきさんへ 今回は私のミスなので例の通りに表示するプログラムはバグとは見なさず特別にOKとします(笑) IOBCCはコードゴルフと違って判定が難しいですね。 コア/co.aさんへ 開催するならば解説もちゃんと書かないと「文字数が少ない人の勝利」で終わってしまい深みがないと私は考えています。 もちろん、他人のコードを見ること自体が勉強になりますが。
0そうだね
プレイ済み
返信[38]
親投稿
けい kei0baisoku
>ちなみに私はけいさんとは逆に普段は可読性よりも短く書くことを考えています(笑) ええ、だと思いました(^^; 期間の調整、ありがとうございます(^O^) 今回は幸いすぐに投稿に気付きましたが、大変助かります。 大喜利もそうですが、参加すること自体に意義があるってその通りだと思います。 同じ「解説を見る」にしても、自分で一度考えたかどうかによって理解の深さが段違いに変わってきます。
0そうだね
プレイ済み
返信[39]
親投稿
☆Tatsukin★ tatu_kin1192
遅いかもしれませんが参加します。 77文字です。
0そうだね
プレイ済み
返信[40]
親投稿
☆Tatsukin★ tatu_kin1192
77文字です。 ※欠点:数字が表示されません。
0そうだね
プレイ済み
返信[41]
親投稿
☆Tatsukin★ tatu_kin1192
丁寧書くとこうなります。
0そうだね
プレイ済み
返信[42]
親投稿
☆Tatsukin★ tatu_kin1192
250までやってみました!
0そうだね
プレイ済み