九个男人的莫里斯伯爵米尔斯


21

介绍

九个人的莫里斯(Mills)(也称为米尔斯)是一款由两名玩家组成的棋盘游戏,在以下棋盘上进行播放(图片摘自链接的Wikipedia页):

磨板

每个玩家有9个人,黑白相间。具体规则对于此挑战并不重要,但如果您有兴趣,请查看Wikipedia页面

挑战

给定一个网格作为输入,它表示在一定boardstate,输出的总研磨计数m0<=m<=8
当三个相同颜色的人在相连点的直排中时,他们就形成了磨坊。 b2f2不是因为磨的人具有不同的颜色。另外d2d5由于必须连接三个点,因此也不会形成磨机。
上图中的木板包含两个磨房。一个从f2f6一个从e3e5

输入项

该板表示为具有24个点的2D网格,如上面的示例图像所示,这些点已连接。该示例a-g在列中使用字母,1-7在行中使用数字,但是您可以选择任何合理的输入格式,只要它将24个唯一坐标映射到以下状态之一即可:

  • 空的
  • 黑色拍摄
  • 采取白色

具体的表达方式取决于您,而颜色并不限于“ b”或“ w”。

除此之外,您的输入内容可能不包含任何其他信息。

附加条款

  • 您不必通过任何值来映射点。如果要将输入作为2D数组,也可以。但是请记住,并不是所有的点都被使用,并且您必须考虑它们之间的连接。
  • 输入可能为空,在这种情况下,您必须输出零(空板->无磨)。
  • 由于每个玩家有9个人,因此输入的总得分不会超过18。
  • 您可以在输入中省去空点,因此只取取输入点。
  • 可以以任何方式订购输入。您不能依赖特定的顺序。
  • 您可以假设输入将始终有效。这意味着每种颜色的人不会超过9个人,并且每个点都是唯一的。

规则

  • 明确您在解决方案中使用的输入格式。强烈建议提供示例程序运行。
  • 允许功能或完整程序。
  • 输入/输出的默认规则
  • 有标准漏洞
  • 这是,因此最低字节数获胜。Tiebreaker是较早提交的内容。

测试用例

这里的输入格式是一个元组列表,其中的坐标如上例中所示为第一个元素,点的状态为第二个元素。白色标记的点标记为“ w”,黑色标记的点标记为“ b”。所有其他点均被忽略,并且为空。

[(“ a4”,“ w”),(“ b2”,“ b”),(“ b4”,“ b”),(“ c4”,“ b”),(“ d1”,“ w”) ,(“ d2”,“ w”),(“ e3”,“ w”),(“ e4”,“ w”),(“ e5”,“ w”),(“ f2”,“ b”) ,(“ f4”,“ b”),(“ f6”,“ b”),(“ g4”,“ w”)]-> 2
[(“ a1”,“ b”),(“ a4”,“ b”),(“ a7”,“ b”),(“ b4”,“ b”),(“ c4”,“ b”) ,(“ d3”,“ w”),(“ d2”,“ w”),(“ d1”,“ w”)]-> 3
[]-> 0
[(“ b4”,“ b”),(“ a4”,b“),(” c4“,w”)]-> 0
[(“ b4”,“ b”),(“ a4”,b“),(” c4“,b”)]-> 1
[(“ a1”,“ b”),(“ a4”,“ b”),(“ a7”,“ b”),(“ b2”,“ b”),(“ b4”,“ b”) ,(“ b6”,“ b”),(“ c3”,“ b”),(“ c4”,“ b”),(“ c5”,“ b”),(“ e3”,“ w”) ,(“ e4”,“ w”),(“ e5”,“ w”),(“ f2”,“ w”),(“ f4”,“ w”),(“ f6”,“ w”) ,(“ g1”,“ w”),(“ g4”,“ w”),(“ g7”,“ w”)]-> 8

编码愉快!



我认为颜色必须连续且对齐,但是还不清楚。例如,相同颜色的d2,d3,d5会形成磨吗?
罗伯特·本森

@RobertBenson不,这不会因为d3d5没有连接。规则说: Three men of the same color form a mill when they are in a straight row of connected points.。我在本节中添加了一些示例,以使其更加清楚,感谢您的评论!
Denker

Answers:


4

APL(Dyalog Classic)26 25字节

-1感谢FrownyFrog

≢{|∊(+/⍵⍪↓⍵),⊢/4 2⍴+⌿⍵}∩≢

在线尝试!

参数是1(黑色),¯1(白色)和0(空)的3x3x3数组。第一维沿同心正方形的嵌套深度。其他两个维度沿垂直轴和水平轴。

000---------001---------002
 |           |           |
 |  100-----101-----102  |
 |   |       |       |   |
 |   |  200-201-202  |   |
 |   |   |       |   |   |
010-110-210     212-112-012
 |   |   |       |   |   |
 |   |  220-221-222  |   |
 |   |       |       |   |
 |  120-----121-----122  |
 |           |           |
020---------021---------022

只要沿任何轴的求和都产生a 3¯3,我们就有一个铣刀,除了在沿第一个轴求和时必须丢弃四个角。

{} 是带有隐式参数的函数

↓⍵分割 -在我们的情况下,它变成一个3x3x3的立方体成嵌套长度为3的矢量的3×3矩阵

⍵⍪↓⍵ 取原始多维数据集并将其粘贴在其下方的3个向量的3x3矩阵,因此我们得到了标量和向量的4x3x3混合数组

+/沿最后一个轴求和;这有沿最后轴(求和原立方体的综合效应+/⍵),并沿中轴线总结它由于我们做的分裂(+/↓⍵

现在,我们必须注意第一个轴的特殊情况。

+⌿⍵ 沿第一个轴求和,返回3x3矩阵

4 2⍴ 但我们绝不能计算拐角,因此我们将其重塑为4x2矩阵,如下所示:

ABC      AB
DEF  ->  CD
GHI      EF
         GH  ("I" disappears)

现在我们只对最后一列(BDFH)感兴趣,所以我们使用成语⊢/

,连接BDFH到我们之前获得的第二和第三轴BDFH矩阵(并且矩阵的前导尺寸均为4)

将到目前为止我们获得的所有结果均化为单个向量

| 取绝对值

{ }∩≢ 仅过滤三进制-输入的长度(≢)始终为3

数他们


呵呵,我只是想建议一下。
亚当


≢{|∊(+/⍵⍪↓⍵),⊢/4 2⍴+⌿⍵}∩≢是短一点:)
FrownyFrog

@FrownyFrog谢谢!编辑于
ngn

4

的JavaScript(ES6),276个 228 125 117 105字节

a=>btoa`i·yø!9%z)ª»-ºü1j;ÝÈ%¥·¡ªÜ"·ç¹Ê1`.replace(/.../g,b=>(a[b[0]]+a[b[1]]+a[b[2]])/3&1||'').length

(上面包含一些无法打印的ascii字符,这些字符不会在此处显示,因此这是一个没有的版本btoa可以复制并运行)

a=>'abcdefghijklmnopqrstuvwxajvdksglpbehqtwimrfnucox'.replace(/.../g,b=>(a[b[0]]+a[b[1]]+a[b[2]])/3&1||'').length

将参考字符串分解为与工厂组键匹配的字母三元组。输入采用对象的形式,其中键是字母a-x,从左下方开始,到右上方结束,先从左到右移动。值是1白色,-1黑色和0空白。

{b:1,d:-1,e:1,f:-1,i:1,k:-1,l:-1,m:1,n:-1,r:1,u:-1} => 2
{j:1,d:-1,k:-1,l:-1,b:1,e:1,i:1,m:1,r:1,f:-1,n:-1,u:-1,o:1} => 2
{a:-1,j:-1,v:-1,k:-1,l:-1,h:1,e:1,b:1} => 3
{} => 0
{k:-1,j:-1,l:1} => 0
{k:-1,j:-1,l:1} => 1
{a:-1,j:-1,v:-1,d:-1,k:-1,s:-1,g:-1,l:-1,p:-1,i:1,m:1,r:1,f:1,n:1,u:1,c:1,o:1,x:1} => 8

这些示例摘自OP的示例,转换为字母键和数字值对象。第一个来自示例图像,其他则来自示例集。


1
不错的工作!您可以使用压缩大字符串atob
ETHproductions 2016年

@ETHproductions谢谢!不过,它似乎正在使用不可打印的ascii字符,因此,我还将包括一个不带ASCII字符的字符btoa。还发现了其他一些改进措施,使其进一步降低了性能。
Mwr247 '16

2

Mathematica,217 131字节

虽然我确定这并不是特别有竞争力,但是这里有一个条目供您参考。

Count[Total/@{{a1,d1,g1},{b2,d2,f2},{c3,d3,e3},{a4,b4,c4},{e4,f4,g4},{c5,d5,e5},{b6,d6,f6},{a7,d7,g7},{a1,a4,a7},{b2,b4,b6},{c3,c4,c5},{d1,d2,d3},{d5,d6,d7},{e3,e4,e5},{f2,f4,f6},{g1,g4,g7}}/.#/.{"w"->1,"b"->2},3|6]&

输入示例:

{a4 -> "w", b2 -> "b", b4 -> "b", c4 -> "b", d1 -> "w", d2 -> "w", e3 -> "w", e4 -> "w", e5 -> "w", f2 -> "b", f4 -> "b", f6 -> "b", g4 -> "w"}

允许使用单个字符的坐标名称可以轻易地打掉51个字符,因此这是一个166字节的解决方案。命名玩家1和2而不是“ w”和“ b”打高尔夫的另外17个角色。

所以我们得到

Count[Total/@{a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,a,j,v,d,k,s,g,l,p,b,e,h,q,t,w,r,i,m,f,u,n,c,o,x}~Partition~3,3|6]/.#&

如果我正确理解了输入格式规则,则应该可以将它们作为1和接受2。使用w和的示例b,但我可以肯定我们不限于此。
Mwr247 '16

@ Mwr247你是对的。您可以使用所需的任何格式,只要不添加其他信息即可。待会我会澄清这一点。
Denker

1

APL(Dyalog Unicode),50字节

“对象的解决方案”

虽然比@ngn的解决方案更长(29个字符),但它使用了一种完全不同的方法:输入的整体结构与该解决方案相同,但是所有插槽都表示为对象。空插槽(包括不存在的中心列)必须是空对象。而所有黑人必须引用“黑人”对象,而所有白人必须引用“白人”对象。为了易于阅读,所有对象可能都具有漂亮的D isplay F orm,因此可以选择使中间列不可见。

+/1=(≢¨(,∪/,∪⌿⍤2),(⊢/4 2⍴∪⌿))

在线尝试!

+/ 总数是

1=() 在

≢¨() 的理货

  , 破烂不平的

  ∪/ 独特的集合

  , 串联到

  ∪⌿⍤2 独特的设置

,() 串联

  ⊢/ 最右边的列

  4 2⍴ 重塑成四行两列,

  ∪⌿ 独特的柱状集

AGL()提供的atop运算符可以将长度减小到27个字符ä

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.