Takuzu é um jogo de lógica no qual você precisa completar uma grade com células contendo 0
s e 1
s. A grade deve seguir 3 regras:
- Não há três células consecutivas horizontais ou verticais que podem ser iguais.
- Tem de haver um número igual de
0
s e1
s em cada linha e coluna. - Não há duas linhas iguais, nem duas colunas iguais.
Vejamos uma grade finalizada:
0011
1100
0101
1010
Como você pode ver, este quadro segue a regra 1
, 2
e 3
. Não há três células horizontais ou verticais, que são os mesmos, todas as linhas e colunas contêm um número igual de 0
s e 1
s, e não há duas filas e duas colunas não são o mesmo.
Vejamos uma grade que não é válida:
110100
010011
011010
101100
100011
001101
Há muitos problemas com essa grade. Por exemplo, a linha 5
possui três 0
s em uma linha e a coluna 2
possui três 1
s em uma linha, seguidos por três 0
s. Portanto, essa não é uma grade válida.
Tarefa:
Sua tarefa é fazer um programa que, dada uma matriz 2D de n
* n
0
s e 1
s, verifica a placa para ver se é uma placa válida, acabado Takuzu.
Exemplos:
0011
1100
0101
1010
Este fórum segue todas as regras e, portanto, é um conselho válido da Takuzu. Você deve retornar um valor verdadeiro para isso.
11
00
Este não é um quadro válido - a linha 1
não segue a regra 2
. Você deve retornar um valor falsey para isso.
100110
101001
010101
100110
011010
011001
Este não é um quadro válido; ele falha (somente) devido à regra 3 - a primeira e a quarta linhas são as mesmas.
110100
001011
010011
101100
100110
011001
Este não é um quadro válido; ele falha (somente) devido à regra 3 - a primeira e a quarta colunas são as mesmas.
011010
010101
101100
010011
100110
101001
Este é um quadro válido.
Regras e especificações:
- Você pode assumir que todas as placas são quadradas de dimensões
n * n
, onden
é um número inteiro positivo. - Você pode assumir que todas as placas estão concluídas.
- Você pode receber a entrada como uma matriz 2D contendo valores significando
0
e1
, ou como uma sequência. - É necessário gerar valores consistentes de truthy e falsey para placas de truthy e falsey, e os valores que representam "truthy" e "falsey" não podem ser os mesmos.
Isso é código-golfe , então o código mais curto em bytes vence!
fonte
Respostas:
Braquilog ,
2018 bytesExperimente online!
Explicação
fonte
false
para isso ?Casca ,
1918 bytesExperimente online!
1 byte salvo graças ao H.PWiz!
A idéia principal é aplicar uma série de transformações à entrada que são identidades para uma placa válida e verificar se o resultado final é o mesmo que a entrada original.
Explicação
fonte
)
Geléia , 17 bytes
Experimente online!
-6 bytes graças a milhas e Jonathan Allan .
fonte
µZ$⁺
coisa novamente: p ... e 17 bytes trocando um pouco: D agora eu venci brachylog heheMathematica, 143 bytes
entrada
fonte
Python 2 , 127 bytes
Experimente online!
Lê uma lista de n n- pares como entrada.
Eu poderia produzir pelo código de saída escrevendo, em
1/(…)
vez de,print…
mas parece estranho. Eu devo?Explicação
n
é o tamanho do quadro;b
é uma lista de colunas (transposição dea
). O resto é uma comparação longa e encadeada:[n/2]*n*2==map(sum,a+b)
verifica a regra 2. Cada linha e coluna deve somar n / 2.map(sum,a+b)>len(set(a))
é sempre verdadeiro (lista> int).len(set(a))==len(set(b))==n
verifica a regra 3.n<'0, 0, 0'
é sempre verdadeiro (int <str).'0, 0, 0'not in`a+b`>'1, 1, 1'not in`a+b`
verifica a regra 1.`a+b`
é a representação em cadeia de todas as linhas e colunas; para o exemplo de entrada no TIO, éO
`a+b`>'1, 1, 1'
no centro é sempre verdadeiro, pois é garantido que essa sequência seja iniciada"["
, que é maior que"1"
.fonte
[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`>x
, que é 2 bytes menor que a divisão e resulta em umaNameError
para entradas verdadeiras.Casca ,
2725 bytesEntrada é uma lista de listas e a saída é
1
paraTrue
e0
paraFalse
Experimente online!
Explicação
Teste 1
Teste 2
Teste 3
fonte
Retina ,
1298985 bytesExperimente online! Saídas 0 para válido, 1 para inválido. Editar: salvou 4 bytes graças a @MartinEnder. Explicação:
Duplique cada linha com
,
separadores.Transponha a primeira duplicata.
Duplique novamente, desta vez com
;
separadores.Exclua todos os pares de dígitos correspondentes que precedem um ponto-e-vírgula.
Verifique se alguma coluna ou linha falha em alguma das regras;
(.)\1\1
verifica três dígitos idênticos seguidos,\d,?;
verifica um dígito não emparelhado e(\D\d+\b).*\2
verifica uma duplicata.fonte
(...).*
último estágio for apenas fazermax(matches,1)
, você poderá salvar três bytes usando um1
na configuração..\b\d+\b
pode ser\D\d+\b
..*
que já estava usando anteriormente, mas que não pensava usar uma configuração para limitar o resultado, obrigado!Pitão , 31 bytes
Muito obrigado a @Leaky Nun .
Verifique todos os casos de teste ou Experimente aqui!
Pitão ,
48 46 4442 bytesEsta é a solução inicial.
Verifique todos os casos de teste ou Experimente aqui!
fonte
MATL , 27 bytes
Entrada é uma matriz que contém
0
e1
. A saída é0
para falsidade,1
para verdade.Experimente online! Ou veja os casos de teste: 1 , 2 , 3 , 4 , 5 .
Explicação
fonte
R ,
114107 bytes-7 graças a Giuseppe, chamar funções fora de ordem e realmente comprimir as condições
Experimente online!
Isso apenas aplica as regras às colunas da matriz, depois às colunas da transposição da matriz.
Recebe entrada no formato:
É assim que o R toma matrizes 2D.
Saídas TRUE para falhas, FALSE para passes.
fonte
mean(y)-.5
dentro do internof
função para obter os meios, em vez decolMeans
, e fezg
anônimo. Ele irá adicionar alertas para converterdouble
alogical
na chamada paraany
mas isso é OK.Perl 6 ,
10093 bytesJunções FTW! Eles economizam 7 bytes.
Por enquanto, isso parece estar superando todos os outros envios escritos em idiomas não relacionados ao golfe. Yippie!
Experimente online!
Explicação : É um bloco que assume o quadro como lista de listas. Fazemos uma transposição com
[Z] @^a
(reduza a lista de listas com o operador zip). Assim@^a,[Z] @^a
é uma lista do quadro e sua transposição. Passamos por cima dele com ofor
qual funciona exatamente comomap
, sendo apenas 1 char mais barato neste caso.Por dentro, primeiro juntamos as listas que constituem linhas em strings, portanto, temos uma lista de strings em vez de uma lista de listas (
@(.map(*.join))
). Em seguida, usamos um bloco anônimo nele (.&{...}
), onde avaliamos as regras. Nós os avaliaremos apenas em linhas. (Como fazemos isso para a matriz original e a transposição também.)Para economizar bastante
!
, usamos um pouco de lógica e, em vez de testar(NO repeated rows) AND (NO 3 consecutive same symbols) AND (NOT different counts of 0 and 1)
, testamosNOT[ (repeated rows) OR (3 consecutive same symbols) OR (different counts) ]
. É o que fazemos no bloco anônimo:.repeated
fornece todas as linhas que ocorrem mais de uma vez, depois mapeamos as linhas, tentamos combinar 3 símbolos consecutivos usando uma regex e subtraímos as contagens de 0 e 1. Estes são OR'red com o|
. (Na verdade, ele cria uma coisa muito poderosa chamada junção , mas não usamos nenhum dos seus poderes :)) Depois de tudo isso, obtemos uma lista de 2 "bools" (junções não recolhidas). Finalmente, ou eles (usandomax
) e negamos (!
), o que fornece o resultado desejado.fonte
J,
403855 bytesExperimente online!
Define uma função que utiliza uma matriz quadrada como entrada.
Pelo menos está vencendo Pyth (por enquanto ...)(erroneamente). Devo voltar a contar o emoji escondido no meu código, pois J também se presta bem a isso:[:
/^:
:1
|:
:]
:-.@
:#
:@]
:~@
Explicação (ligeiramente desatualizada)
Isso parece diferente da minha resposta e eu posso atualizá-la. Partes dela ainda são as mesmas - eu simplesmente não estava verificando a regra 3 e verificando incorretamente a regra 2 antes.
Dividir em algumas funções e ungolfed:
join_trans
Isso une a transposição da matriz para si mesma, criando uma matriz de matrizes.
part_3
Isso verifica a soma das partições de 3 em linhas para ver se é 3 ou 0 (já que qualquer uma delas significa uma placa inválida), retornando 1 se for e 0 em caso contrário. Opera tanto na matriz quanto na sua transposição, uma vez que são dadas as duas.
f
Por falta de um nome melhor, eu chamo isso
f
. Ele substitui os 0s por _1 e deixa os 1s inalterados. Isso me permite verificar se o número de 0s e 1s é igual em cada linha e coluna (a soma de cada uma das linhas deve ser 0).a Principal
Basicamente, eu aproveitar o fato de que eu configurá-lo para que
f join_trans
epart_3 join_trans
ambos devem somar 0 sse o conselho é válido.part_3
devem ser todos os zeros para uma placa válida e a totalidade def
deve somar zero a uma placa válida, o que significa que a soma de suas somas é 0 apenas para uma placa válida.fonte
*/@,@,&(~:,(0~:3|3+/\]),#=2*+/)|:
Haskell ,
137136127 bytes9 bytes salvos graças ao Lynn!
Experimente online!
fonte
all
s em umand
:l x=x==nub x&&and[sum y*2==length x&¬(j[0,0,0]y||j[1,1,1]y)|y<-x]
j=isSubSequenceOf
paraj x=isSubSequenceOf[x,x,x]
?j a b
invocar (e definir) comoa#b
?Java 8,
350326325312303299298259255 bytesRetorna
0
quando é um quadro válido;1
se for inválido para uma ou mais das três regras.-95 bytes graças a @Nevay .
Explicação:
Experimente aqui.
fonte
Python 3, 187 bytes
Experimente online!
Recebe a entrada como uma lista de linhas.
fonte
05AB1E , 29 bytes
Experimente online!
Explicação
Regra: 3
Regra: 2
Regra 1
Depois, pegamos o produto do resultado de todas as três regras com
P
fonte
Dyalog APL,
6452514948 bytesRequer
⎕IO←0
Experimente online!
fonte
PHP, 245 + 1 bytes
como isso é volumoso. quebras de linha são apenas para conveniência de leitura:
Pega uma única sequência sem novas linhas, imprime
1
por verdade, nada por falsidade.Execute como pipe
-nR
ou experimente online .fonte