连接四个验证器


20

介绍

Connect Four是一款您尝试连续获得四个的游戏:水平,垂直或对角线。在此代码高尔夫球中,我们将尝试确定给定游戏板的人。永远只有一名获胜者,而只有一名获胜者。


任务

给定一个四连板,确定谁是赢家:XY。永远只有一名获胜者,而只有一名获胜者。面板尺寸将始终为6 x 7,就像游戏板上的图片一样。

给定一个板,以下板在这种情况下X为红色和Y蓝色:

在此处输入图片说明

您的输入将是:

OOOOOOO
OOOOOOO
OOOOOOO
OOOOXOO
OOOXXOO
OOXYYYY

您可以按换行符(如上)分隔游戏的行,不使用分隔符,可以将行划分为数组或列表,也可以输入字符矩阵。

此示例的正确输出:

Y

Y连续四个;因此,Y是赢家。因此,我们输出Y。


测试用例

输入:

OOOOOOO
OOOOOOO
OOOOOOO
OOOOOOO
OOYYOOO
OYXXXXO

输出:

X

输入:

OOOOOOO
OOOOOOO
OOOOOOO
XXXXOOO
YXYYOOO
YXYYXYX

输出:

X

输入:

YXYYXOO
XYXXYOO
XXXYYOO
YYYXXOO
XXYYYYO
XXYYXXO

输出:

Y

输入:

OOOOOOO
OOOOOOO
OYOOOOO
OOYOOOO
OOOYOOO
OOOOYOO

输出:

Y

输入:

OOOOOOO
OOOOOOO
OYOOOOX
OOYOOOX
OOOXOOX
OXOXYOX

输出:

X

计分

最少的字节数获胜!



2
我们是否可以假设获胜者的总令牌数将比输者多一枚?
数学迷

1
@mathjunkie我错了,你不能这么认为。
尼尔

3
@nfnneil输出必须为X或Y,还是可以选择其他两个一致的输出来表示获胜者?
Martin Ender

1
我们可以选择使用其他字符作为输入吗?还是输入数字矩阵?
路易斯·门多

Answers:


2

果冻,19字节

UŒD;ŒD;Z;ṡ€4;/ṢEÞṪṪ

在线尝试!

这个答案的核心是从我的答案复制到这个非常相似的问题

说明

UŒD;ŒD;Z;ṡ€4;/ṢEÞṪṪ
   ;  ; ;             Append {the input} and the following three values:
UŒD                     the antidiagonals of {the input};
    ŒD                  the diagonals of {the input};
       Z                the transposed {input}.
         ṡ 4          Find all length-4 substrings
          €             of each subarray within that.
            ;/        Flatten one level.
                Þ     Sort, with the following sort order:
               E        If all elements are the same, sort later.
              Ṣ         Tiebreak via lexicographical order.
                 ṪṪ   Take the last element of the last element.

相当简单:我们将所有行,列,对角线和对角线取整(就像在n皇后验证器中一样),然后取所有长度为4的子串,然后以4的获胜线排序为结束。(我们需要抢七,以防OOOOXXXX或之外还有一个附加值YYYY。)取最后一个元素的最后一个元素,该元素将为XY根据需要。


6

视网膜,51 48字节

感谢Martin Ender节省了3个字节

M`X((.{6}X){3}|(.{8}X){3}|(.{7}X){3}|XXX)
T`d`YX

在线尝试!

将输入作为逗号分隔的行列表


您可以通过使用一个比赛阶段,缩短节省几个字节(.{7}X){3}|XXX(.{7}X|X)\4\4tio.run/nexus/retina#fc4xCsMwDAXQPfcI2GC6NDS5QaeipcP/...
马丁安德

1
@MartinEnder我不知道如何使用\4-您想重复的效果,而.{7}不是匹配的字符串。(平衡小组可能太长了。)
Neil

1
@Neil哦,是的,没关系,我不知道除了网格中的匹配项之外,没有其他OXY单元格。使用match阶段仍会节省3个字节。
Martin Ender

5

Javascript(ES6),54 55

编辑保存了1个字节,谢谢@Arnauld

我只检查X是否是赢家,因为总会有一个赢家,只有一个赢家

输入是带有任何分隔符的字符串,例如@Arnauld的答案

F=    
b=>'YX'[+[0,6,7,8].some(x=>b.match(`X(.{${x}}X){3}`))]

;['OOOOOOO OOOOOOO OOXOOOO OOXOOOO OOXOOOO OOXOYYY'
 ,'OOOOOOO OOOOOOO OOXOOOO OOYXOOO OOYOXOO OOYYOXY'
 ,'OOOOOOO,OOOOOOO,OOOOOOO,OOOOOOO,OOYYOOO,OYXXXXO'
 ,'OOOOOOO,OOOOOOO,OOOOOOO,XXXXOOO,YXYYOOO,YXYYXYX'
 ,'YXYYXOO,XYXXYOO,XXXYYOO,YYYXXOO,XXYYYYO,XXYYXXO']
.forEach(s => console.log(s,F(s)))


@Arnauld对,谢谢
edc65

4

果冻25 22 字节

ŒgL⁼¥Ðf
;UŒD€;Z;$ç€4FṀ

需要形成的字符串列表(或字符的列表的列表)XY以及O(将也与替换工作,使得所述空间具有比两个计数器的较低序)。

在线尝试!或运行增强版采用多行字符串。

怎么样?

ŒgL⁼¥Ðf - Link 1, runs of given length: list A, length B  e.g. "XYYYXXO", 4
Œg      - group runs of equal elements of A                     ["X","YYY","XX","O"]
     Ðf - filter keep:
    ¥   -     last two links as a dyad:
  L     -         length                                         1   3     2    1
   ⁼    -         equal to B?         (none kept in this case->) 0   0     0    0

;UŒD€;Z;$ç€4FṀ - Main link: list of list of chars (or list of stings) I
 U             - reverse each row of I
;              - I concatenated with that
  ŒD€          - positive diagonals of €ach (positive and negative diagonals)
        $      - last two links as a monad:
      Z        -     transpose of I (i.e. the columns)
       ;       -     concatenated with I (columns + rows)
     ;         - concatenate (all the required directional slices)
         ç€4   - call the last link (1) as a dyad for €ach with right argument = 4
            F  - flatten the result
             Ṁ - take the maximum ('Y'>'X'>'O') - this has the bonus effect of returning:
                               'Y' or 'X' for a winning board; and
                               'O' or '' for a (valid) game in progress.

4

JavaScript(ES6),77 76 69字节

感谢Neil,节省了7个字节

将输入作为以某种分隔的字符串,其中某种东西基本上是任何字符。

b=>[...'XXXXYYYY'].find((c,i)=>b.match(`(${c}.{${(i%4+6)%9}}){3}`+c))

测试用例


为什么不使用b.match()?应该节省RegExp通话费用。
尼尔

@Neil我完全忘记了对match()进行隐式转换RegExp。谢谢!
Arnauld

3

Python 2 143字节

m=input()
u=[r[::-1]for r in m]
print"YX"[any(any('X'*4in''.join(t[i][j-i]for i in range(j+1))for j in range(6))for t in(m[::-1],m,u,u[::-1]))]

接受字符串列表或字符列表。规格保证,对6行乘7列进行硬编码。

在线尝试!



2

Python 2中201 143 129 128 107字节

我决定将水平,垂直和对角线一起添加到一个列表中,然后添加增量,然后在其中查找X。而且由于总会有赢家,所以我可以假设如果X不赢Y。此代码采用所有不同部分和空白位置的矩阵。

lambda m:"YX"[any("X"*4in"".join(a)for a in zip(*m)+m+zip(*["0"*(7-i)+m[i]+"00"*i+m[i]for i in range(6)]))]

在线尝试!

学分


自我回答是完全可以接受的。
乔纳森·艾伦

不看太多了吧,似乎是无用的空格在:i:] fori, rr] for1 for
Yytsi '17

@TuukkaX感谢您的输入,已更新。
尼尔,

另外,*(len(m)-1)可能是*~-len(m)怎么运行的。
Yytsi '17

] for1 for仍然存在。
Yttsi '17

1

K(ngn / k)58 55字节

{"XY"@|/&/'88<x ./:/:,/{x+/:/:+3+[4#1-+!3 3]\&4}'+!6 7}

在线尝试!

{ } 带参数的功能 x

+!6 7 所有可能的对0..5和0..6

{ }' 为他们每个人做

4#1-+!3 3 是8个对角线方向中的4个: (1 1;1 0;1 -1;0 1)

3+[ ]\&4从四个零的列表(&4)开始,并在每个方向上进行3步

x+/:/: 从每个可能的位置开始,并在每个可能的方向上采取步骤

,/连接。在这一点上,我们有一个由4个坐标对组成的列表的矩阵,其中一些扩展到了板外

x ./:/: 从中查找相应的单元格 x

88<其中哪个是"Y"-s?(88是的ASCII码"X"

&/'哪4个列表仅包含"Y"-s?(并减少每个)

|/是否至少有一个这样的?(或减少)

"XY"@如果返回false "X",则返回true"Y"


1

Zsh207 ... 159字节

版本历史:第一周约25字节的4次迭代;然后6个月后再进行约25字节的3次迭代。

t(){a=($^a-$^@_);for s l (${w:^^argv})s+=$l&&for ((i=0;i++<$#s;))a[i]+=$s[i];}
w=(+)
t $@
for s;w[++j]=${(l:j:)}_
t $@
t ${(Oa)@}
[[ $a = *XXXX* ]]&&<<<X||<<<Y

第一)(第二)(第三)(第四)(第五)(第六 在线尝试!

在页脚中,我同时打印输入板和从它构建到stderr的阵列。向下滚动进行调试以查看它们。我们构建的数组现在要长得多,因为t笛卡尔积会在每个输入板上带有输入板调用。(嘿,它把代码缩短了几个字节。)

这里有很多要讨论的内容,因此我将(第六版)注释移至带注释的要点

(tl; dr:连接原始数组的转置,但请确保将它们分隔开)

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.