Takuzu는 0
s와 1
s를 포함하는 셀로 그리드를 완성해야하는 논리 게임입니다 . 그리드는 3 가지 규칙을 따라야합니다.
- 3 개의 수평 또는 수직 연속 셀은 동일 할 수 없습니다.
- 각 행과 열에 동일한 수의
0
s와1
s 가 있어야합니다 . - 두 행이 같을 수 없으며 두 열이 같을 수도 없습니다.
완성 된 그리드를 살펴 보겠습니다.
0011
1100
0101
1010
당신이 볼 수 있듯이,이 보드는 규칙을 다음 1
, 2
하고 3
. 동일한 3 개의 수평 또는 수직 셀이 없으며 모든 행과 열에 동일한 수의 0
s와 1
s가 포함되며 두 행과 두 열이 동일하지 않습니다.
유효하지 않은 그리드를 봅시다 :
110100
010011
011010
101100
100011
001101
이 그리드에는 많은 문제가 있습니다. 예를 들어, 행 5
에는 행 에 세 개의 0
s가 있고 열에 2
는 1
행에 세 개의 0
s가 있고 그 뒤에 세 개가 있습니다. 따라서 이것은 유효한 그리드가 아닙니다.
태스크:
당신의 임무는 n
* n
0
와 1
s 의 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 차원 배열로 입력 걸릴 수
0
및1
또는 문자열. - 진실과 거짓 보드에 대해 일관된 진실과 거짓 값을 출력해야하며 “truthy”와 “falsey”를 나타내는 값은 같을 수 없습니다.
이것은 code-golf 이므로 바이트 단위의 가장 짧은 코드가 이깁니다!
답변
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
답변
답변
수학, 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
위해 True
및 0
대한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
확인하고 중복을 확인합니다.