Portanto, sua tarefa é pegar um bloco 3x3 -
em que os espaços em branco são médios e *
os espaços preenchidos, por exemplo:
-**
-*-
*-*
e reorganize o bloco para que ele *
forme um X, assim:
*-*
-*-
*-*
Entrada: quadrados 3x3 como acima, eles podem ser de 3 linhas, uma matriz ou como você desejar.
Saída: a menor quantidade de movimentos para reorganizar em um X. Cada movimento está invertendo 2 caracteres que estão tocando e são horizontais um do outro, verticais um do outro ou diagonal um do outro. Se não for possível, retorne qualquer saída impossível, por exemplo 999
ou -4242
. 5
é o menor número desse tipo.
Casos de teste:
1) Saída: 1
-**
-*-
*-*
2) Saída: -1
-*-
-*-
*-*
3) Saída: 3
---
-**
***
4) Saída: 0
*-*
-*-
*-*
Você pode substituir os caracteres em branco e não em branco, mas lembre-se de incluir qual é qual em sua postagem
Code Golf
Lembre-se de que este é o código de golfe, o código mais curto vence!
fonte
*
e vice-versa ou trocá-los?*
? Você pode adicionar mais alguns casos de teste?*
ou menos que 5, isso torna impossível.-1
? Por exemplo5
(impossível de outra forma), ou lançando um erro?Respostas:
Python 3 ,
10478 bytesExperimente online!
Edit: Aplicadas as sugestões de @Jonathan Allan e @ xnor para reduzir drasticamente a contagem de bytes.
A entrada é uma lista de
cadeiasde comprimento 9 com zeros e uns, sendo os*
s.Aqui estão algumas observações:
Portanto, primeiro testamos se a sequência possui cinco e depois contamos as seguintes coisas:
0124
,0346
,2458
,4678
sendo todos os)n[4]
sendo um e teste cada ser de extração de intervalo'111'
.max
vez desum
.fonte
count
s porsum
s e'111'
por[1]*3
) TIO (Eu tenho tentado ser inteligente com umn[i::j]>=[1]*3
loop, mas não achei mais curto).max(n,n[6:],n[::3],n[2::3])>='1'*3
.Geléia , 26 bytes
Experimente online!
Tome uma lista simples como entrada.
Pena que Jelly não tem "índices de verdade multidimensionais" ...
T€ṭ€"JẎ
também funciona, mas leva mais 1 byte.Algoritmo: Existem 5 posições de bloco atuais e 5 destinos (destinos), o algoritmo tenta cada um dos 5! correspondendo e produza a soma mínima da distância Chebyshev [origem, destino].
fonte
Haskell ,
176132126 126104 bytesExperimente online!
Leva uma lista de números inteiros com 1 como o caractere não em branco. Soma o número de quadrados indexados pares diferentes de zero e adiciona 1 se algum dos padrões de movimento duplo for encontrado (quadrado central e coluna / linha da aresta completamente preenchida). Acho que a última parte é um pouco inútil, provavelmente poderia ser muito melhorada em relação a esse método de força bruta. Retorna 5 (uma saída impossível) em uma entrada impossível.
fonte
length
teste pode ser reduzido parasum[1|1<-a]
. Funçãos
para: na(1-e,n+sum[1|b>e])
qual você pode alinhar para salvar outro byte. Você pode usar ootherwise
protetor nom
para salvar par de()
. Finalmente,&&
no nível superior de uma guarda pode ser substituído por,
. ...sum
compreensão de uma lista para converter um booleano em int. Experimente online!m
. Experimente online!a
deve ser,0
você não pode usar emsum a
vez desum[1|1<-a]
? Experimente online!1
s, a menos que o centro seja0
, você pode fazer em3<-
vez deelem 3$
. Também você pode usar emsum.map(a!!)
vez desum<$>map(a!!)
.Python 2 ,
194192 bytesExperimente online!
fonte
[0,1,0,1,0,1,1,1,0]
(esperado: 4, real: 13).JavaScript (ES6), 123 bytes
Recebe a entrada como um número inteiro de 9 bits. Resolve o enigma aplicando ingenuamente as regras, que provaram não ser a abordagem mais curta.
Experimente online!
Comentado
Nota : Este código realiza alguns movimentos ilegais além do topo do tabuleiro quando m é multiplicado por 64. Mas eles são simplesmente ignorados, pois não podem levar a uma solução mais curta que a melhor solução legal.
Abaixo estão as 9 máscaras de troca de base e o padrão de destino. O canto superior esquerdo é o bit mais significativo.
fonte
Geléia , 26 bytes
Experimente online!
Um link monádico.
Quão?
Inspirado pela resposta Python de Bubbler ; Golfed para atender Jelly ...
fonte
JavaScript, 85 bytes
Este é um porto regular da resposta de Bubbler .
Insira como uma sequência de 0/1.
Mostrar snippet de código
fonte
Stax ,
2322 bytesExecute e depure
Este programa utiliza uma variedade de
[0, 1]
como entrada e retorna um número inteiro de movimentos ou uma sequência vazia, se nenhuma solução for possível.Considere estes índices para a grade
1
s na entrada, não haverá solução; portanto, não produzimos saída.1
dessas posições produzirá o resultado final.1
um em uma posição incorreta, sua distância é 1 ou 2. Serão 2 se estiver cercado por outros1
s. Por exemplo, se houver1
s nos índices [0, 1, 2, 4], a distância para o incorreto1
é 2.Com isso em mente, considere esse pseudocódigo para obter a distância contribuída para o resultado pelo índice 1.
b
de 0 a 15.0 <= b <= 7
a distância é 0. Quando8 <= b <= 14
a distância é 1. Quandob == 15
a distância é 2. Isso pode ser calculado usando a divisão inteira porb * 2 / 15
.Portanto, a distância total pode ser calculada repetindo esse processo 4 vezes e girando a grade no meio.
Execute este
fonte
Excel,
8681 bytesAntigo: quando a saída 'impossível' era
-1
Usa
1
para entrada preenchida e0
vazia, dentro do intervaloA1:C3
.É possível jogar golfe ainda mais se pudermos retornar valores diferentes deRetorna um-1
"impossível".#DIV/0!
erro em grades impossíveisOpera na mesma lógica que a resposta Python do Bubbler .
fonte