유효한 타쿠 즈 보드입니까? n 0와 1s

Takuzu는 0s와 1s를 포함하는 셀로 그리드를 완성해야하는 논리 게임입니다 . 그리드는 3 가지 규칙을 따라야합니다.

  1. 3 개의 수평 또는 수직 연속 셀은 동일 할 수 없습니다.
  2. 각 행과 열에 동일한 수의 0s와 1s 가 있어야합니다 .
  3. 두 행이 같을 수 없으며 두 열이 같을 수도 없습니다.

완성 된 그리드를 살펴 보겠습니다.

0011
1100
0101
1010

당신이 볼 수 있듯이,이 보드는 규칙을 다음 1, 2하고 3. 동일한 3 개의 수평 또는 수직 셀이 없으며 모든 행과 열에 동일한 수의 0s와 1s가 포함되며 두 행과 두 열이 동일하지 않습니다.

유효하지 않은 그리드를 봅시다 :

110100
010011
011010
101100
100011
001101

이 그리드에는 많은 문제가 있습니다. 예를 들어, 행 5에는 행 에 세 개의 0s가 있고 열에 21행에 세 개의 0s가 있고 그 뒤에 세 개가 있습니다. 따라서 이것은 유효한 그리드가 아닙니다.

태스크:

당신의 임무는 n* n 01s 의 2D 배열이 주어진 보드가 유효하고 완성 된 Takuzu 보드인지 확인하기 위해 보드를 검증 하는 프로그램을 만드는 것 입니다.

예 :

0011
1100
0101
1010

이 보드는 모든 규칙을 따르므로 유효한 Takuzu 보드입니다. 이것에 대해 진실한 가치를 돌려 주어야합니다.

11
00

이것은 유효한 보드 행 1이 규칙을 따르지 않습니다 2. 이에 대한 잘못된 값을 반환해야합니다.

100110
101001
010101
100110
011010
011001

이것은 유효한 보드가 아니며 규칙 3으로 인해 실패합니다 (첫 번째와 네 번째 행이 동일합니다).

110100
001011
010011
101100
100110
011001

이것은 유효한 보드가 아니며 규칙 3으로 인해 실패합니다 (첫 번째와 네 번째 열은 동일합니다).

011010
010101
101100
010011
100110
101001

이것은 유효한 보드입니다.

규칙 및 사양 :

  • 모든 보드가 치수의 제곱이라고 가정 할 수 있습니다 n * n. 여기서 n양의 정수는 정수입니다.
  • 모든 보드가 완성되었다고 가정 할 수 있습니다.
  • 넌 나타내는 값을 포함하는 2 차원 배열로 입력 걸릴 수 01또는 문자열.
  • 진실과 거짓 보드에 대해 일관된 진실과 거짓 값을 출력해야하며 “truthy”와 “falsey”를 나타내는 값은 같을 수 없습니다.

이것은 이므로 바이트 단위의 가장 짧은 코드가 이깁니다!



답변

Brachylog , 20 18 바이트

≠\≠,?¬{∋s₃=|∋ọtᵐ≠}

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

설명

≠                           All rows are different
 \                          Transpose
  ≠                         All columns are different
   ,?                       Append the list of rows to the list of columns
     ¬{          }          It is impossible that:
       ∋                      A row/column of the matrix…
        s₃=                   …contains a substring of 3 equal elements
           |                Or that:
            ∋ọ                The occurences of 1s and 0s in a row/column…
              tᵐ≠             …are not equal


답변

껍질 , 19 18 바이트

S=‼(Tf§=LṁDum(ṁ↑2g

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

H.PWiz 덕분에 1 바이트가 절약되었습니다!

주요 아이디어는 유효한 보드의 ID 인 입력에 일련의 변환을 적용하고 최종 결과가 원래 입력과 동일한 지 확인하는 것입니다.

설명

S=‼(Tf§=LṁDum(ṁ↑2g
            m(ṁ↑2g    in each line, take at most two items for each sequence of equal items
           u          remove duplicate lines
     f§=LṁD          keep only those lines where the sum of each element doubled is equal to the length of the line
    T                 transpose the matrix (swap rows with columns)
  ‼                   do all the previous operations again
S=                    check if the final result is equal to the original input


답변

젤리 , 17 바이트

-*S;E3Ƥ€F$TȯQZµ⁺⁼

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

마일Jonathan Allan 덕분에 -6 바이트 .


답변

수학, 143 바이트

And@@Flatten@(((s=#;Equal@@(Count[s,#]&/@{0,1})&&FreeQ[Subsequences@s,#]&/@{{1,1,1},{0,0,0}})&/@#)&&(DeleteDuplicates@#==#)&/@{#,Transpose@#})&

입력

[{{0, 0, 1, 1}, {1, 1, 0, 0}, {0, 1, 0, 1}, {1, 0, 1, 0}}]


답변

파이썬 2 , 127 바이트

a=input()
n=len(a)
b=zip(*a)
print[n/2]*n*2==map(sum,a+b)>len(set(a))==len(set(b))==n<'0, 0, 0'not in`a+b`>'1, 1, 1'not in`a+b`

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

n n 튜플 목록을 입력으로 읽습니다 .

1/(…)대신 코드를 작성하여 종료 코드로 출력 할 수 는 print…있지만 어지럽습니다. 내가해야합니까?

설명

n보드의 크기입니다. b열의 목록입니다 (조옮김 a). 나머지는 하나의 긴 체인 비교입니다.

  • [n/2]*n*2==map(sum,a+b) 규칙 2를 확인합니다. 각 행과 열의 합은 n / 2 여야합니다.
  • map(sum,a+b)>len(set(a)) 항상 참입니다 (list> int).
  • len(set(a))==len(set(b))==n 규칙 3을 확인합니다.
  • n<'0, 0, 0' 항상 참입니다 (int <str).
  • '0, 0, 0'not in`a+b`>'1, 1, 1'not in`a+b`검사 규칙 1 `a+b`은 모든 행과 열의 문자열 표현입니다. TIO의 입력 예는

    "[(0, 0, 1, 1), (1, 1, 0, 0), (0, 1, 0, 1), (1, 0, 1, 0), (0, 1, 0, 1), (0, 1, 1, 0), (1, 0, 0, 1), (1, 0, 1, 0)]"

    `a+b`>'1, 1, 1'이 문자열로 시작 보장되기 때문에 중앙에 항상 사실 "["보다 큰, "1".


답변

껍질 , 27 25 바이트

Λ§&Λȯ¬VEX3§&Λ§=#0#1S=uSeT

입력리스트의 목록 출력은 1위해 True0대한False

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

설명

                      SeT    Create a list with the input and itself transposed
Λ                            Is the following function true for all in the list
 §&                          And the results of the following functions
   Λȯ¬VEX3                     Test for rule 1
          §&                   The and of:
            Λ§=#0#1                Test for rule 2
                   S=u             Test for rule 3

시험 1

Λȯ¬VEX3
Λ         Is it True for all ...
   V      Are any of the ...
     X3   Substrings of length 3 ...
    E     All equal
 ȯ¬       Logical not

시험 2

Λ§=#0#1
Λ         Is it true for all that ...
 §=       The results of the two functions are equal
   #0         Number of 0s
     #1       Number of 1s

시험 3

S=u
S=    Is the result of the following function equal two its argument
  u   Remove duplicates


답변

망막 , 129 89 85 바이트

.+
$&,$&
O#$`.(?=.*,)
$.%`
.+
$&;$&
+`(01|10)(?=.*;)

1ms`(.)\1\1|\d,?;|(\D\d+\b).*\2

온라인으로 사용해보십시오! 유효하면 0을, 유효하지 않으면 1을 출력합니다. 편집 : @MartinEnder 덕분에 4 바이트가 절약되었습니다. 설명:

.+
$&,$&

각 행을 복제 ,구분 기호를 사용 .

O#$`.(?=.*,)
$.%`

첫 번째 사본을 바꿉니다.

.+
$&;$&

이번에도 다시 복제 ; 구분 기호로 .

+`(01|10)(?=.*;)

세미콜론 앞에 오는 일치하는 모든 숫자 쌍을 삭제하십시오.

1ms`(.)\1\1|\d,?;|(\D\d+\b).*\2

열 또는 행이 규칙에 실패하는지 확인하십시오. (.)\1\1행에서 동일한 3 자리 숫자를 \d,?;확인하고 짝을 이루지 않은 숫자를 (\D\d+\b).*\2확인하고 중복을 확인합니다.