确定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

(输入可以一维或二维数组以及字母或数字等形式给出。)

假使,假设

  • X开始游戏。
  • 还没有人赢。
  • 玩家可能直到现在还没有打得很好,但是从现在开始,他们都将采用最佳策略。
  • 输入网格没有故障。

您必须输出一个值来指示哪个玩家获胜(或平局)

挑战高尔夫挑战赛;所以最短的代码胜出。您的程序不必在合理的时间内实际计算输出,但是您应该能够证明在有限的时间内可以正确获得输出。



@MartinBüttner这是否意味着我会被否决,还是可以将我的问题留在这里吗?
ghosts_in_the_code 2015年

4
这仅表示问题相关,仅此而已。发布链接的目的是使挑战出现在彼此的“链接”侧栏中,以便人们可以更轻松地找到相关的挑战。如果我认为您的问题是重复的,我会这么说(或只是将其结束),所以请不要担心。:)
马丁·恩德

2
是否定义了“最佳游戏”?如果是这样,您能否提供描述最佳播放算法的链接?
Rainbolt 2015年

2
@Rainbolt已经解决,也有完善的算法。阅读Wikipedia了解更多。
ghosts_in_the_code 2015年

Answers:


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获取一个字节。如果您不介意极端低效率,则可以省去$$_||=(换位表)并获得6个字节。如果您忽略了,$_=它将显示您在哪里玩而不是结果(1如果有,继续比赛并赢得比赛;如果有,继续比赛2并抽奖;如果有任何比赛3,则输掉)

建立并评估完整的minimax树。除非板子已经足够好,否则您将耗尽内存和时间。


2
为什么有人在投票?该高尔夫确实是惊人的(我的高尔夫用Perl和获得这种解决方案的极端艰难-我不知道任何其他perl的高尔夫球手,我知道能想出的代码)。并且代码具有所需的行为。
达达

这使我的大脑受伤。+1!
levelonehuman

@Dada你怎么知道这个答案被否决了?我认为3票...
RosLuP '16

@RosLuP当我第一次看到这篇文章时,它有1张反对票。另外,当您有足够的代表时,您可以看到帖子有多少上下投票:在这种情况下,现在它有4上下1票。
达达
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.