トピック
BlackSoft BlackSoft.mkII3g

第2回 コードゴルフ on the プチコン

第1回好評につき、第2回コードゴルフ大会を開催致します。手元に実機が無い方、また初心者の方も参加しやすいように、お題は簡単なものを考えました。 《問題》 0~9の数字をランダムに出力し続け、同一の数字が3つ並んだ時点で出力を終了せよ。 (例) 86207619782555 ← ここで終了 ※細かいルールは次のコメントにて
5そうだね
プレイ済み
返信[1]
親投稿
BlackSoft BlackSoft.mkII3g
《ルール》 ・改行は1文字と数える ・同一手法が既に出ている場合は文字数が少なくても受賞対象外(早い者勝ち) ・条件を満たしていない場合は受賞対象外 《賞(ゴルフ部門)》 ・大賞 《賞(ゴルフ度外視部門)》 ・最多投稿賞 ・最速投稿賞 《期日(表彰対象)》 12/04 ご参加お待ちしております!
0そうだね
プレイ済み
返信[2]
親投稿
おちゃめ ochame_nako
A=-1WHILE A-B||B-C:C=B:B=A:A=RND(10)?A;:WEND (44文字) この問題を見た瞬間に思い浮かんだ方法なのでさらに短いものができたら再投稿します。 ところで再投稿の回数制限は無いんですか?
3そうだね
プレイ済み
返信[3]
親投稿
ぐはぁ! 先越された上に文字数……orz
1そうだね
プレイ済み
返信[4]
親投稿
BlackSoft BlackSoft.mkII3g
再投稿について、ルールを追加します。 自分が投稿した手法の改善再投稿は、無制限とします。 要は、手法を出した者が改変の権利を得ます。特許みたいなものですね。
0そうだね
プレイ済み
返信[5]
親投稿
BlackSoft BlackSoft.mkII3g
おちゃめさんの投稿を検証した結果、条件を満たしておりますので 「最速投稿賞」 は おちゃめさんに授与致します。 >しょぼーん さん 投稿ありがとうございます。 数分差で、惜しかったですね♪
3そうだね
プレイ済み
返信[6]
親投稿
100文字は使わないと作れない俺って………(笑)
1そうだね
プレイ済み
返信[7]
親投稿
ゆうき mitikata11
まだ初心者ですが、とりあえず出来ました
2そうだね
プレイ済み
返信[8]
親投稿
MIKI ifconfig
乱数好きですね~ repeat r=rnd(10)?r;:s=(s*10+r)mod 1e3:i=i+1until!(s mod 111)&&i>2
3そうだね
プレイ済み
返信[9]
親投稿
MIKI ifconfig
>同一手法が既に出ている 何を以て同一手法とするのか基準が不明ですね。 そんな規則は不要でしょう。
0そうだね
プレイ済み
返信[10]
親投稿
BlackSoft BlackSoft.mkII3g
>何を以て同一手法とするのか 確かにそうですね。うまく定義できなかったので申し訳ないですが、全く同じコードを文字数削減のみ(例えばコロンを省略できた、など)で再投稿したものを表彰対象とはしたくなかったので。 乱数は好きですよ。ゲームには欠かせないじゃないですか♪
1そうだね
プレイ済み
返信[11]
親投稿
おちゃめ ochame_nako
確かに「同一手法」の定義はあった方が良いですね。 「先に投稿したものからコロンやスペースの省略をしただけのものは同一手法とみなす」みたいな具体的な記述がないと「アルゴリズムが同じ」というだけではすごく幅が広くなってしまいますからね。 ちなみに私がすでに投稿したプログラムはコロンやスペースの省略はできないためアルゴリズムが異なるものでないとこれ以上の短縮はできません。 すでにいくつか試してみましたが、現時点では最初に投稿した最もシンプルなものを超えるものは見つかっていません。
0そうだね
プレイ済み
返信[12]
親投稿
おちゃめ ochame_nako
スペースやコロンの省略といった「単純な省略による短縮」ではなくMID$(A$,B,1)をA$[B]を変えるような「置き換えによる短縮」は個人的には同一手法とは定義して欲しくないですね。(あくまで主催者であるBlackSoftさんの意向次第ですが)
1そうだね
プレイ済み
返信[13]
親投稿
otta777 otta777a
REPEAT:Y=X:X=RND(10)C=(C+1)*(X==Y)?STR$(X);:UNTIL C==2 続けて同じ数字を表示した回数をカウントして3になったらループを 抜けるようにしました。違う数字だった場合はカウントを0にしています。 省略しても動作するコロンは省略しました。
2そうだね
プレイ済み
返信[14]
親投稿
BlackSoft BlackSoft.mkII3g
おちゃめさん ありがとうございます。 「置き換えによる短縮」も、ベースのコードがあっての改善なので、完全な「別手法」とはしたくないのが正直なところです。 そもそもコードゴルフという競技がコードの短さを競うものなので、置き換えを制限してしまうのは良くないと思いますが。 お題が簡単なので、上級者については置き換えができないくらいに圧縮したものを投稿していただければ良いと思います。 次回開催時は、その辺りしっかり定義するようにします。
0そうだね
プレイ済み
返信[15]
親投稿
otta777 otta777a
投稿してから気が付きました^^;;; STR$関数は使わなくても問題無かったですね REPEAT:Y=X:X=RND(10)C=(C+1)*(X==Y)?X;:UNTIL C==2 49文字です。
2そうだね
プレイ済み
返信[16]
親投稿
おちゃめ ochame_nako
「置き換え」が同一と見なされるのであればIF文で記述しているものを論理式に置き換えて短縮等も同一扱いになってしまうため投稿できるプログラムの幅が一気に減ってしまうんですよね。 個人的には「これがこんな風に置き換え出来るなんて知らなかった(気づかなかった)」というのを見てみたいため置き換えは歓迎したいところです。
3そうだね
プレイ済み
返信[17]
親投稿
BlackSoft BlackSoft.mkII3g
ゆうきさん 投稿ありがとうございます MCNT の値を、A1~A3に格納するために1~3と回していますね。これを、MODを使うことで実現できますので、よければ調べてみてくださいね。
0そうだね
プレイ済み
返信[18]
親投稿
745Lll<3 amakoprg
FOR I=0TO 2A=RND(10)I=I*(A==B)B=A?A;:NEXT 41文字です
4そうだね
プレイ済み
返信[19]
親投稿
BlackSoft BlackSoft.mkII3g
おちゃめさん なるほど、納得です。 アルゴリズムと実現手段は、1対1ではないですからね。構造的な置き換えについて考慮できていませんでした。表現の幅を狭めてはいけませんね。 MIKIさんも言われているように、規則を破棄することにします。 参加される皆様へ 下記の規則は、破棄することにします。 ================================== ・同一手法が既に出ている場合は文字数が少なくても受賞対象外(早い者勝ち) ==================================
1そうだね
プレイ済み
返信[20]
親投稿
だにえる haru2016nen
FORでも意外と出来ました
0そうだね
プレイ済み
返信[21]
親投稿
だにえる haru2016nen
あ、不具合があったので↑のはナシで。
1そうだね
プレイ済み
返信[22]
親投稿
だにえる haru2016nen
FORの性質忘れてました。 FOR L=0 TO 1の時、2回目のループ後、 NEXTまで終わり、L=L+1がされ、 1<LなのでBREAKする。 という感じの処理でしたね。 懐かしさを感じました。 ↑よりも短くできました!
1そうだね
プレイ済み
返信[23]
親投稿
だにえる haru2016nen
IF文を短縮しました。43文字+6回改行。 連投失礼しました。
3そうだね
プレイ済み
返信[24]
親投稿
おちゃめ ochame_nako
だにえるさんのプログラムから余分な改行を省略すれば私が速攻で作ったプログラムを超えて現時点でトップになりますね。 「早い者勝ちルール」が撤廃されてしまったので私がそれを公開したら私の1位になってしまう(自分で試行錯誤をしてたまたま同じになったのならば別ですが、他の人のを見たあとで思いついたもので1位になるのは不本意である)ためあえてそれは投稿しません。
0そうだね
プレイ済み
返信[25]
親投稿
BlackSoft BlackSoft.mkII3g
問題作成時、最初に浮かんだ方法です WHILE F-3R=RND(10)?R;:F=(F<<1OR P==R+1)AND 3P=R+1WEND (参考記録:53文字) 40文字台が出ている今では勝負になりませんが(笑)
2そうだね
プレイ済み
返信[26]
親投稿
だにえる haru2016nen
ACLSを消せば39文字+5回改行 になるんですけど、 ACLSって付けなくていいんですか?
0そうだね
プレイ済み
返信[27]
親投稿
oo meidoin21
文字列変数で作ってみました。 既にあったらすみません。
1そうだね
プレイ済み
返信[28]
親投稿
oo meidoin21
数値変数の場合も作ってみました。 同じようなのが既にあったらすみません。
1そうだね
プレイ済み
返信[29]
親投稿
BlackSoft BlackSoft.mkII3g
>だにえるさん 最初に画面クリアの必要はありませんよ。 お題の条件のみ満たせばOK! >ooさん 投稿ありがとうございます。 文字列では、しょぼーんさんが挑戦してくれましたが、やり方は異なります。 前回は文字列が威力を発揮しましたが、今回は数値を扱う方が短縮できるのかな?という感じですね。
1そうだね
プレイ済み
返信[30]
親投稿
りょう RYO_NAK
とりあえず参戦。 数値変数未使用で末尾改行込み60文字
1そうだね
プレイ済み
返信[31]
親投稿
BlackSoft BlackSoft.mkII3g
今回は、数値を扱う方が有利と見えますが、文字列での技法が敬遠されるのも勿体無い気がするので、表彰対象を以下のように変更することにします。 《表彰項目》 ・大賞(数値部門) ・大賞(文字列部門) ・最速投稿賞 → おちゃめさん 廃止 ・最多投稿賞 ※部分的な置き換えを含めた再投稿を可としたことにより
0そうだね
プレイ済み
返信[32]
親投稿
BlackSoft BlackSoft.mkII3g
《中間報告》 現時点でのノミネートは、以下のようになっております。 ■数値部門 41:745Lll<3さん 43:ooさん 44:おちゃめさん 44:だにえるさん 49:otta777さん 65:MIKIさん 53:BlackSoft(参考) ■文字列部門 60:りょうさん 72:しょぼーんさん 83:ooさん
0そうだね
プレイ済み
返信[33]
親投稿
BlackSoft BlackSoft.mkII3g
「数値部門」「文字列部門」について定義しておいた方が良いですね。 ちなみに、これまで投稿されているものは全て下記を満たしています。 数値部門  → 文字列変数未使用 文字列部門 → 数値変数未使用
0そうだね
プレイ済み
返信[34]
親投稿
BlackSoft BlackSoft.mkII3g
文字列部門に参戦 REPEAT R$=STR$(RND(10))?R$;:INC A$,R$UNTIL INSTR(A$,R$*3)+1 (参考記録:59文字) りょうさん投稿のコードについてですが、末尾改行は含めなくて良いため、59文字となります。
1そうだね
プレイ済み
返信[35]
親投稿
ねこはち neko80001
RANDOMIZE 0,31:FOR I=0TO 7:?RND(10);:NEXT 41文字です
0そうだね
プレイ済み
返信[36]
親投稿
ねこはち neko80001
RANDOMIZE 0,126?RND(10);RND(10);RND(10) 39文字です
1そうだね
プレイ済み
返信[37]
親投稿
L. Lohadaa
?RND;RND;RND 12文字です(乱入) ねこさんと同じくチートだけど、ルールに「複数回RUNしても違う数字列が出てこなければならない」なんて書いてないもん!
3そうだね
未プレイ
返信[38]
親投稿
ねこはち neko80001
お? 番外編的なつもりだったのですが、ok貰えましたか。 やったね! RANDOMIZE 0,31:FOR I=0TO 7?RND(10);:NEXT では、最初のやつのコロンを削って40文字って事でお願いします~('ω')b
0そうだね
プレイ済み
返信[39]
親投稿
BlackSoft BlackSoft.mkII3g
↑乱数生成についての盲点でした(笑) ですが、こちらもルールのこじつけという感じになってしまうかもしれませんが 「出力し続け」ていただきたいので、3回ぴったり想定で作られている上記の回答は今回は参考記録ということにさせてください。 ねこはちさんの最初の投稿については繰り返し処理が含まれているため、ルールに従っているものとします。
1そうだね
プレイ済み
返信[40]
親投稿
みむ*mim hidemimtp
ランダム - Wikipedia ランダム(Random)とは、でたらめ(乱雑)である事。何ら法則性(規則性)がない事、人為的、作為的でない事を指す。 なのでアウトかなぁ。
3そうだね
プレイ済み
返信[41]
親投稿
BlackSoft BlackSoft.mkII3g
seed値についてあまり理解していなかったので調べましたが、生成パターンが同じになるというわけではなく、値が固定されるんですね。 ※「66884888」で固定 認めた後で取り下げてしまい申し訳ないですが、みむ*mim さんの言われるように「ランダムな」と矛盾することになりますので、ねこはちさんの投稿も参考記録ということにさせていただきます。 自分で作っておいて、解釈を誤ってしまいました。
1そうだね
プレイ済み
返信[42]
親投稿
YUJI Yuji.inc
作ってみました。70文字!orz
2そうだね
プレイ済み
返信[43]
親投稿
745Lll<3 amakoprg
文字列部門にも参戦してみます REPEAT:A$=STR$(RND(10))B$=B$+A$UNTIL INSTR(B$,A$*3)+1?B$ 56文字です
1そうだね
プレイ済み
返信[44]
親投稿
745Lll<3 amakoprg
同一手法だった…
0そうだね
プレイ済み
返信[45]
親投稿
MIKI ifconfig
そもそもプチコンの rnd 関数は擬似乱数であり、みむさんの言うランダムな数列ではありません。 それはともかく、そろそろネタバレしていいと思うけど、この問題ってボゴソートのアルゴリズムそのものなのよね (仕様を満たすビット列が出るまで延々と乱数を生成するという意味で)。 こんなに多くの人々が黙々とボゴアルゴリズムを実行してたのかと思うと胸熱です。
5そうだね
プレイ済み
返信[46]
親投稿
BlackSoft BlackSoft.mkII3g
まあ、厳密な話は敷居が高くなるのでナシにしましょう(笑) 乱数+偶然=ボゴソート みたいな感じですね。この組み合わせが好きなので、次回もやるとすれば恐らくまたボゴソート系ですが、楽しんで頂ければと思います。 >745Lll<3 同一手法のルールは撤廃したので、文字列部門に投稿していただいたコードは有効です。 方法は無数にでるような問題ではないので、コードを圧縮していけば最終的には同一手法になってしまいますよね。
1そうだね
プレイ済み
返信[47]
親投稿
BlackSoft BlackSoft.mkII3g
>745Lll<3さん ※すみません、敬称付け忘れました
0そうだね
プレイ済み
返信[48]
親投稿
みむ*mim hidemimtp
機械がどんなに進化しても、このようなトピが立って考え競い合い、問題提起に異論が出て、裏ワザ的なコード出が出てきて、そもそも論が出てきて、っていう流れはパソコン通信の頃から同じなのね~(^^* いい。この時代にゲームハードプログラム言語を楽しみ、ネット上でこんな話題ができる環境に、発売元のスマイルブームさんに感謝。 ミーサーブへようこそ!
3そうだね
プレイ済み
返信[49]
親投稿
BlackSoft BlackSoft.mkII3g
ただ今を持ちまして締め切らせて頂きます。 沢山の投稿ありがとうございました! 結果発表等は、また明日以降に。 まだ暫くトピックは開放しておきますので、引き続き投稿をお待ちしております。
0そうだね
プレイ済み
返信[50]
親投稿
おちゃめ ochame_nako
プチコン3号のRND関数に限らず、コンピュータ上で作られる乱数はすべて擬似乱数です。 他の優れた擬似乱数と比べても単に偏りの大きさや周期の長さが異なる程度です。 したがって、「ランダムに出力する」というのを擬似乱数だから不可というのは事実上プログラミング不可能になってしまうためRND関数で問題無しと個人的には思います。 ただし、再現性があるか否かは出題時はきちんと言っておく必要があったかもしれないですね。(第1回のときはその点はきちんとしていたので「第2回もそれを継続としている」と考えるか「第2回は第1回とは異なる」と考えるかでねこはちさんの回答の判断は分かれるところでしょう。 次回の出題も乱数がテーマならばその辺を最初に書いておいた方が良いと思います。
4そうだね
プレイ済み
返信[51]
親投稿
BlackSoft BlackSoft.mkII3g
《結果発表》 ■数値部門 41:745Lll<3さん 43:ooさん 44:おちゃめさん 44:だにえるさん 49:otta777さん 65:MIKIさん 70:YUJIさん **:ゆうきさん ■文字列部門 56:745Lll<3さん 60:りょうさん 72:しょぼーんさん 83:ooさん
1そうだね
プレイ済み
返信[52]
親投稿
BlackSoft BlackSoft.mkII3g
ということで、数値部門・文字列部門双方で、大賞は 745Lll<3さん という結果になりました。 おめでとうございます! ・大賞(数値部門) → 745Lll<3さん ・大賞(文字列部門) → 745Lll<3さん ・最速投稿賞 → おちゃめさん また今回は、ルール設定の不手際があり、一部の方の投稿を却下することになってしまい申し訳なかったです。 乱数+条件設定 という組み合わせは、パズルというか、それだけでゲームの要素を含んでいるので結構楽しめますね。お題を考える側も楽しいです。 また開催すると思いますので、よろしくお願い致します(笑)
7そうだね
プレイ済み