トピック
BlackSoft BlackSoft.mkII3g

コード・ゴルフ on the プチコン

最近のトピックは、初心者の勉強中の方々に有識者が回答する、というものが多い気がします。 なので、たまには中~上級者向けのお遊びトピックがあってもいいかなと思いました(笑) 以下は私が考えた問題です。 回答頂いてもいいし、新たにお題を投げて頂いても構いません。コーディングのネタで盛り上がれたらと思います。 《問題》 0~9までの10個の数字を各1度だけ使用し、ランダムな10桁の数列を作れ。ただし、複数回コードを実行した場合、前回の数列とは関連性を持たないものとする。
10そうだね
プレイ済み
返信[1]
親投稿
BlackSoft BlackSoft.mkII3g
自分の回答です。 A=1023REPEAT B=RND(10)IF A AND 1<<B THEN ?B;:A=A XOR 1<<B ENDIF UNTIL!A
0そうだね
プレイ済み
返信[2]
親投稿
すぎ field2050
さがのさんの投稿を見て、文字列の一文字消せるかな?と作ってみました。これは使い道がありそう。
3そうだね
プレイ済み
返信[3]
親投稿
あきと SideBurnsM
ゴルフって事は文字数申請も必要? トピ主さんのコードが72文字。 貼り付けたコードはREPEAT→WHILE、改行でENDIFを消して63文字です。
1そうだね
プレイ済み
返信[4]
親投稿
MIKI ifconfig
var s[10]for j=0to 9repeat i=rnd(10)until!s[i]s[i]=1?i;:next
1そうだね
プレイ済み
返信[5]
親投稿
とりあえずこんな感じ? ちょっと微妙だけど…。 珍しく:(コロン)の省略してみた。
1そうだね
プレイ済み
返信[6]
親投稿
A=RND(10) @A B=RND(10) IF A==B THEN GOTO@A ?A;B 空白、改行ありの文字数46です。 「参加することに意義がある」ということで、初心者ながらプチコンゴルフ初参加です。 やっぱり、省略できる命令が少なすぎてIF文やGOTOに走ってしまう私...orz
1そうだね
プレイ済み
返信[7]
親投稿
あ、しまった。同じ命令2つ使ったらダメでしたっけ、すみません。
0そうだね
プレイ済み
返信[8]
親投稿
BlackSoft BlackSoft.mkII3g
皆さま、ご参加ありがとうございます! 本日はリリース日(業務の方で)でしたが、そんな日に限って何かやりたくなるものです、よね?(笑) 本トピックの主旨はゴルフとは言え、本音は 「様々な方法を見てみたい」なので、気楽に様々な方法で書いて頂ければと思います。 これから皆様の書いてくれたコードを吟味したいと思います♪
1そうだね
プレイ済み
返信[9]
親投稿
スー thanks_0u0
楽しそうなのでなんとなく別アプローチをー(・ω・) ゴルフ的にはあんまりですけれどー。
1そうだね
プレイ済み
返信[10]
親投稿
BlackSoft BlackSoft.mkII3g
フラグ派と並べ替え(作り替え)派で分かれましたね。 instrやshiftは使った事が無いので、今更ながら勉強になってます。武器は多い方が良いですね。 フラグ管理は効率が良いものだと思っていましたが、数列を作るためのループ回数の期待値(処理負荷)を考えると並べ替えに軍配。ゴルフ的にはフラグに軍配、という感じでしょうか。 >ドラくんs ご参加ありがとうございます!初心者であろうと関係ありませんよ♪ さてコードですが、これだと2桁しか表示されませんね…?期待は 「8605792134」 のような10桁の数字の並びです。何度でも挑戦してみてくださいね。
1そうだね
プレイ済み
返信[11]
親投稿
あ( ̄▽ ̄;)、10桁の並びでしたね失礼しました。
1そうだね
プレイ済み
返信[12]
親投稿
MIKI ifconfig
フラグでも並べ替えでもないアルゴリズムです。 残念ながらプチコンではメモリの都合で4桁までしか対応していません。
2そうだね
プレイ済み
返信[13]
親投稿
MIKI ifconfig
同じく、フラグでも並べ替えでもないアルゴリズム。 一番好きなソートアルゴリズムであるところのボゴソートにヒントを得ています。
2そうだね
プレイ済み
返信[14]
親投稿
他の人のやり方と被らないようにしようとしたらこうなった。
2そうだね
プレイ済み
返信[15]
親投稿
MIKI ifconfig
一つ目のプログラムは 「条件を満たす10桁の数を全数列挙し、その中からランダムで一つ選ぶ」 という、時間とメモリをどぶに捨てるが如く無駄遣いするアルゴリズムです。 二つ目は 「とりあえず 10 桁の乱数を発生させてみて、条件に合致するまで繰り返す」 というものです。ボゴソート由来です。ボゴソートは(時間がかかる事を除いては)本当に有用なアルゴリズムです。 例えば、どんな仕様のプログラムでも作ることができるし(もちろんハード的に可能なもの)、どんな画像でも作ることができるし、どんな曲だって作れます。
1そうだね
プレイ済み
返信[16]
親投稿
よく考えたら先程挙げたプログラム 1987654320 こういうのが出来ないですね……
1そうだね
プレイ済み
返信[17]
親投稿
MIKI ifconfig
一つ目のを改良して7桁まで対応しました。かなり時間がかかります。
2そうだね
プレイ済み
返信[18]
親投稿
BlackSoft BlackSoft.mkII3g
ソースコードを眺めたり実験したりと、こんな時間になってしまいました。中毒性有りますね。 MIKIさんが提示してくれたようなボゴソートから、将棋や囲碁のアルゴリズムが出来ているんだろうなと、ふと思いました。
0そうだね
プレイ済み
返信[19]
親投稿
BlackSoft BlackSoft.mkII3g
意外と盲点だった、「並べ方」に忠実な再現。 FOR J=0TO 9R=RND(J+1)A$=LEFT$(A$,R)+STR$(J)+RIGHT$(A$,J-R)NEXT?A$
0そうだね
プレイ済み
返信[20]
親投稿
おちゃめ ochame_nako
A$="0123456789"@L SWAP A$[0],A$[RND(10)]?A$GOTO@L このプログラムは停止ボタンを押すことで表示ができます。ちょっとインチキだけどルールからは外れてないと思います。 手動停止必須ではなく普通に作るならば A$=" "FOR I=0TO 9B=RND(I+1)A$[B]=STR$(I)+A$[B]NEXT?A$ となりましたが、でんぺんさんが投稿したもの( RND(I+1)番目に数字Iを挿入する方法 )と変数名以外は同じになったので上記の方を投稿とします。 コードゴルフ大会は私も以前2回ほど開催しましたが同じものを作るにも人によって異なるコードが見れて大変楽しかったですね。
2そうだね
プレイ済み
返信[21]
親投稿
スー thanks_0u0
またゴルフ度外視の別パターンを!たまにはこういうのも楽しいですね( ´ u ` )
1そうだね
プレイ済み
返信[22]
親投稿
じゅん RSJunK
思いつく短いコードは既に皆さん書かれてますので...スーさん同様、ゴルフ度外視で作ってみました。SORTコマンドを使う方法です。 ではでは。
1そうだね
プレイ済み
返信[23]
親投稿
おちゃめ ochame_nako
この大会の締め切りはいつなのか分からないので閉じられる前に個人的な意見(感想)を書いておきます。 ランダムで重複のない10桁の数字を表示するための方法はBlackSoftさんも書かれているように大きく分けて下記の2つの方法しかありません。 (1) ランダムに発生させ重複チェックを行う (2) 順番に並んだ数字をランダムに並べ替える ただし、言葉で書いたらこれだけでも実際のコードの書き方は無数にあるからプログラミングは楽しいです。 これが「正解」と決めつけずに自由な発想で作ってください。 というか、そういうプログラム(こんなやり方があったのか!というプログラム)を私自身が見てみたいです。 ちなみに以前私が開催したコードゴルフはこんな感じでした。 https://miiverse.nintendo.net/posts/AYMHAAACAAADVHkDQgi7rw
0そうだね
プレイ済み
返信[24]
親投稿
BlackSoft BlackSoft.mkII3g
そう言えば締め切りを設定していませんでしたね。 このようなトピック立ては初の試みだったので、どれだけの方が参加してくれるか分からず、細かいルールも考えていませんでした。 まだ何か方法がないだろうかと暇なときにぼんやり考えていますが、大きく分けて2通りなんですね。MIKIさんの全網羅も入れると3通りかな。 「こんなやり方があったのか!というプログラム」を見てみたいというのはおちゃめさんと同じです。自分が最初に投稿したもの以外は、全て斬新に見えました♪ なので、もう暫く開放しておきます。 ゴルフ度外視で全くOKですので、何か思い付いた方は気楽に投稿していただければと思います。
0そうだね
プレイ済み
返信[25]
親投稿
745Lll<3 amakoprg
他の人と同じになってしまった...
1そうだね
プレイ済み
返信[26]
親投稿
Pn-D dai-yuu
被ってるかな?(超簡略可した例)
0そうだね
プレイ済み
返信[27]
親投稿
BlackSoft BlackSoft.mkII3g
>ダイキさん 投稿ありがとうございます。 せっかく考えて頂きましたが、このコードでは条件(同じ数字を出さない)を満たせないです。 ※正確には、約0.36%の確率で条件を満たせる 気が向いたら、またチャレンジしてみてくださいね!
1そうだね
プレイ済み
返信[28]
親投稿
BlackSoft BlackSoft.mkII3g
こういち さん ご参加ありがとうございます! ゴルフは、合計打数の少ない人が勝ちです)ね。コードゴルフも同じで、「コードの合計文字数が最も少ない人を勝ち」とするプログラミングの競技です。 今回は、ゴルフ度外視で様々な方法を披露してくれた方が多かったので、面白かったですよ♪ さて、こういちさんの投稿してくれたコードですが、やはり条件を満たせていないようですね。 A[]をフラグとして使用する意図があると思われるので ?B の直後に A[B]=1 とすれば条件を満たします。
0そうだね
プレイ済み
返信[29]
親投稿
だにえる haru2016nen
一応作ってみました。 文字コード化してみたっていう それだけになっちゃいました。 1つの案として、 次のお題は 「同じ命令、関数を使わずに~」 がいいと思います。
1そうだね
プレイ済み
返信[30]
親投稿
BlackSoft BlackSoft.mkII3g
沢山の投稿、ありがとうございました。 とても楽しめました。 また良いネタを思い付いたら開催しようと思いますので、お付き合いください(笑) >だにえるさん 提案ありがとうございます。次期開催時の参考にさせていただきます。
3そうだね
プレイ済み