Existe um jogo cerebral chamado Enumerate (que eu criei , baseado em Takuzu ). Seu desafio é jogar este jogo.
Tarefa
Resolver um jogo de 4x4 Enumerate / Takuzu.
- Receba uma grade inicial via STDIN ou linha de comando.
- Saída da grade resolvida via STDOUT ou gravando no arquivo.
Regras
Um jogo é caracterizado por um tabuleiro 4x4, composto de células vermelhas e roxas.
Deve haver o mesmo número de células vermelhas e roxas em cada linha e coluna (2 vermelhas e 2 roxas em cada).
Não deve haver linhas ou colunas idênticas.
Entrada
A grelha de partida será dada como uma cadeia de caracteres 16 / byte que consiste de apenas 0
, 1
, e 2
. Aqui está um exemplo:
0001100002001200
1
representa uma célula vermelha e 2
representa uma célula roxa. Todas as placas de entrada serão solucionáveis.
Nota: Se o seu idioma não suportar entrada literal de cadeia , você poderá receber entrada como uma matriz de números inteiros. Por favor, indique na sua resposta que este é o caso. Portanto, não há confusão, é assim que a matriz deve se parecer:
[0, 0, 0, 1, 1, 0, 0, 0, 0, 2, 0, 0, 1, 2, 0, 0]
Nenhuma matriz aninhada é permitida.
Resultado
A placa resolvida deve ser impressa no mesmo formato acima; uma cadeia de 16 caracteres / bytes, composta apenas por 1
e 2
. Aqui está a solução para a entrada acima:
2121112222111212
Mais 1
uma vez, representa uma célula vermelha e 2
representa uma célula roxa.
Bônus
Um bônus de -25 bytes é oferecido para qualquer resposta que produza a placa resolvida como uma grade ASCII. Aqui está um exemplo do quadro mencionado anteriormente.
2|1|2|1
-+-+-+-
1|1|2|2
-+-+-+-
2|2|1|1
-+-+-+-
1|2|1|2
Um bônus de -50 bytes é oferecido para qualquer resposta que produza a placa resolvida em cores. Isso pode ser produzido como uma imagem ou texto colorido.
Se o texto colorido for escolhido, a saída deve ser assim:
2121
1122
2211
1212
No entanto, se uma imagem for o método de saída escolhido, o arquivo resultante deverá ter 20x20 pixels, onde cada célula é um bloco colorido de 5x5 pixels. Aqui está um exemplo:
Aqui estão os códigos de cores:
Red - #a73cba OR (167, 60, 186)
Purple - #f94a32 OR (249, 74, 50)
Amostras
In: 0020010100000100
Out: 1221212112122112
In: 0010000200121000
Out: 2211112221121221
In: 1000100102000000
Out: 1122122122112112
0
,1
e2
? Que tal uma matriz bidimensional?Respostas:
CJam (pontuação 13)
Com bônus de texto colorido, apenas caracteres imprimíveis: 64 caracteres - 50 = 14
Isso pode ser aprimorado por um caractere usando um caractere não imprimível:
27c'[@
torna - se"^["\
onde^
representa o caractere 27, dando uma pontuação de 13. xxd version:Solução direta sem bônus: 42 caracteres
Demonstração online
Com bônus na grade: 59 caracteres - 25 = 34
Demonstração online
Com saída de imagem, 83 caracteres - 50 = 33. A saída está no formato netpbm.
Demonstração online
fonte
CJam, 74-50 = 24 bytes (saída colorida)
Eu não acho que isso seja muito bom, mas funciona! Experimente aqui. Aviso: lento .
l:~:L;
lê uma linha de entrada emL
. Então,5Zb
é[1 2]
, e nós tomamos o 16 th poder cartesiano (Gm*
) desta lista, para obter todas as soluções possíveis[[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 2] ...]
. O filtro{ },
contém a lógica Takuzu.Adicionei um bônus de saída de cores de código ANSI:
Isso não funciona no site, é claro. Há um
ESC
byte não imprimível na sequência"["
.fonte
5Zb
Ruby, 196 bytes
repeated_permutation
, por que seu nome deve ser tão longo? -_-Isso simplesmente percorre todas as soluções possíveis até que uma delas corresponda ao padrão de entrada.
fonte
C (função) (com built-in gcc), 283
Este parecia um desafio interessante a ser enfrentado no C. Certamente ele pode jogar mais, mas aqui está o começo:
Entrada passada como string para funcionar
f()
. Saída para STDOUT.Experimente online.
fonte
JavaScript (ES6), 263
300Dadas as restrições, o número de soluções possíveis parece surpreendentemente pequeno: 72
A placa inteira pode ser vista como um número de 16 bits.
Valores permitidos para linhas (mascaramento 1111): 0011, 0101, 0110 e os valores invertidos 1100, 1010, 1001
O mesmo para colunas, apenas com diferentes mascaramentos e bits misturados (mascaramento 1000100010001): 0 ... 0 ... 1 ... 1, 0 ... 1 ... 0 ... 1, 0 ... 1 ... 1 ... 0 e os valores invertidos
Observe que os arranjos de bits de linhas e colunas são diferentes; portanto, para verificar a presença de uinidade, você pode adicionar linhas e colunas a um conjunto e verificar se o tamanho do conjunto é == 8.
Código para enumerar todas as soluções possíveis em uma grade 4x4
Teste
fonte
0x10000
pode ser substituído por65536
.C, pontuação
278257(
328307 bytes - 50 bytes para saída colorida ou 291 bytes sem bônus de cor)Este é um método de força bruta que imprime a primeira grade correspondente. Na verdade, ele trabalha em uma grade rotativa de 180 graus para simplificar alguns loops e usa uma tabela de pesquisa (59799) para descobrir quais linhas são válidas. Internamente, todas as grades são apenas números de 16 bits. É preciso uma única entrada de string de seus argumentos.
Devido aos códigos de escape usados para colorir, você pode redefinir o estilo do terminal depois de executar este procedimento (executar
printf "\x1b[0m"
)Demolir:
Então, o que é 59799?
Existem apenas 16 estados possíveis para cada linha / coluna (é um número binário de 4 bits). Dessas, as opções válidas são:
Tomando esses valores como índices de bits, podemos criar uma máscara:
Mas aqui queremos saber as linhas inválidas :
fonte