Heatmaps
Considere uma sala retangular, em cujo teto temos uma câmera térmica apontando para baixo. Na sala, há um certo número de fontes de calor de intensidade 1-9
, sendo a temperatura de fundo 0
. O calor se dissipa de cada fonte, diminuindo uma unidade por etapa (não diagonal). Por exemplo, a 20x10
sala
...........1........
....................
...8................
..5...............2.
....................
.1..................
................1...
.................65.
....................
............2.......
contém 9 fontes de calor, e o gradiente de temperatura mostrado pela câmera térmica é
34565432100100000000
45676543210000000000
56787654321000000110
45676543210000001221
34565432100000012321
23454321000000123432
12343210000001234543
01232100000012345654
00121000000011234543
00010000000121123432
Em forma gráfica, isso pode se parecer com:
A partir do gradiente, podemos inferir as posições e intensidades de algumas fontes de calor, mas não todas. Por exemplo, todos os 9
s sempre podem ser inferidos, uma vez que possuem a temperatura máxima, e o mesmo pode 8
ocorrer neste caso, pois produz um máximo local no gradiente. A 2
borda próxima à direita também pode ser inferida, mesmo que não esteja no máximo local, pois não possui outra 2
como vizinha. Os 5
s, por outro lado, não são inferidos, pois seu calor também pode ser produzido pelas fontes mais intensas próximas a eles. Os 0
s são conhecidos por conter nenhuma fonte de calor, mas todas as outras peças podem potencialmente conter um. Vamos denotar os azulejos incertos por hífens-
, determinadas fontes de calor pelos dígitos correspondentes e certo espaço vazio por períodos .
:
---------..1........
----------..........
---8-------......--.
----------......--2-
---------......-----
--------......------
-------......-------
.-----......-----6--
..---.......--------
...-.......-2-------
Sua tarefa será produzir esse padrão inferido a partir do gradiente de temperatura.
Regras
Você recebe a entrada como uma sequência delimitada por novas linhas ou tubos verticais |
, o que for mais conveniente, e a saída deve ter a mesma forma. Pode haver um delimitador à direita na entrada e / ou saída, mas nenhum precedente. O tamanho da entrada pode variar, mas sua largura e altura são sempre pelo menos 4
. Ambas as funções e programas completos são aceitáveis. A contagem de bytes mais baixa vence e as brechas padrão são proibidas.
Casos de teste adicionais
Entrada:
898778765432100
787667654321100
677656543211210
678765432112321
567654321123210
que se parece com isso na forma gráfica:
Saída:
-9---8-------..
-------------..
--------------.
--8---------3--
-----------3--.
Entrada:
7898
8787
7676
6565
Saída:
--9-
8---
----
----
Entrada:
00001
00000
00000
10000
Saída:
....1
.....
.....
1....
Respostas:
CJam,
73 69 6255 bytesUPDATE : Novo algoritmo. Mais curto e mais espaço para melhorias
Como funciona
A lógica é semelhante ao algoritmo abaixo, mas aqui não estou verificando todos os quatro vizinhos em uma única iteração. Em vez disso, uso uma abordagem menor para percorrer todas as linhas e colunas nas duas direções. Aqui estão as etapas envolvidas:
.
ou-
.Aqui está um exemplo executado em uma pequena entrada:
Após o primeiro passo:
Após o segundo passo:
Após o último mapeamento para um caractere, saída final:
Código Explicação :
Experimente aqui
Abordagem mais antiga
Como funciona
A lógica é simples, percorre a grade e verifica se o valor atual é maior ou igual aos quatro vizinhos restantes - cima, baixo, esquerda e direita. Em seguida, transforme o valor atual com base na regra acima e, se o valor for igual a 0, torne-o "." .
Código Explicação
Experimente online aqui
fonte
JavaScript (ES6) 99
Teste no console Firefox / FireBug
Saída
fonte
Python 2: 154 byte
Entrada tem que ser da forma
"00001\n00000\n00000\n10000"
.A conversão de uma string em uma matriz 2D é bastante demorada no Python. Então, eu mantenho o formato da string original. Eu enumero sobre a entrada,
i
é o índice,v
é o caractere (Finalmente enumere os bytes salvos em uma solução de golfe !!). Para cada par(i,v)
, calculo o caractere de saída correto e os uno. Como escolho o caractere de saída correto? Sev == '\n'
, o caractere de saída é\n
, entãov == '0'
, o caractere de saída'.'
. Caso contrário, testo os 4 vizinhos dev
, que sãob[i-b.index('\n')-1]
(acima),b[i-1]
(esquerda,b[i+1]
(direita) eb[i+b.index('\n')+1]
(abaixo), se estiverem,<= v
e escolho o caractere'-'
ouv
. Aqui estou comparando caracteres e não os números, mas funciona muito bem, porque os valores ascii estão na ordem correta. Também não há problemas, seb[i-1]
oub[i+1]
igualar'\n'
, porqueord('\n') = 10
.Pitão:
6158Mais ou menos uma tradução do script Python. Muito feio ;-)
Experimente on-line: Compilador / Executor Pyth Mesmo formato de entrada que a solução Python.
fonte
Perl,
77, 75, 7270Truques de correspondência de regex 2D padrão.
Exemplo:
Experimente aqui
fonte
Java,
307,304,303,299298Este é certamente um desafio "perfeito" para alguns codegolf Java :)
Entrada (método '|' pipe):
Saída:
fonte
char[]r=a[0].replace("|", <--here"").toCharArray()
.APL, 92
Exemplo:
fonte
Ruby 140
Nada especial; basta percorrer o mapa e comparar o valor atual com o valor dos quatro vizinhos.
Execute-o online com testes: http://ideone.com/AQkOSY
fonte
R, 223
Sobre o melhor que posso encontrar no momento. Lidar com a corda é bastante caro. Eu acho que há espaço para melhorias, mas não posso vê-lo no momento
Resultado do teste
fonte
J - 69 bytes
Exemplos:
PS:
(0 : 0)
é a maneira J padrão de especificar strings. Você também pode usar|
cadeias delimitadas (com um final|
).fonte
Excel VBA - 426
Será uma ocasião rara em que o VBA vença qualquer jogo de código de golfe, mas como é o que eu mais uso, é divertido brincar com ele. A primeira linha é um caso de borda que fez isso mais longo do que parece que deveria ser.
A contagem não inclui o espaço em branco da linha inicial.
Eu brinquei com a idéia de enviar a entrada para uma planilha e trabalhar a partir daí, mas acho que o loop da string passada, caractere por caractere, salva o código.
Chamada a partir da janela imediata:
Saída (em uma janela):
fonte
Perl - 226
Você pode experimentá-lo em ideone . Se alguém estiver interessado em uma explicação, me avise.
fonte
Haskell - 193
f
é uma função que pega uma string no formulário0001\n0000\n0000\n1000
e retorna a string necessária.g
é uma função que pega uma lista de listas de caracteres e retorna uma lista de listas de ((esquerda, cima), isto, (direita, baixo)).fonte