互相攻击皇后区


26

假设一个8x8的棋盘用任意两个不同的值表示,一个值是一个空的正方形,另一个值是一个皇后。在以下示例中,我将0用作空白方块,将1用作皇后。例如:

皇后在棋盘上

是(谁)给的

1 0 1 1 1 0 0 0
1 0 1 0 1 0 1 1
1 0 1 0 1 1 0 1
0 1 0 1 0 1 0 0
0 1 1 0 0 1 0 1
1 0 0 0 1 0 0 0
0 1 0 0 0 1 1 1
0 1 1 1 0 1 0 1

考虑至少每平方一英里之外的攻击女王/王后的对数(提醒一下,女王/王后正交和对角地攻击)。在上面的示例中,以下令人难以置信的丑陋图表将所有这些对显示为箭头。

进攻皇后

上面找到43对,给出以下测试用例:

Input:
1 0 1 1 1 0 0 0
1 0 1 0 1 0 1 1
1 0 1 0 1 1 0 1
0 1 0 1 0 1 0 0
0 1 1 0 0 1 0 1
1 0 0 0 1 0 0 0
0 1 0 0 0 1 1 1
0 1 1 1 0 1 0 1
Output: 43

挑战

编写一个程序,给定一个以两个不同的值表示的棋盘状态,输出在彼此之间至少有一个正方形的情况下互相攻击的皇后对数。

  • 您可以使用最方便的格式输入,该格式使用两个值来表示空平方和皇后,例如,从底部到顶部的行按字符串的形式分别为64“。”(代表空正方形)和“ Q”(代表皇后),一行为8x8布尔矩阵,整数列表0和1等的列表,只要在您的解决方案中有说明即可
  • 输出是整数
  • 适用标准I / O方法,禁止标准漏洞
  • 这是代码高尔夫球,所以最短答案以字节为单位

测试用例:

使用0和1格式,其中0是空正方形,1是皇后:

Input:
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
Output: 0

Input:
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
Output: 0

Input:
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 1 0 0 0 0 1 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
Output: 1

Input:
0 0 0 0 0 0 0 0
0 0 0 1 0 0 0 0
0 0 0 0 1 0 0 0
0 1 0 0 0 0 1 0
0 0 0 0 1 0 1 0
0 0 0 0 0 0 0 0
0 0 0 1 0 0 1 0
0 0 0 0 0 0 0 0
Output: 10

Input:
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 0 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
Output: 4

Input:
1 1 0 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 0 1 1 1
1 1 1 1 0 1 1 1
1 1 1 1 0 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
Output: 11

在发布第二个版本之前,我应该问过:254是否表示皇后,0表示可接受的输入值?
Arnauld

@Arnauld 您可以以最方便的格式输入,该格式使用两个值来表示空的正方形和皇后。所以可以肯定
JMigst

谢谢。我之所以问是因为,如果从字面上看,我认为这条规则可能太宽容了。我可以要求传递一个包含大多数皇后区JS代码的字符串,然后在程序中对其进行评估。(但是默认的漏洞可能阻止了它。我不确定。)
Arnauld

Answers:


14

Python 2,105个字节

lambda b:sum(b[i+d::d][:(8,7-i%8,i%8)[d%8%5]].find('1')*int(c)>0for i,c in enumerate(b)for d in[1,7,8,9])

在线尝试!

说明

我们以64个字符'0'或的字符串作为输入'1'。使用阶梯切面,我们从遇到的每个女王身上投射出四个“视线”。例如,当i = 10d = 7时,将皇后标记为♥,将选择的图块标记b[i+d::d]为█:

1 0 1 1 1 0 0 0
1 0  0 1 0 1 1
1  1 0 1 1 0 1
 1 0 1 0 1 0 
0 1 1 0 0 1  1
1 0 0 0 1  0 0
0 1 0 0  1 1 1
0 1 1  0 1 0 1

显然,我们实际上并不希望愿景能够像这样围绕整个董事会。因此,我们计算了板的边缘在每个方向上的距离,并查看处的图块b[i+d::d][:…]

对于每个图块方向对,我们都进行了计算:

ray.find('1')*int(c)>0

每当这会失败

  • c不是女王;要么
  • 射线看到的女王太近了(find返回0);要么
  • 该射线看不到女王(find返回-1)。

每对女王/王后仅需检查一次,因为光线始终按阅读顺序从“较早的”女王/王后到“较晚的”女王/王后向前投射。


10

JavaScript(ES7),86个字节

将输入作为64个整数的数组,其中254表示皇后,0表示空正方形。

a=>[s=0,6,7,8].map(d=>a.map(g=(n,p)=>(p%8-(p+=~d)%8)**2<n%4?a[p]?s+=n&1:g(n/2,p):0))|s

在线尝试!

此版本滥用算术下溢以在递归部分获得停止条件。


JavaScript(ES7),89个字节

将输入作为64位数组。

a=>[s=0,6,7,8].map(d=>a.map(g=(n,p,x)=>(p%8-(p+=~d)%8)**2>1|p<0?0:a[p]?s+=!x&n:g(n,p)))|s

在线尝试!

怎么样?

我们以递归方式调用的命名回调函数,map()以沿给定方向遍历正方形。尽管我们实际上并不需要回调的第三个参数(调用了该数组map())的内容,但是我们还是间接使用它来知道它是否是第一次迭代。

arr.map(函数回调(currentValue [,index [,array]])

这是代码中的x变量。

a =>                        // given the input array a[]
  [ s = 0,                  // initialize the sum s to 0
    6, 7, 8 ].map(d =>      // for each direction d in [0, 6, 7, 8]:
    a.map(g = (n, p, x) =>  //   for each square n at position p in a[]:
      (                     //     we are out of the board if:
        p % 8 -             //       - abs(p % 8 - p' % 8) is greater than 1
        (p += ~d) % 8       //         where p' = p - (d + 1)
      ) ** 2 > 1 |          //         (squaring is shorter than using Math.abs)
      p < 0 ?               //       - or p' is less than 0
        0                   //       if so, stop recursion
      :                     //     else:
        a[p] ?              //       if there's a queen on the target square:
          s +=              //         increment s if:
            !x &            //           x is undefined (this is not the 1st iteration)
            n               //           and n = 1 (there's a queen on the source square)
        :                   //       else:
          g(n, p)           //         do a recursive call to g(), with x undefined
    )                       //   end of inner map()
  ) | s                     // end of outer map(); return s

8

蜗牛,14字节

A
rdaa7\1\0+\1

在线尝试!

输入为0/1格式,行内没有空格。

蜗牛是为2D模式匹配语言设计PPCG挑战创建的。最重要的是,默认情况下,它会输出找到的匹配项的数量,非常适合此挑战。


A 设置“所有路径”选项,以便如果一个皇后在多对中,那么每对将生成一个匹配项。

rdaa7将匹配方向设置为S,SE,E和NE。设置为所有方向(z)将导致重复计数。

\1\0+\1匹配一个1,然后匹配一个或多个0s,再匹配另一个1


6

APL(Dyalog Classic)41 39 32字节

(+/+⌿-⌈⌿)2<⌿0⍪⊢,⍉,8 31⍴⊢,≠⍨,⌽,≠⍨

在线尝试!

≠⍨ 是“不等于自身”-8x8全零矩阵

⊢,≠⍨,⌽,≠⍨-如果原始矩阵为ABC...,则此表达式返回:

A B C D E F G H 0 0 0 0 0 0 0 0 H G F E D C B A 0 0 0 0 0 0 0 0
I J K L M N O P 0 0 0 0 0 0 0 0 P O N M L K J I 0 0 0 0 0 0 0 0
Q R S T U V W X 0 0 0 0 0 0 0 0 X W V U T S R Q 0 0 0 0 0 0 0 0
Y Z A B C D E F 0 0 0 0 0 0 0 0 F E D C B A Z Y 0 0 0 0 0 0 0 0
G H I J K L M N 0 0 0 0 0 0 0 0 N M L K J I H G 0 0 0 0 0 0 0 0
O P Q R S T U V 0 0 0 0 0 0 0 0 V U T S R Q P O 0 0 0 0 0 0 0 0
W X Y Z A B C D 0 0 0 0 0 0 0 0 D C B A Z Y X W 0 0 0 0 0 0 0 0
E F G H I J K L 0 0 0 0 0 0 0 0 L K J I H G F E 0 0 0 0 0 0 0 0

8 31⍴ 将其从8x32重塑为8x31,以行优先顺序重用元素:

A B C D E F G H 0 0 0 0 0 0 0 0 H G F E D C B A 0 0 0 0 0 0 0
0 I J K L M N O P 0 0 0 0 0 0 0 0 P O N M L K J I 0 0 0 0 0 0
0 0 Q R S T U V W X 0 0 0 0 0 0 0 0 X W V U T S R Q 0 0 0 0 0
0 0 0 Y Z A B C D E F 0 0 0 0 0 0 0 0 F E D C B A Z Y 0 0 0 0
0 0 0 0 G H I J K L M N 0 0 0 0 0 0 0 0 N M L K J I H G 0 0 0
0 0 0 0 0 O P Q R S T U V 0 0 0 0 0 0 0 0 V U T S R Q P O 0 0
0 0 0 0 0 0 W X Y Z A B C D 0 0 0 0 0 0 0 0 D C B A Z Y X W 0
0 0 0 0 0 0 0 E F G H I J K L 0 0 0 0 0 0 0 0 L K J I H G F E

⊢,⍉, 预先放置原始矩阵及其转置(为清楚起见,额外的空格):

A B C D E F G H  A I Q Y G O W E  A B C D E F G H 0 0 0 0 0 0 0 0 H G F E D C B A 0 0 0 0 0 0 0
I J K L M N O P  B J R Z H P X F  0 I J K L M N O P 0 0 0 0 0 0 0 0 P O N M L K J I 0 0 0 0 0 0
Q R S T U V W X  C K S A I Q Y G  0 0 Q R S T U V W X 0 0 0 0 0 0 0 0 X W V U T S R Q 0 0 0 0 0
Y Z A B C D E F  D L T B J R Z H  0 0 0 Y Z A B C D E F 0 0 0 0 0 0 0 0 F E D C B A Z Y 0 0 0 0
G H I J K L M N  E M U C K S A I  0 0 0 0 G H I J K L M N 0 0 0 0 0 0 0 0 N M L K J I H G 0 0 0
O P Q R S T U V  F N V D L T B J  0 0 0 0 0 O P Q R S T U V 0 0 0 0 0 0 0 0 V U T S R Q P O 0 0
W X Y Z A B C D  G O W E M U C K  0 0 0 0 0 0 W X Y Z A B C D 0 0 0 0 0 0 0 0 D C B A Z Y X W 0
E F G H I J K L  H P X F N V D L  0 0 0 0 0 0 0 E F G H I J K L 0 0 0 0 0 0 0 0 L K J I H G F E

2<⌿0⍪在顶部添加0,并使用<每个元素与其下方的元素进行比较,因此对于每个1的垂直组,我们得到前1的1,而在其他所有位置得到0

+⌿-⌈⌿ 按列的总和减去按列的最大值-我们计算每列的1组之间的间隔数,如果没有,则为0

+/



3

视网膜0.8.260个 58字节

1
¶1$';___¶
_
$n$%`7$*_
(.)(?=.*;(_)*)(?<-2>.)*
$1
m`^10+1

在线尝试!将输入作为8个逗号分隔的8个字符的二进制字符串,但标头会为您转​​换提供的格式。说明:

1
¶1$';___¶

从皇后创建板的所有子字符串。在每个子字符串后缀一个标记值。编辑:通过留下一些垃圾字符串节省了2个字节;这些实际上被忽略了。

_
$n$%`7$*_

将每个标记划分为一个包含范围,然后将7加到非零元素上。

(.)(?=.*;(_)*)(?<-2>.)*
$1

删除每段等于标记长度的字符。这等效于从每个女王那里找到每条东,西南,南或东南射线。

m`^10+1

在遇见另一个女王之前,计算穿过至少一个空方格的所有光线。


3

JavaScript(ES6)+ SnakeEx,38字节

s=>snakeEx.run('m:<*>10+1',s).length/2

以形式输入'10111000\n10101011\n10101101\n01010100\n01100101\n10001000\n01000111\n01110101'。事实证明,SnakeEx仍然可以在原始挑战之外使用!


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.