Connect 4の勝者を決定する


19

部分的に塗りつぶされたConnect 4グリッド(7x6)が表示されます。

O X             
O X          
X O X O     O
X O X O   X X
O X X X O O X
O O O X X O X

(入力は1Dまたは2D配列として、また文字または数字などとして与えることができます。)

と仮定する

  • Xがゲームを開始しました。
  • 誰もまだ勝ちません。
  • プレイヤーは今までうまくプレイできなかったかもしれませんが、今後は両方とも最適な戦略を採用します。
  • 入力グリッドに問題はありません。

どのプレイヤーが勝つ(または引き分け)を示す単一の値を出力する必要があります

コードゴルフチャレンジ; 最短のコードが優先されます。プログラムは、妥当な時間で実際に出力を計算する必要はありませんが、有限の時間で出力が正しく取得されることを証明できるはずです。



@MartinBüttnerそれは、私がダウン投票されることを意味しますか、それともここに私の質問を残してもいいですか?
ghosts_in_the_code

4
質問が関連していることを意味し、それ以上でもそれ以下でもありません。リンクを投稿する目的は、チャレンジがお互いの「リンク」サイドバーに表示されるようにすることです。そのため、人々は関連するチャレンジをより簡単に見つけることができます。もしあなたの質問が重複していると思ったら、私はそう言ったでしょう(または単に閉じました)ので、心配しないでください。:)
マーティンエンダー

2
「最適なプレイ」は明確に定義されていますか?その場合、最適なプレイのためのアルゴリズムを説明するリンクを提供できますか?
レインボルト

2
@Rainbolt 解決されており、完璧なアルゴリズムも存在します。詳細については、ウィキペディアをご覧ください。
ghosts_in_the_code

回答:


16

Perl、119 118 117バイト

+4を含む -0p

STDINにスペースが埋め込まれた回転ボードを提供します(重力が石を右に引っ張ります)

connect4.pl
  OXXX
   XOO
    OX
  OOXX
  XXXO
XXOOXO
OOXXOO
^D

connect4.pl

#!/usr/bin/perl -p0
y/XO/OX/if$^S|y/X//>y/O//;$_=$$_||=/Z@{[map"|O".".{$_}O"x3,0,5..7]}/sx||s% (?! )%$_="$`X$'";do$0%eg?/1/?3:1+/2/:2

3移動するプレイヤーが勝った1場合、移動するプレイヤーが負けた場合2、引き分けの場合に印刷します。

古いperlでは、リテラル^Sを使用して1バイトを取得できます。極端な非効率性を気にしない場合は、$$_||=(転置テーブル)を省き、さらに6バイトを増やすことができます。除外する$_=と、結果の代わりにどこでプレイするかが表示されます(ある1場合はプレイして勝ち、ある場合はプレイし2て描き、ある場合はプレイし3て負けます)

完全なミニマックスツリーを構築および評価します。ボードがすでに十分に満たされていなければ、メモリと時間を使い果たします。


2
一体なぜ誰かが投票したのですか?ゴルフは本当に素晴らしいです(Perlと、このような解を求めると、私のゴルフは、めちゃめちゃ難しい-私は確かに私が知っている他のPerlのゴルファーは、そのコードが出ている可能性はありませんよ)。また、コードには必要な動作があります。
ダダ

これは私の脳を傷つけます。+1!
levelonehuman

@Dadaこの答えがダウン票されたことをどのように知っていますか?投票として3が表示されます...
...-RosLuP

@RosLuPが最初にこの投稿を見たとき、それは1つのダウン票を持っていました。また、十分な担当者がいる場合は、投稿の上下投票数を確認できます。その場合、現在は上下4票です。
ダダ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.