Imagine um incendiário andando pela cidade e escolhendo suas vítimas de acordo com um padrão muito específico (ou, alternativamente, imagine uma abelha voando pelo jardim e escolhendo suas flores para polenizar de acordo com um padrão muito específico ). Digamos que a cidade seja uma matriz N × N , onde N é um número inteiro maior ou igual a 2 . O incendiário começa no canto superior esquerdo e coloca sucessivamente os pontos da casa M na frente deles (onde M é o número da casa em que estão atualmente), enquanto muda a direção em que está se movendo após cada incêndio, na ordem Leste ⟶ Sul ⟶ Oeste ⟶ Norte ⟶ Leste ⟶ Sul ... e assim por diante. A canção de ninardo incendiário é o valor de M que os leva a sair da cidade (ou seja, a última casa que visitam antes de parar a abominação). Isso é muito mais fácil de entender com um exemplo. Tome a seguinte matriz, por exemplo:
3 2 3 2 7 3 1 4 1 6 2 5 3 1 1 4 4 3 2 4 1 1 1 1 1
- Começamos no canto superior esquerdo, então M = 3 (
X
marca as posições atuais e anteriores do incendiário):X 2 3 2 7 3 1 4 1 6 2 5 3 1 1 4 4 3 2 4 1 1 1 1 1
- De acordo com a ordem conhecida, primeiro ele vai para o leste M (3) pontos e pousa em um 2, para que M mude de acordo:
X 2 3 X 7 3 1 4 1 6 2 5 3 1 1 4 4 3 2 4 1 1 1 1 1
- Então ele vai para o sul 2 pontos e M agora é 1 :
X 2 3 X 7 3 1 4 1 6 2 5 3 X 1 4 4 3 2 4 1 1 1 1 1
- Agora ele se move 1 ponto para o oeste e M se torna 3 :
X 2 3 X 7 3 1 4 1 6 2 5 XX 1 4 4 3 2 4 1 1 1 1 1
- Depois que ele se move 3 pontos ao norte, sai da cidade! Portanto, 3 é a canção de ninar desse incendiário:
X X 2 3 X 7 3 1 4 1 6 2 5 XX 1 4 4 3 2 4 1 1 1 1 1
Dada uma matriz N × N (você também pode usar N como entrada), encontre a canção de ninar do incendiário. Eu escrevi um programa com o qual você pode gerar mais casos de teste e visualizar o caminho do incendiário: Experimente online!
- Você pode assumir que o incendiário não têm uma canção de ninar (isto é, ele pode realmente sair da matriz).
- A matriz conterá apenas números inteiros positivos menores ou iguais a 9 (dígitos), para simplificar. Soluções que lidam com qualquer número inteiro positivo são completamente bem-vindas.
- Observe que o incendiário pode pousar em um local que já queimou, caso o sentido em que está se movendo seja diferente da primeira vez. Nesse cenário, basta pegar o valor desse elemento e mover novamente como de costume.
- Você pode competir em qualquer linguagem de programação e pode receber e fornecer saída por qualquer método padrão , observando que essas brechas são proibidas por padrão. Isso é código-golfe , então a submissão mais curta (em bytes) para todos os idiomas vence.
Casos de teste
------------- 9 2 3 1 7 2 8 7 6 Canção de ninar: 9 ------------- 2 1 2 1 3 1 1 2 1 2 2 1 1 1 1 3 Canção de ninar: 2 ------------- 3 2 3 2 7 3 1 4 1 6 2 5 3 1 1 4 4 3 2 4 1 1 1 1 1 Canção de ninar: 3 ------------- 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 Canção de ninar: 2 ------------- 3 2 1 2 1 1 1 2 3 2 3 2 1 1 2 1 1 1 3 1 2 3 1 1 1 1 1 1 4 5 2 3 1 1 1 1 2 1 2 1 2 2 1 2 2 3 2 1 2 Canção de ninar: 3 -------------
As matrizes em um formato diferente:
[[9, 2, 3], [1, 7, 2], [8, 7, 6]] [[2, 1, 2, 1], [3, 1, 1, 2], [1, 2, 2, 1], [1, 1, 1, 3]] [[3, 2, 3, 2, 7], [3, 1, 4, 1, 6], [2, 5, 3, 1, 1], [4, 4, 3, 2, 4], [ 1, 1, 1, 1, 1]] [[1, 2, 1, 2, 1, 2], [1, 2, 1, 2, 1, 2], [1, 2, 1, 2, 1, 2], [1, 2, 1, 2, 1, 2], [1, 2, 1, 2, 1, 2], [1, 2, 1, 2, 1, 2]] [[3, 2, 1, 2, 1, 1, 1], [2, 3, 2, 3, 2, 1, 1], [2, 1, 1, 1, 1, 3, 1, 2], [ 3, 1, 1, 1, 1, 1, 1], [4, 5, 2, 3, 1, 1, 1], [1, 2, 1, 2, 1, 2, 2], [1, 2, 2, 3, 2, 1, 2]]
O quinto caso de teste é muito interessante para visualizar .
fonte
Respostas:
MATL , 32 bytes
Experimente online! Ou verifique todos os casos de teste .
Como funciona
A matriz de entrada é preenchida com um quadro de cinco zeros, portanto, por exemplo
torna-se
O quadro de zeros é usado para detectar quando a abelha
incendiáriasaiu da matriz. A extensão com cinco zeros garante que um deslocamento modular de comprimento9
em qualquer direção de qualquer uma das entradas diferentes de zero aterre corretamente em um zero, sem envolver uma entrada diferente de zero.Nas coordenadas da matriz, a abelha começa na entrada
(6,6)
da matriz estendida. Ele lê essa entrada e atualiza as coordenadas conforme necessário, aplicando um deslocamento (modular) do comprimento da leitura na direção correspondente. Isso é repetido em um loop até que o valor de leitura seja0
. A entrada que foi lida antes dessa (ou seja, a última entrada diferente de zero) é a saída.As coordenadas são realmente armazenadas como um número complexo, por exemplo,
(6,6)
se tornam6+6j
. Dessa maneira, as quatro direções cíclicas podem ser percebidas como potências da unidade imaginária. A energia correspondente (j
,1
,-j
ou-1
) é multiplicado pela entrada de leitura para obter o deslocamento complexo, que é usado para actualização das coordenadas.Os valores lidos sucessivamente são mantidos na pilha. Quando o loop é encerrado, a pilha contém todos os valores de leitura diferentes de zero em ordem e, em seguida, o último valor de leitura, que é
0
as coordenadas complexas mais recentes. Portanto, o terceiro elemento superior é a saída necessária.fonte
JavaScript (ES6),
7068 bytesExperimente online!
Comentado
Dado que o sinal do módulo em JS é o do dividendo, a direção é atualizada da seguinte maneira:
fonte
Carvão ,
2518 bytesExperimente online! Link é a versão detalhada do código. Explicação:
Imprima a sequência de entrada, mas não mova a posição de impressão.
Gire o pivô para a esquerda, para que a direção da impressão esteja agora para cima.
Repita enquanto houver um caractere na posição de impressão.
Salve o caractere em uma variável.
Transmita o caractere para um número e imprima muitas linhas novas. Como a direção da impressão agora está alta, isso acaba sendo impresso horizontalmente. O resultado é que movemos a posição de impressão na direção desejada pela quantidade fornecida pelo número sob a posição de impressão.
Gire o pivô para que as próximas novas linhas movam a posição de impressão na próxima direção no sentido horário para a próxima passagem do loop.
Infelizmente ainda temos a entrada bagunçando nossa tela, e ainda mais, se limparmos a tela, também limparemos nossa variável. Então, isso é um truque: uma lista da string vazia e da variável é repetida. Na primeira passagem do loop, a variável loop está vazia; portanto, a tela e a variável loop e a variável result são todas limpas. Mas o ciclo não está terminado! Na segunda passagem do loop, ainda conseguimos acessar nossa variável cuidadosamente preservada em nossa lista de loop. Resta simplesmente imprimi-lo.Limpe a tela e imprima a variável salva. (Obrigado a @ ASCII-only pela correção para Charcoal.)
fonte
Python 2 ,
8584 bytesExperimente online!
Dica o chapéu para o Sr. Xcoder por 1 byte.
fonte
Carvão ,
504946343326 bytesExperimente online
O link é para a versão detalhada do código
A entrada deve ser N em sua própria linha, depois as linhas da matriz em linhas separadas.
Quaisquer maneiras de eliminar bytes são bem-vindas e desejadas, pois eu não sou um bom jogador de golfe em Carvão!
-12 bytes graças a @Neil! -1 byte graças a @ ASCII-only! -7 bytes graças a @ ASCII-only (mudou um bug que fazia as
Clear
variáveis de redefinição)fonte
Vermelho , 145 bytes
Experimente online!
Mais legível:
fonte
Perl 6 , 62 bytes
Experimente online!
Toma a matriz como lista plana e largura.
fonte
Limpo , 141 bytes
Experimente online!
Define a função
? :: {#{#Int}} -> Int
, obtendo uma matriz sem caixa de matrizes sem caixa de números inteiros e retornando o resultado.fonte
Java 8, 121 bytes
Experimente online.
Alternativa com a mesma contagem de bytes de 121 bytes :
Usa try-finalmente em vez de verificar se o
x,y
-coordinate ainda está dentro dos limites.Experimente online.
Explicação:
fonte
Perl 5 , 92 bytes
Experimente online!
Quão?
O conjunto de mapas aninhados e a junção produzem isso:
que é então avaliado para determinar se o loop termina. Como o booleano é avaliado da esquerda para a direita, o valor
$n
realmente muda (até) quatro vezes durante a avaliação. Como a lógica booleana causa um curto-circuito no Perl, o valor de$n
é a canção de ninar quando o loop é encerrado.fonte
Python 3 ,
8584 bytesxcoder: -1 (nunca me lembro do truque + ~)
Experimente online!
Em vez de se mover em direções diferentes (E, S, W, N), essa solução sempre se move para o leste e gira a grade no sentido anti-horário após cada movimento. Após a rotação, qual foi a última coluna agora é a primeira linha; portanto, se o índice da linha for menor que zero, significa que fugimos do quadro.
fonte
-d-1
=>+~d
Retina , 161 bytes
Experimente online!
fonte