Mapas de calor
Considere una habitación rectangular, en cuyo techo tenemos una cámara térmica apuntando hacia abajo. En la habitación, hay algunas fuentes de intensidad de calor1-9
, siendo la temperatura de fondo 0
. El calor se disipa de cada fuente, cayendo en una unidad por paso (no diagonal). Por ejemplo, la 20x10
sala
...........1........
....................
...8................
..5...............2.
....................
.1..................
................1...
.................65.
....................
............2.......
contiene 9 fuentes de calor, y el gradiente de temperatura que muestra la cámara térmica es
34565432100100000000
45676543210000000000
56787654321000000110
45676543210000001221
34565432100000012321
23454321000000123432
12343210000001234543
01232100000012345654
00121000000011234543
00010000000121123432
En forma gráfica, esto podría verse así:
A partir del gradiente, podemos inferir las posiciones e intensidades de algunas fuentes de calor, pero no todas. Por ejemplo, todos los 9
s siempre se pueden inferir, ya que tienen la temperatura máxima, y también pueden hacerlo 8
en este caso, ya que produce un máximo local en el gradiente. El 2
borde cercano a la derecha también se puede inferir, aunque no esté en un máximo local, ya que no tiene otro 2
como vecino. Los 5
s, por otro lado, no se infieren, ya que su calor también podría ser producido por las fuentes más intensas cercanas a ellos. Los 0
son conocidos s para contener no hay fuentes de calor, pero todos los otros azulejos pueden potencialmente contener uno. Denotemos los mosaicos inciertos por guiones-
, ciertas fuentes de calor por los dígitos correspondientes y cierto espacio vacío por períodos .
:
---------..1........
----------..........
---8-------......--.
----------......--2-
---------......-----
--------......------
-------......-------
.-----......-----6--
..---.......--------
...-.......-2-------
Su tarea será producir este patrón inferido a partir del gradiente de temperatura.
Reglas
Se le da la entrada como una cadena delimitada por líneas nuevas o tuberías verticales |
, lo que sea más conveniente, y la salida será de la misma forma. Puede haber un delimitador final en la entrada y / o salida, pero ninguno precedente. El tamaño de la entrada puede variar, pero su ancho y alto siempre son al menos 4
. Ambas funciones y programas completos son aceptables. El conteo de bytes más bajo gana, y las lagunas estándar están prohibidas.
Casos de prueba adicionales
Entrada:
898778765432100
787667654321100
677656543211210
678765432112321
567654321123210
que se ve así en forma gráfica:
Salida:
-9---8-------..
-------------..
--------------.
--8---------3--
-----------3--.
Entrada:
7898
8787
7676
6565
Salida:
--9-
8---
----
----
Entrada:
00001
00000
00000
10000
Salida:
....1
.....
.....
1....
Respuestas:
CJam,
73 69 6255 bytesACTUALIZACIÓN : Nuevo algoritmo. Menor y mayor margen de mejora
Cómo funciona
La lógica es similar al algoritmo a continuación, pero aquí no estoy verificando los 4 vecinos en una sola iteración. En cambio, utilizo un enfoque más pequeño para recorrer en iteración todas las filas y columnas en ambas direcciones. Aquí están los pasos involucrados:
.
o-
.Aquí hay un ejemplo ejecutado en una pequeña entrada:
Después del primer paso:
Después del segundo paso:
Después de la última asignación a un solo carácter, salida final:
Explicación del código :
Pruébalo aquí
Enfoque anterior
Cómo funciona
La lógica es simple, iterar a través de la cuadrícula y ver si el valor actual es mayor o igual a los cuatro vecinos restantes: arriba, abajo, izquierda y derecha. Luego, transforme el valor actual según la regla anterior y si el valor es igual a 0, hágalo "." .
Explicación del código
Pruébalo en línea aquí
fuente
JavaScript (ES6) 99
Prueba en la consola Firefox / FireBug
Salida
fuente
Python 2: 154 bytes
La entrada tiene que ser de la forma
"00001\n00000\n00000\n10000"
.La conversión de una cadena a una matriz 2D es bastante larga en Python. Así que mantengo el formato de cadena original. Enumero sobre la entrada,
i
es el índice,v
es el carácter (¡Finalmente enumero los bytes guardados en una solución de golf!). Para cada par(i,v)
calculo el carácter correcto de salida, y los uno. ¿Cómo elijo el carácter de salida correcto? Siv == '\n'
, el carácter de salida es\n
, itv == '0'
, que el carácter de salida es'.'
. De lo contrario, pruebo los 4 vecinos dev
, que estánb[i-b.index('\n')-1]
(arriba),b[i-1]
(izquierda,b[i+1]
(derecha) yb[i+b.index('\n')+1]
(debajo), si lo están,<= v
y elijo el carácter'-'
ov
. Aquí estoy comparando los caracteres, no los números, pero funciona bastante bien, porque los valores ascii están en el orden correcto. Además, no hay problemas, sib[i-1]
ob[i+1]
igual'\n'
, porqueord('\n') = 10
.Pyth:
6158Más o menos una traducción del script Python. Bastante feo ;-)
Pruébelo en línea: Pyth Compiler / Executor El mismo formato de entrada que la solución Python.
fuente
Perl,
77, 75, 7270Trucos de coincidencia de expresiones regulares 2d estándar.
Ejemplo:
Pruébalo aquí
fuente
Java,
307,304,303,299298Este es sin duda un desafío "perfecto" para algunos codegolf de Java :)
Entrada (método de tubería '|'):
Salida:
fuente
char[]r=a[0].replace("|", <--here"").toCharArray()
.APL, 92
Ejemplo:
fuente
Rubí 140
Nada especial; solo recorra el mapa y compare el valor actual con el valor de los cuatro vecinos.
Ejecútelo en línea con pruebas: http://ideone.com/AQkOSY
fuente
R, 223
Sobre lo mejor que puedo encontrar en este momento. Tratar con la cuerda es bastante costoso. Creo que hay margen de mejora, pero no puedo verlo en este momento.
Resultado de la prueba
fuente
J - 69 bytes
Ejemplos:
PD:
(0 : 0)
es la forma J estándar de especificar cadenas. También podría usar|
cadenas delimitadas (con un final|
).fuente
Excel VBA - 426
Será una rara ocasión en que VBA gane cualquier código de juegos de golf, pero como es lo que más uso, es divertido jugar con él. La primera línea es un caso extremo que hizo que esto fuera más largo de lo que parece que debería ser.
El recuento no incluye el espacio en blanco de la línea inicial.
Jugué con la idea de enviar la entrada a una hoja y trabajar desde allí, pero creo que el bucle de la cadena aprobada carácter por carácter guarda el código.
Llamar desde la ventana inmediata:
Salida (en una ventana):
fuente
Perl - 226
Puedes probarlo en ideone . Si alguien está interesado en una explicación, hágamelo saber.
fuente
Haskell - 193
f
es una función que toma una cadena en el formulario0001\n0000\n0000\n1000
y devuelve la cadena requerida.g
es una función que toma una lista de listas de caracteres y devuelve una lista de listas de ((izquierda, arriba), esto, (derecha, abajo)).fuente