连接4:发现假货!


35

银行被打乱了,所有当地的黑手党暴徒都有不寻常的不在场证明:他们在家里玩Connect 4!为了协助调查,要求您编写一个程序来验证所有被抓住的Connect 4板,以便检查位置是否确实是有效Connect 4游戏中的位置,并且没有匆忙组合在一起警察一敲门就一声。

连接4:玩家的规则,RY轮流将其颜色的方块拖放到7x6网格的列中。当玩家将砖块丢入列中时,它会下降以占据该列中的最低未填充位置。如果玩家设法在棋盘上获得四格相同颜色的水平,垂直或对角线,则他们获胜,游戏立即结束。

例如(R从开始),以下是不可能的Connect 4位置。

| | | | | | | |
| | | | | | | |
| | | | | | | |
| | |R| | | | |
| | |Y| | | | |
|R| |Y| | | | |

您的程序或功能必须插入Connect 4板并返回

  • 虚假的值,指示该位置不可能或
  • 数从1到7的字符串,表示的移动导致该位置的一个可能的序列(的列进行编号17从左至右,因此该序列112,例如,表示在列中的红色移动1,接着一个黄色举动在列中1,然后在列中进行红色移动2)。只要您在解决方案中指定,就可以选择除1234567之外的其他列号。如果您想以其他格式返回列表;例如作为数组[2, 4, 3, 1, 1, 3],那也很好,只要很容易看到移动的方向即可。

您可以选择以任何合理的格式阅读棋盘,包括使用除R和之外的字母Y,但您必须指定哪个玩家先行。您可以假设该板将始终为6x7,带有两个播放器。

您可能假设所收到的职位至少在物理上可以在标准Connect 4板上创建;也就是说,将没有“浮动”的部分。您可以假定该板将是非空的。

这是代码高尔夫,所以最短的答案会获胜。有标准漏洞。

例子

| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | | --> 1234567 (one possible answer)
| | | | | | | |
|R|Y|R|Y|R|Y|R|

| | | | | | | |
| | | | | | | |
| | | | | | | |
| | |R| | | | | --> false
| | |Y| | | | |
|R| |Y| | | | |

| | | | | | | |
| | |Y| | | | |
| | |R| | | | |
| | |Y| | | | | --> 323333 (only possible answer)
| | |R| | | | |
| |Y|R| | | | |

| | | | | | | |
| | | | | | | |
| | | | | | | |     
| | | | | | | | --> false (this is the position arising after
| |Y|Y|Y|Y| | |     the moves 11223344, but using those moves
| |R|R|R|R| | |     the game would have ended once R made a 4)

| | | | | | | |
| | | | | | | |
|Y| | | | | | |     
|R|Y| | | | | | --> 2134231211 (among other possibilities)
|R|R|Y| | | | |
|Y|R|R|Y| | | |

| | | | | | | |
| | | | | | | |
|Y| | | | | | |     
|R|Y| | | | | | --> false (for example, 21342312117 does not
|R|R|Y| | | | |     work, because Y has already made a diagonal 4)
|Y|R|R|Y| | |R|

| | | | | | | |
| | | | | | | |
| | | | | | | |     
| | | | | | | | --> 112244553 or similar
|Y|Y| |Y|Y| | |
|R|R|R|R|R| | |

约翰,出于好奇,您知道是否存在非蛮力算法?
约拿(Jonah)

Answers:


9

果冻,57 字节

ŒṪŒ!µ0ịŒṬ¬a³ZU,Ɗ;ŒD$€Ẏṡ€4Ḅo1%15;Ḋ€ṢṚ$Ƒƙ$Ȧȧœị³$2R¤ṁ$ƑµƇṪṪ€

取一个0未填充的矩阵,12播放然后再播放。产生一个由1个索引组成的列的列表,如果标识为假,则为空。

在线尝试!(一分钟内无法运行7个以上块,效率太低)

注意:

  1. 假定不存在“浮动”片段(通过在前面加上ZṠṢ€Ƒȧ+6个字节来解决此问题)
  2. 假设空板是假的

11

的JavaScript(ES6), 202个194 187  183字节

将输入作为矩阵,红色为,黄色为,空为。返回一个索引为0的移动字符串(如果没有解决方案,则返回一个空字符串)。红军开始比赛。240

m=>(p=[...'5555555'],g=(c,s=o='')=>/2|4/.test(m)?['',0,2,4].some(n=>m.join``.match(`(1|3)(.{1${n}}\\1){3}`))?o:p.map((y,x)=>m[m[y][x]--^c||p[g(c^6,s+x,p[x]--),x]++,y][x]++)&&o:o=s)(2)

在线尝试!

怎么样?

递归函数尝试将输入矩阵中的所有和替换为和。g2413

这样做时,可以确保在所有偶数值都消失之前,我们不会有四个连续的奇数值运行(即,如果一方获胜,那一定是最后一步)。

每个列的下一个可用时隙的行存储在。yxp[x]

已评论

m => (                            // m[] = input matrix
  p = [...'5555555'],             // p[] = next row for each column
  g = (c,                         // g = recursive function taking c = color,
          s = o = '') =>          //     s = current solution, o = final output
    /2|4/.test(m) ?               // if the matrix still contains at least a 2 or a 4:
      ['', 0, 2, 4]               //   see if we have four consecutive 1's or 3's
      .some(n =>                  //   by testing the four possible directions
        m.join``                  //   on the joined matrix, using
        .match(                   //   a regular expression where the number of characters
          `(1|3)(.{1${n}}\\1){3}` //   between each occurrence is either 1, 10, 12 or 14
        )                         //   (horizontal, diagonal, vertical, anti-diagonal)
      ) ?                         //   if we have a match:
        o                         //     abort and just return the current value of o
      :                           //   else:
        p.map((y, x) =>           //     for each cell at (x, y = p[x]):
          m[                      // 
            m[y][x]--             //       decrement the value of the cell
            ^ c ||                //       compare the original value with c
            p[                    //       if they're equal:
              g(                  //         do a recursive call with:
                c ^ 6,            //           the other color
                s + x,            //           the updated solution
                p[x]--            //           the updated row for this column
              ),                  //         end of recursive call
              x                   //         then:
            ]++,                  //         restore p[x]
            y                     //         and restore m[y][x]
          ][x]++                  //         to their initial values
        ) && o                    //     end of map(); yield o
    :                             // else:
      o = s                       //   we've found a solution: copy s to o
)(2)                              // initial call to g() with c = 2

注意我已经问过“我们是否可以假设没有空板作为输入?” -如果我们必须处理此问题,则您的代码将需要进行调整。
乔纳森·艾伦

我不知道为什么,f([ [0,0,0,0,0,0,0], [0,0,0,0,0,0,0], [0,0,0,0,0,0,0], [0,0,2,0,2,0,0], [0,2,2,0,2,2,0], [1,1,1,1,1,1,1] ])终止于0 并且f([ [0,0,0,0,0,0,0], [0,0,0,0,0,0,0], [0,0,0,0,0,0,0], [0,0,2,0,2,0,0], [2,2,2,0,2,2,1], [1,1,1,1,1,1,1] ])应该是真的
Nahuel Fouilleul

@NahuelFouilleul感谢您的举报。我已经修复了添加这些测试用例的代码。
Arnauld

2

Python 2中295个 285字节

def f(a):
 if 1-any(a):return[]
 p=sum(map(len,a))%2
 for i in R(7):
	if a[i][-1:]==`p`:
	 b=a[:];b[i]=b[i][:-1];L=f(b)
	 if L>1>(`1-p`*4in','.join([J((u[j]+' '*14)[n-j]for j in R(7))for n in R(12)for u in[b,b[::-1]]]+b+map(J,zip(*[r+' '*7for r in b])))):return L+[i]
R=range;J=''.join

在线尝试!

-10英镑至Jo King

输入是代表列的字符串列表;红色代表“ 1”,黄色代表“ 0”。字符串不是用''填充的。因此(假)情况:

| | | | | | | |
| | | | | | | |
|Y| | | | | | |
|R|Y| | | | | |
|R|R|Y| | | | |
|Y|R|R|Y| | |R|

输入为:

[
  '0110',
  '110',
  '10',
  '0',
  '',
  '',
  '1'
]

输出是列索引的列表,索引为0,可组成该板;还是None无效的

接受空白板为有效(返回空列表[]而不是None)。

这种方法是从最后一步到第一步的递归:基于所采取的总步数的奇偶校验,我们删除最后一个Red动作或最后一个Yellow动作(如果不可能,则失败)。检查结果棋盘,查看对手是否有4排(在这种情况下会失败,因为比赛应该已经停止了);否则,递归直到板子为空(有效)。

4行代码是最肿的部分。矩阵的所有对角线字符串b均通过以下方式生成:

[
    ''.join(
        (u[j]+' '*14)[n-j] for j in range(7)
    )
    for u in[b,b[::-1]]for n in range(12) 
]

首先列出“向下倾斜”的对角线,然后列出“向上倾斜”的对角线。

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.