C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[24]: 趣味の質問たかが3目並べされど三目並べ [1]


(過去ログ 102 を表示中)

[トピック内 36 記事 (21 - 36 表示)]  << 0 | 1 >>

■60768 / inTopicNo.21)  Re[12]: 趣味の質問たかが3目並べされど三目並べ
  
□投稿者/ ピーター (24回)-(2011/07/17(Sun) 16:27:34)
No60767 (flied onion さん) に返信

> すべて埋まった場合の「あるマス」はひとまず中央としましたが、

まさに、中央のマスのことです。
実は、ドローの例として

> oox
> xoo
> oxx

を例示頂きましたが、じつは○を先手とすると、このパターンは実現できないのです。
というのは、シミュレーションしてみると分かるのですが、○先手の場合、○が中央に置かれると、必ず○が勝ってしまうからです。
(ただし、前提として、自分の番で勝利が確定している場合、かならず勝利するマスにコマを置かなければならないことと、
相手がリーチとなった場合、必ずリーチを阻止するマスにコマを置かなければならないことを考慮する必要があります。
この条件は問題掲載サイトに掲載していないので、本来ならばこの条件が有効かどうかを出題者に質問すべきなのですが、
割愛します。ただし、実際問題としては客に仕様を確認せずに開発することはないでしょうけれど。)

また、コード化頂き、ありがとうございました。

> 「ありえない局面がきたらどうするのか」という意味の発言かと思ったからです。
> ガード条件や不整合チェックをしていないので私には「ありえない局面が来ない」仕様は考慮しているようにみえましたので。
>
> ただ全体を読めばそういう意図ではないことはわかりますので私の勘違いですね。

上記理解しました。こちらこそ大変失礼しました。
引用返信 編集キー/
■60769 / inTopicNo.22)  Re[13]: 趣味の質問たかが3目並べされど三目並べ
□投稿者/ 魔界の仮面弁士 (2259回)-(2011/07/17(Sun) 17:18:50)
No60768 (ピーター さん) に返信
> シミュレーションしてみると分かるのですが、○先手の場合、○が中央に置かれると、必ず○が勝ってしまうからです。
http://ja.wikipedia.org/wiki/%E4%B8%89%E7%9B%AE%E4%B8%A6%E3%81%B9
上記には、『9ヶ所のどこに打っても、相手も最善を尽くしてきた場合には引き分けになってしまう。』と
ありますが、実際にはそうではないという事なのですね?


>>oox
>>xoo
>>oxx
> を例示頂きましたが、じつは○を先手とすると、このパターンは実現できないのです。

下記のパターンで実現される気がしますが、これでは駄目なのでしょうか。


0初 1○ 2× 3○ 4× 5○ 6× 7○ 8× 9○
sss sss ssx osx osx osx osx oox oox oox
sss sos sos sos sos soo xoo xoo xoo xoo
sss sss sss sss ssx ssx ssx ssx sxx oxx

引用返信 編集キー/
■60770 / inTopicNo.23)  Re[14]: 趣味の質問たかが3目並べされど三目並べ
□投稿者/ ピーター (25回)-(2011/07/17(Sun) 17:37:03)
No60769 (魔界の仮面弁士 さん) に返信
> ■No60768 (ピーター さん) に返信
> 下記のパターンで実現される気がしますが、これでは駄目なのでしょうか。
>
>
> 0初 1○ 2× 3○ 4× 5○ 6× 7○ 8× 9○
> sss sss ssx osx osx osx osx oox oox oox
> sss sos sos sos sos soo xoo xoo xoo xoo
> sss sss sss sss ssx ssx ssx ssx sxx oxx

うわぁ〜、5手目の○をそんなところに打ってくるか〜何ちゅうヘボ打ち、とは言ってられませんね。
これは想定外でした。申し訳ない。
もう少し考える必要がありそうです。
引用返信 編集キー/
■60771 / inTopicNo.24)  Re[15]: 趣味の質問たかが3目並べされど三目並べ
□投稿者/ 魔界の仮面弁士 (2260回)-(2011/07/17(Sun) 17:51:50)
No60770 (ピーター さん) に返信
>>0初 1○ 2× 3○ 4× 5○ 6× 7○ 8× 9○
>>sss sss ssx osx osx osx osx oox oox oox
>>sss sos sos sos sos soo xoo xoo xoo xoo
>>sss sss sss sss ssx ssx ssx ssx sxx oxx
> うわぁ〜、5手目の○をそんなところに打ってくるか〜何ちゅうヘボ打ち、とは言ってられませんね。

5手目が別の場所に打たれていたら、6手目で×の勝利となる気が。

引用返信 編集キー/
■60772 / inTopicNo.25)  Re[10]: 趣味の質問たかが3目並べされど三目並べ
□投稿者/ 堀江伸一 (35回)-(2011/07/17(Sun) 19:07:21)
> (そもそも、これは解答の必ずある問題なので、問題文にある条件は必ず解答に結びつくはずである。)
> まぁ、システム設計をしたことのないものには理解できないのだろうが、「ありえない局面」という仕様を見逃すとは
> 設計者にとっては初歩的なミスであり、重篤な結果を招く恐れがあるということは、重々理解できるはずである。
>
> さて、小生のアルゴリズムでは、縦・横・斜めのビンゴチェックが不要のため、
>
>>int s[]={0,1,2,0,3,6,0,2},d[]={3,3,3,1,1,1,4,2};
>
> のマトリックスは不要になる。これで記載コードが減ったのではないか?
> あとは空マスを数えて単純な比較で処理は終わる。
> 以上だ。
コメント読みました、質問してよかったです。
三目並べのような簡単な問題からこんなに意義ある話になるなんて思いませんでした。
コードを短くするという瑣末なことより大事な話を読めたのはうれしいかぎりです。
こんな簡単な問題ですら注意力があれば考えることが多いのだから、もっと難しい話になるとプログラムの世界は思考力ある人から見れば極めて奥深いのだろうなと想像します。

一応ピーターさんの方法でコードを短くできるか試して見ます。
引用返信 編集キー/
■60773 / inTopicNo.26)  Re[16]: 趣味の質問たかが3目並べされど三目並べ
□投稿者/ なちゃ (498回)-(2011/07/17(Sun) 22:10:41)
問題の趣旨として、いかにアルゴリズムを見つけられるか、どんなふうに発想ができるかということが重点であり、
問題を解く側もそこが肝であることに意義をとなえるつもりは全くありませんが、
>そもそも、これは解答の必ずある問題なので、問題文にある条件は必ず解答に結びつくはずである。
そんな決まりはどこにもないしひっかけの条件がある問題だっていくらでもありますよ。
この問題が求めているのは最も短いコードであって、アルゴリズムで条件をすべて使うことではありません。
現在できているアルゴリズムでどこまで短くできるか確認しておくことも必要ですし、そんな頭から否定されるいわれはないと思いますよ。

引用返信 編集キー/
■60779 / inTopicNo.27)  Re[17]: 趣味の質問たかが3目並べされど三目並べ
□投稿者/ 堀江伸一 (36回)-(2011/07/18(Mon) 15:47:37)
基本的な点を確認してまとめてみましょう。
oox
xxo
oox
のような結果になった時、この盤面に至る全ての手順は、勝敗が決しないという点に置いて、どんな順番でoxを書き入れてもこの盤面に至ることが可能です。
ooo
xxo
xox
の場合最後に上端一行のどれか一つに最後にoが入力されるという条件をつければ、この盤面に至る全ての手順は可能となります。
検証この考え方で行くべきです。


盤面のチェック方法ですが今の所2つありますね。

1 恣意的なルールである縦横斜めというルールをコードに情報として渡す。
この場合 shuさんflied onionさんご提示のようにルールという情報を圧縮するか、ロジック全体が動いた時結果として同じチェックを行われるように修正するのが手のようです。

2 ピーターさんご提示のようにルールを別の条件にいいかえて、コードをより短くする。

全部のマスが埋まってない場合、o,xの数を数えれば確かに勝敗は判定できます。(試合途中の盤面が入力されるのかという疑問がでますがこれはないと仮定します。o,xがそろうか、最後まで行って引き分けているかのみを考えます)
全部のマスが埋まっている場合は確かに難しそうです。
ご提示のように真ん中がoだとしても
oox
xoo
oxx
のような場合もあります。
2を実装するのもきちんとルール化するのも、それが短くできるか検証するのも難しそうですね。
ありえる全ドローや全勝利パタンを全探索して共通項目を見つけ出すような地味な作業が必要になるかもしれませんね。

やじゅさんありがとうございます。
ショートコーディング本まだ読んだことがないので書店で探してみます。

逆運の覇者さんflied onionさん細かいコード短縮と修正ありがとうございます。

魔界の仮面弁士さん、多分問題は究極のへぼうちも想定されると思います。
なちゃさんεπιστημηさん発想的にコンパクトになれば私としてはうれしいです。


縦横斜めという恣意的なルールを言いかえる方法はないのかもしれません。
それともピーターさんご提示のように問題の条件を使うことで短いルールになるのかもしれません。


こんな多くの返答が頂けるとは思いませんでした。
かゆい所に手が届かないギリギリの所にある問題ですね。
引用返信 編集キー/
■60780 / inTopicNo.28)  Re[18]: 趣味の質問たかが3目並べされど三目並べ
□投稿者/ ミキオ (5回)-(2011/07/19(Tue) 00:43:09)
卒論があるよ。

http://kako.ics.nara-wu.ac.jp/~kako/student/2003/Atsuko.pdf

ここにフロチャートが表示されてる。

フロチャートはアルゴリズムそのものだ、これは、すべてのコンピューター言語で活用できるもの。
ここで、この人のやりかたを見れば、五目ならべゲームが簡単に制作できますよ。

ボクは中2だけど、2時間で制作できマ〜ス。アハハ。

フロチャートが書けるように勉強しまちょ。

引用返信 編集キー/
■60781 / inTopicNo.29)  Re[19]: 趣味の質問たかが3目並べされど三目並べ
□投稿者/ ミキオ (6回)-(2011/07/19(Tue) 00:59:11)
No60780 (ミキオ さん) に返信
> 卒論があるよ。
>
> http://kako.ics.nara-wu.ac.jp/~kako/student/2003/Atsuko.pdf
>
> ここにフロチャートが表示されてる。

まぁ、ちょっと、大雑把すぎるフロチャートだねぇ。
ありの巣のようなフロチャートだと良い点数を上げれるんだが、
まぁ28点くらいだな。

この人が、きちんと作動するバグの無いゲームを制作したかどうかは、まぁわからねぇ。
1手先しか思考しないらしい(笑)


まぁ、とりあえず、ガンバ♪
引用返信 編集キー/
■60792 / inTopicNo.30)  Re[19]: 趣味の質問たかが3目並べされど三目並べ
□投稿者/ 堀江伸一 (37回)-(2011/07/19(Tue) 13:05:34)
No60780 (ミキオ さん) に返信
> 卒論があるよ。
>
> http://kako.ics.nara-wu.ac.jp/~kako/student/2003/Atsuko.pdf
>
> ここにフロチャートが表示されてる。
>
> フロチャートはアルゴリズムそのものだ、これは、すべてのコンピューター言語で活用できるもの。
> ここで、この人のやりかたを見れば、五目ならべゲームが簡単に制作できますよ。
>
> ボクは中2だけど、2時間で制作できマ〜ス。アハハ。
>
> フロチャートが書けるように勉強しまちょ。
>
あーはいはい。
みきおさんは勝手に頑張ればいいんじゃない?
中2でそこまでプログラムができるなんて君の未来は明るいねえ。
お兄さんうらやましいよ。

せっかく紹介していただいたんだし参考にさせてもらいます。
この手のアプリは画面作りの設定がけっこう手間なんだよな。


少しだけコードを短くしました。
小手先のテクだけです。

#include<stdio.h>
main(i,t,b){char *s="3331114201203602",k,m[9];for(;gets(m);){k='d';for(i=0;i<8;i++){b=s[i+8]-48;t=m[b]|m[b+s[i]-48]|m[b+2*s[i]-96];k=(t&18)<17?t:k;}printf("%c\n",k);}}

文字コードを2進数でとらえて判別式を組んでみました。
調べてる3マスが同じ文字なら18でマスクを取ると、oだけなら2、xだけなら16、osxの混合になると18になるという性質を利用しています。

BCCではコンパイルが通るのですがGCCではコンパイルエラーが出ました。
code.cpp:2:エラー:'('トークンの前に予想されるコンストラクタ、デストラクタ、または型変換

後コードがきちんと動いてるかテストしてません。
引用返信 編集キー/
■60807 / inTopicNo.31)  Re[20]: 趣味の質問たかが3目並べされど三目並べ
□投稿者/ ミキオ (7回)-(2011/07/19(Tue) 22:00:30)
No60792 (堀江伸一 さん) に返信

> この手のアプリは画面作りの設定がけっこう手間なんだよな。

違いますね(笑)

この手のアプリは思考ルーチンが「要」なんです。
この人物の卒論の評価は28点と書いたろ?

28点ですよ。

以上です先輩!

フロチャートが書けないと作れないアプリですよ。


引用返信 編集キー/
■60817 / inTopicNo.32)  Re[20]: 趣味の質問たかが3目並べされど三目並べ
□投稿者/ shu (868回)-(2011/07/20(Wed) 07:58:28)
No60792 (堀江伸一 さん) に返信

> #include<stdio.h>
> main(i,t,b){char *s="3331114201203602",k,m[9];for(;gets(m);){k='d';for(i=0;i<8;i++){b=s[i+8]-48;t=m[b]|m[b+s[i]-48]|m[b+2*s[i]-96];k=(t&18)<17?t:k;}printf("%c\n",k);}}

b=s[i+8]-48;t=m[b]|

この部分は

t=m[b=s[i+8]-48]|

こう書けると思うんですが、コンパイル通りませんでしたか?

さらにもう1つ変数cを用意してi++を最終のiに置き換えると

main(i,t,b,c){char *s="3331114201203602",k,m[9];for(;gets(m);){k='d';for(i=0;i<8;){t=m[b=s[i+8]-48]|m[c=b+s[i++]-48]|m[2*c-b];k=(t&18)<17?t:k;}printf("%c\n",k);}}

こんなんはどうでしょう?コンパイルも実行もしてません。
引用返信 編集キー/
■60830 / inTopicNo.33)  Re[21]: 趣味の質問たかが3目並べされど三目並べ
□投稿者/ 堀江伸一 (38回)-(2011/07/20(Wed) 15:16:11)
残念なことにbccではbを[]の外におかないとエラーになりました。

main(i,t,b,c){char *s="3331114201203602",k,m[9];for(;gets(m);){k='d';for(i=0;i<8;){t=m[b=s[i+8]%8]|m[c=b+s[i++]%8]|m[2*c-b];k=(t&18)<17?t:k;}printf("%c\n",k);}}
テストはしてませんが-48を%8にかえて2文字削れました。
ピーターさんのおっしゃるようにより賢いチェック手順をルール化しない限り、素朴なチェックをもとにしてはこの辺が限界ですかね。

getsがscanfみたいに
int m[4];
scanf("%s",m);
できちんと動けば、一文字削れたのだけど。
getsにintいれると動かないですね。

私としてはこれくらい短くなれば満足です。
短くなる方法の掲載があれば覗きますがこのへんで満足しました。
こんなに多くの返答ありがとうございました。

ミキオさんへ
>この手のアプリは思考ルーチンが「要」なんです。
大体目を通して今考えてる所です。
私の場合画面の見栄えをちょっと良くするのに結構コードが増えるほうで、画面作りが苦手なんでつい。
頑張ってみます。
みきおさんその年で人の評価もできるなんてすごい。
どんな分野に行っても将来有望ですね。
引用返信 編集キー/
■60835 / inTopicNo.34)  Re[22]: 趣味の質問たかが3目並べされど三目並べ
□投稿者/ ミキオ (8回)-(2011/07/20(Wed) 18:09:59)
No60830 (堀江伸一 さん) に返信

ぼくは、わりとマジメにコメントしてますけど。
ただ、中2のくせに態度がデカイのは確かです。(反省)^ペコリ^♪

ただ、灯台の問題は
2+2=?
であり、答えが1つしかない。これは面白くない。(ボクわ)

5目並べゲームをつくりなさい。とか、ポーカーゲームを作りなさい。とゆう問題なら、
?+?=ポーカーゲームとかに答えがなる。

ユーザーの数だけ答えがあるのだ。欧米か?

バグがあれば0点。稚拙なコードでも、動けば100点。
前に書いたと思うよぉ。

あとさぁ、コードとか短くするのはやめたら?
プロパティーも連結してる人がいるけど。非常に見にくい。
長いプロジェクトだと、バグの発見とかで苦労しますよ。




引用返信 編集キー/
■60843 / inTopicNo.35)  Re[23]: 趣味の質問たかが3目並べされど三目並べ
□投稿者/ 堀江伸一 (39回)-(2011/07/20(Wed) 21:50:07)
コードを短くするのは趣味の問題ですから。
実用ソフトを書くのだったら、万人が読んで理解できる平易なコードを目指しますよ♪


ハッカーがコードを書くと、短くて無駄がなくてバグがなくてエラーデータに強いコードを、ミスなく短時間で上げてくると聞いたことあります。
ビット演算の加算機としての用法とか、知らない人には意味不明な難解な処理でも、分かる人にはスッキリした奇麗なコードに見えるらしいですね。

今でも処理速度と信頼性が要求される基盤的ソフトを作る人はビット演算やコンパイル済みコードのステップ数レベルで物を考えて、一般人には意味不明な処理を書くそうです。

プロパティ連結は一つの技法として確立されてるのでそれはそれで便利に使ってる人もいるみたいです。
少し違いますがメソッドa.p(c)というメソッドがaを返したりするルールがあるととてもコードが便利に記述できるので普及してたりします。


>ただ、灯台の問題は
>2+2=?
>であり、答えが1つしかない。これは面白くない。(ボクわ)
>5目並べゲームをつくりなさい。とか、ポーカーゲームを作りなさい。とゆう問題なら、
>?+?=ポーカーゲームとかに答えがなる。
私はその学歴も頭も悪く地道に勉強するしかない人間なので、階段をあがるように勉強してるところです。
自分としてはまだまだ勉強が足らないなあという感じです。
実力からいえばミキオさんは私よりずっと上にいるのでしょうね。
うらやましい限りです。
引用返信 編集キー/
■60905 / inTopicNo.36)  Re[24]: 趣味の質問たかが3目並べされど三目並べ
□投稿者/ ミキオ (9回)-(2011/07/23(Sat) 20:09:16)
No60843 (堀江伸一 さん) に返信

なにげに、自慢してるような質問だから、気に入らなかっただけです。

ハッカーのコード?
らしい、とか聞いたことがある。とか、空想の話はアレな感じですけど。

イカタコのウイルス制作者は、実刑判決がでましたよ。懲役2年6カ月です。
でもさぁ、コイツがシャバにでたら、IT犯罪者の道しか、生きるすべがないんだろうね。

こうゆう、ハミダシプログラマーが日本に何人いるんでしょうかねぇ。

まぁ、クレジットカードとかはインターネットで使用しないほうが安心だね。
盗まれてからでは、「後の祭り」
引用返信 編集キー/

<前の20件
トピック内ページ移動 / << 0 | 1 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -