상호 공격 퀸


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

적어도 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

답변:


14

파이썬 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'합니다. 스텝 슬라이스를 사용하여, 우리는 마주 치는 모든 여왕으로부터 4 개의 "시선"을 시전합니다. 예를 들어, 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여왕이 아니다. 또는
  • 이 광선이 보는 여왕이 너무 가깝습니다 ( find0을 반환). 또는
  • 이 광선은 여왕이 보이지 않습니다 ( find-1을 반환합니다).

광선은 항상 주조되기 때문에 왕비의 각 쌍은 한 번 확인 전용 전진 은 "나중에"일에 "이전"여왕에서 순서를 읽는.


10

자바 스크립트 (ES7), 86 바이트

여왕의 경우 254 , 빈 사각형의 경우 0 을 포함하여 64 개의 정수 배열로 입력을 받습니다.

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

온라인으로 사용해보십시오!

이 버전은 산술 언더 플로를 악용하여 재귀 부분에서 중지 조건을 얻습니다.


자바 스크립트 (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+\1a 1다음에 하나 이상 0s 다음에 일치합니다 1.


6

APL (Dyalog Classic) , 41 39 32 바이트

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

온라인으로 사용해보십시오!

≠⍨ "그 자체와 같지 않다"-8x8의 0으로 구성된 행렬

⊢,≠⍨,⌽,≠⍨-원래 행렬이 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.2 , 60 58 바이트

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

온라인으로 사용해보십시오!8 개의 쉼표로 구분 된 8 자의 이진 문자열로 입력을 받지만 헤더는 제공된 형식을 변환합니다. 설명:

1
¶1$';___¶

여왕에서 시작하여 보드의 모든 하위 문자열을 만듭니다. 각 하위 문자열에 마커 값을 붙입니다. 편집 : 가비지 문자열을 남겨 두어 2 바이트를 절약했습니다. 이들은 효과적으로 무시됩니다.

_
$n$%`7$*_

각 마커를 포함 범위로 나누고 0이 아닌 요소에 7을 더합니다.

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

마커 길이와 동일한 모든 문자를 삭제합니다. 이것은 각 여왕으로부터 각각의 동쪽, 남서, 남쪽 또는 남동쪽 광선을 찾는 것과 같습니다.

m`^10+1

다른 여왕을 만나기 전에 적어도 하나의 빈 광장을 통과하는 모든 광선을 세십시오.


3

자바 스크립트 (ES6) + SnakeEx , 38 바이트

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

형식으로 입력을 '10111000\n10101011\n10101101\n01010100\n01100101\n10001000\n01000111\n01110101'받습니다. SnakeEx는 원래의 도전 과제를 벗어나서도 여전히 사용할 수 있습니다.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.