Vamos definir uma matriz de 9s como:
Vamos definir um número explodindo como um número na posição que pode ser decomposto em números inteiros iguais entre todos os seus vizinhos adjacentes (incluindo a si próprio) e o valor absoluto de cada parte é maior que 0.
A partir da matriz anterior, vamos explodir o número na posição (0 indexado)
Às vezes, a decomposição resulta em um número racional maior que 1. Isso é algo que precisamos evitar ao explodir números. Nesse caso, o restante será atribuído ao número explodido.
Para demonstrá-lo, vamos continuar trabalhando com nossa matriz anterior. Desta vez, explodiremos o número na posição
Aqui temos 3 neightbors e o próprio número. Aqui, a equação é algo como que nos dão 2 para cada um e 2 como restante.
Além disso, às vezes um número não será grande o suficiente para ser decomposto em partes iguais (onde o abs é maior que 0) entre seus vizinhos (| número racional | <1). Nesses casos, precisamos "emprestar" do número explodido para manter a condição "maior que 0" . Vamos continuar com o exemplo anterior e explodir o número na posição .
O desafio é que, dada uma lista de posições e uma matriz finita não vazia de números naturais, retorne a forma explodida após a explosão de cada número da lista de posições.
Casos de teste
Entrada: initial matrix: [[3, 3, 3], [3, 3, 3], [3, 3, 3]], numbers: [[0,0],[0,1],[0,2]]
Saída: [[1, 0, 1], [5, 6, 5], [3, 3, 3]]
Entrada: Initial matrix: [[9, 8, 7], [8, 9, 7], [8, 7, 9]], numbers: [[0,0],[1,1],[2,2]]
Saída: [[4, 11, 8],[11, 5, 10],[9, 10, 4]]
Entrada: Initial matrix: [[0, 0], [0, 0]], numbers: [[0,0],[0,0],[0,0]]
Saída: [[-9, 3],[3, 3]]
Entrada: Initial Matrix: [[10, 20, 30],[30, 20, 10],[40, 50, 60]], numbers: [[0,2],[2,0],[1,1],[1,0]]
Saída: [[21, 38, 13], [9, 12, 21], [21, 71, 64]]
Entrada: Initial Matrix: [[1]], numbers: [[0,0]]
Saída: [[1]]
Entrada: Initial Matrix: [[1, 2, 3]], numbers: [[0,0], [0, 1]]
Saída: [[1, 1, 4]]
Notas
Você pode assumir que a matriz de entrada nunca estará vazia
Você pode assumir que as coordenadas sempre serão válidas
A coordenada de entrada nos casos de teste é fornecida como (linha, coluna). Se você precisar que seja (x, y), poderá trocar os valores. Em caso afirmativo, indique que em sua resposta
Respostas:
C (GCC)
220216214212 bytescrédito para @ceilingcat por 2 bytes
Execute aqui
uma versão um pouco menos golfe
O código de chamada com um exemplo
e a saída
fonte
JavaScript (ES7),
126 125 123121 bytesGuardado 2 bytes graças a @Shaggy
Toma entrada como
(matrix)(list)
. Saídas modificando a matriz.Experimente online!
Quão?
Em vez disso, usamos uma função recursiva que executa um fluxo de operações mais simples, repetido quantas vezes for necessário:
O principal benefício é que precisamos apenas de um loop sobre a matriz. O segundo benefício é que não precisamos calcular nenhum quociente.
Exemplo
Após a etapa 1 da primeira iteração , temos:
E após a etapa 2 da primeira iteração :
Após a etapa 1 da segunda iteração , temos:
E após a etapa 2 da segunda iteração :
Agora, incrementamos a célula de referência duas vezes ( etapa 4 de ambas as iterações ), levando ao resultado final:
Comentado
fonte
(0)
por 2 backticks.R ,
163162161159155146 bytesExperimente online!
Explicação
(Corresponde a uma versão anterior do código)
fonte
Limpo ,
181167 bytesExperimente online!
Na forma de uma função parcialmente aplicada literal.
Expandido (primeira versão):
fonte
Ferrugem - 295 bytes
Isso é muito longo devido ao Rust exigir indexação de números inteiros não assinados, mas exigir que números inteiros assinados realizem subtrações, resultando em negativos. No entanto, acredito que meu algoritmo é o "algoritmo mais curto" até agora. Na verdade, não há necessidade de lidar com a detecção de bordas, fundo, etc.
Observe três coisas: uma, a soma de todas as células é sempre constante. Segundo, essa é uma situação de divisão / restante, para que possamos aplicar o pensamento no estilo do algoritmo de Bresenham. Terceiro, a pergunta sempre adiciona o mesmo número a todas as células a uma certa distância da célula de posição especial, antes de lidar com o material "extra" na posição especial.
Algoritmo:
Armazene o valor original da célula na posição P em M.
Iniciar loop:
Itere sobre cada célula I na matriz. Se a posição da célula I estiver a 3 Quadrance (distância ao quadrado) da posição P, subtraia 1 da célula P e adicione 1 à célula I. Conte quantas vezes isso é feito em uma iteração na matriz.
Se o valor restante na célula na posição P for menor ou igual a M / Count + M modulo Count, interrompa o loop. Caso contrário, execute o loop novamente.
A matriz resultante será a versão explodida. Contar é basicamente uma maneira de contar vizinhos sem lidar com arestas. Looping é uma maneira de decompor o material de divisão / adição em uma adição / subtração única e repetida de um. A verificação do módulo garante que teremos o restante apropriado na posição P para lidar com as 'explosões' que não são igualmente divisíveis entre os vizinhos. A estrutura do loop do / while permite que P <0 funcione corretamente.
Versão não destruída no Rust Playground
fonte
f
faria. Mas você provavelmente poderia salvar ainda mais bytes usando uma função anônima:|p:(i8,i8),v:&mut Vec<Vec<i8>>|{...}
Java 10,
194193191190184182171 bytesPorta iterativa da resposta JavaScript de @Arnauld .
-17 bytes graças a @Arnauld .
Modifica a matriz de entrada em vez de retornar uma nova para salvar bytes.
Experimente online.
Explicação:
fonte
m[y]
m[y][x]
undefined[x]
que falharia. De qualquer forma, seu(x-X)**2+(y-Y)**2<3
cheque é bastante inteligente. É preciso lembrar que quando eu quiser verificar valores em uma matriz em um bloco 3x3 (e dentro dos limites) ao seu redor. Eu acho que realmente tenho algumas respostas como essa, onde agora uso o try-catch e, em um caso, o try-finalmente.Lisp comum , 498 bytes
Experimente online!
Use esta função como
(print (c #2A((3 3 3) (3 3 3) (3 3 3)) '((0 0)(0 1)(0 2))))
Versão melhor legível:
Exemplo de saída:
fonte
Python 2 , 171 bytes
Experimente online!
fonte