아홉 남자 모리스의 밀스 백작 있습니다. 에서 하나 f2에

소개

Nine Mens ‘s Morris (Mills라고도 함)는 다음 보드에서 재생되는 두 명의 플레이어를위한 보드 게임입니다 (링크 된 Wikipedia 페이지에서 가져온 이미지).

밀 보드

각 선수는 9 명의 남자, 흑백으로 착색됩니다. 구체적인 규칙은이 도전에 중요하지 않지만 관심이 있다면 Wikipedia 페이지를 확인 하십시오 .

도전

특정 보드 상태를 나타내는 그리드를 입력으로 지정하면 총 밀 수를 m로 출력합니다 0<=m<=8.
같은 색의 세 남자가 연결된 줄의 직선에있을 때 밀을 형성합니다. b2에이 f2남자가 다른 색의 때문에 밀이 아니다. 또한 d2하는 d5세 개의 점을 연결해야하기 때문에 밀을 형성하지 않을 것입니다.
위 이미지의 보드에는 예를 들어 두 개의 밀이 있습니다. 에서 하나 f2f6그리고 하나 e3e5.

입력

보드는 위의 예제 이미지와 같이 24 포인트가 연결된 2D 그리드로 표시됩니다. 이 예에서는 a-g열에 문자를 사용 1-7하고 행에 숫자를 사용 하지만 24 개의 고유 좌표를 다음 상태 중 하나에 매핑하는 경우 적절한 입력 형식을 선택할 수 있습니다.

  • 블랙에 의해 촬영
  • 흰색으로 촬영

구체적인 repersentation은 당신에게 달려 있습니다. 당신은 색상에 대해 “b”또는 “w”로 제한되지 않습니다.

이 외에도 입력 내용에 추가 정보가 포함되어 있지 않을 수 있습니다.

추가 사항

  • 어떤 종류의 값으로도 점을 매핑 할 필요는 없습니다. 입력을 2D 배열로 가져 오려면 괜찮습니다. 그러나 거기에있는 모든 점이 사용되는 것은 아니며 그 점 사이의 연결을 고려해야한다는 것을 명심하십시오.
  • 입력이 비어있을 수 있습니다.이 경우 0을 출력해야합니다 (빈 보드-> 밀 없음).
  • 각 선수는 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

행복한 코딩!



답변

APL (Dyalog Classic) , 26 25 바이트

FrownyFrog 덕분에 -1

≢{|∊(+/⍵⍪↓⍵),⊢/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

우리는 어떤 축을 따라 합계가를 산출 할 때마다 밀이 3¯3첫 번째 축을 따라 합산 할 때 우리는 네 모서리를 버려야 제외.

{} 암시 적 인수가있는 함수

↓⍵분할 -가 중첩 길이 3 인 벡터의 3 × 3 행렬로 3x3x3 큐브를 온 우리의 경우

⍵⍪↓⍵ 원래 큐브를 가져와 그 아래에 3×3의 3×3 행렬을 붙입니다. 그래서 우리는 스칼라와 벡터의 4x3x3 혼합 배열을 얻습니다.

+/마지막 축을 따라 합산됩니다. 이 마지막 축 (함께 원래의 큐브를 합산의 결합 효과가 +/⍵(때문에 우리가했던 분할에) 및 중앙 축을 따라이를 합산을 +/↓⍵)

이제 첫 번째 축의 특수 사례를 처리해야합니다.

+⌿⍵ 첫 번째 축을 따라 합산하여 3×3 행렬을 반환

4 2⍴ 그러나 우리는 모서리를 세지 않아야하므로 다음과 같이 4×2 행렬로 모양을 바꿉니다.

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

이제 우리는 마지막 열에 만 관심이 BDFH있으므로 관용구를 사용합니다.⊢/

,BDFH우리는 두 번째 & 세 번째 축에 대해 이전에 얻은 행렬에 연결 합니다 ( BDFH그리고 행렬의 앞쪽 치수는 4입니다)

우리가 지금까지 얻은 모든 것을 하나의 벡터로 평탄화

| 절대 값을 받는다

{ }∩≢ 3 개만 필터링-입력의 길이 (≢)는 항상 3

그들을 세다


답변

자바 스크립트 (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의 예에서 발췌하여 문자 키 및 숫자 값 개체로 변환됩니다. 첫 번째는 예제 이미지에서 가져온 것이고 다른 하나는 예제에서 가져온 것입니다.


답변

매스 매 티카, 217131 바이트

이것이 특히 경쟁적이지는 않다고 확신하지만 여기에 귀하를위한 항목이 있습니다.

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 바이트 솔루션이됩니다. “w”와 “b”대신 플레이어 1과 2의 이름을 지정하면 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]/.#&

답변

APL (Dyalog Unicode) , 50 바이트

“객체 솔루션”

@ngn의 솔루션
보다 긴 (29 자) 동안 완전히 다른 접근법을 사용합니다. 입력은 솔루션과 동일한 전체 구조를 갖지만 모든 슬롯은 객체로 표시됩니다. 비어있는 슬롯 (존재하지 않는 중심 열 포함)은 비어있는 객체 여야합니다. 모든 흑인은 “흑인”개체에 대한 참조 여야하고 모든 백인은 “백인”개체에 대한 참조 여야합니다. 모든 개체는 선택적으로 좋은있을 수 있습니다 D를 isplay F ORM 의 가독성을 위해, 그리고 가운데 열이 선택적으로 보이지 않는 될 수 있도록.

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

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

+/ 의 합

1=() 사람의

≢¨() 의 탈리

  , 뾰족한 (평평한)

  ∪/ 에 걸쳐 독특한 세트

  , 에 연결

  ∪⌿⍤2 독특한 세트

,(…에 ) 연결

  ⊢/ 가장 오른쪽 열

  4 2⍴ 네 개의 행과 두 개의 열로 재구성되었습니다.

  ∪⌿ 독특한 기둥 세트

꼭대기 로 AGL (함께 제공 사업자는 ä) 27 자까지 길이를 가져올 것입니다 .