En este desafío, se te da un mapa de un terreno bidimensional, visto desde un lado. Desafortunadamente, algunas partes del terreno están flotando en el aire, lo que significa que se derrumbarán. Su trabajo es predecir dónde aterrizan.
La entrada
Su entrada es una o más cadenas separadas por una nueva línea de igual longitud, que contiene solo los caracteres #
(un signo de número, que significa una roca) o .
(un punto, que significa espacio vacío).
La salida
Su salida tiene el mismo formato que la entrada, pero con la siguiente modificación. Veamos la cadena de entrada como una cuadrícula de rocas bidimensional. Cada roca en la entrada que está conectada al fondo de la cuadrícula por un camino de rocas adyacentes es firme ; Otras rocas están sueltas . Las rocas adyacentes en diagonal no se consideran adyacentes. Todas las rocas sueltas caerán hacia abajo y terminarán como una pila encima de una roca firme o en la fila inferior. Las rocas sueltas no están unidas entre sí, por lo que caen individualmente, no como formaciones grandes. La salida es la cuadrícula resultante.
Ejemplos
La entrada
..###. .##.#. .#.... .##.#.
no contiene rocas sueltas, por lo que la salida es idéntica.
La entrada
...#.. .#..#. .#..## .#...# .##### .#...#
contiene una roca suelta en la parte superior, que cae sobre la roca firme debajo de ella. La salida es
...... .#..#. .#..## .#.#.# .##### .#...#
La entrada
.#####.... .#....#### ###.###..# #.#...##.. .####..#.# ......###. ..#...#..# ..#...#..#
tiene un gran grupo de rocas sueltas a la izquierda. El grupo se descompone a medida que caen las rocas, por lo que la salida es
.......... ....###### ..#.###..# . #...##.. .##....#.. .##...#### ####..#..# #####.#..#
Aclaraciones
- Puede tomar la entrada de STDIN y la salida a STDOUT, o escribir una función.
- Este es el código de golf, por lo que el programa más corto (en bytes) es el ganador.
- Las lagunas estándar no están permitidas.
Respuestas:
CJam,
180 ...133101... 94 9087 bytesDefinitivamente hay muchos campos de golf posibles, pero quería publicarlo primero después de que funcionara por completo.Toma la cuadrícula de rocas (compuesta
.
y#
sin una nueva línea final) de STDIN e imprime la salida en STDOUTACTUALIZACIÓN : Uso de un relleno de inundación parcial ineficiente pero más corto para descubrir rocas firmes.
ACTUALIZACIÓN 2 : Cambió el algoritmo para hacer que las rocas caigan. Mucho más corto ahora!
ACTUALIZACIÓN 3 : ¡Hice varias pequeñas optimizaciones y al final pude reducir el conteo de bytes a la mitad del código original!
Cómo funciona :
Para el relleno, iteramos a través de toda la longitud de la cuadrícula (cuadrícula) veces. En cada iteración, tenemos la garantía de convertir al menos 1
#
que está tocando directamente un espacio en(espacio). El espacio aquí representa un grupo de rock firme. Por lo tanto, al final de las iteraciones de longitud (cuadrícula), tenemos la garantía de tener todas las rocas firmes representadas por espacios.
Pruébalo en línea aquí
fuente
Perl 5: 98
98 incluyendo 2 banderas de línea de comando.
Explicación:
fuente
JavaScript (ES6) 232
Como una función con un parámetro de cadena y devolviendo una cadena.
Al principio, agregue una fila inferior de '1' para identificar la línea de tierra.
El primer ciclo busca las rocas fijas (que están cerca de un '1') y también las marca como '1'. La búsqueda se repite hasta que no se encuentren más rocas firmes.
El segundo bucle mueve los caracteres '#' restantes hacia la fila inferior. Nuevamente, esto se repite hasta que no se pueda mover la roca.
Por último, reemplace el '1' con '#' nuevamente y corte la fila inferior.
Menos golf
Prueba (puede tener evidencia de qué rocas son firmes y qué han caído)
fuente
APL,
130119Como no es posible (hasta donde yo sé) ingresar nuevas líneas cuando se solicita la entrada, este programa toma una matriz de caracteres como entrada.
El algoritmo usado es primero convirtiendo a una matriz binaria (
0
es aire y1
es roca) luego inundar el llenado de la fila inferior para marcar rocas firmes como2
. Luego divida cada columna en "espacios entre rocas firmes" y clasifique cada partición para hacer que la roca suelta "caiga" por el aire.Edit1: Golfed algunos utilizando un algoritmo de relleno de inundación diferente
Pruebas de funcionamiento
Correr 1
Define una matriz de caracteres
A
y la imprime:Luego alimente
A
el programa:Correr 2
fuente
JS - 443 bytes
Las inundaciones llenan las rocas del fondo y luego las derriban. Utiliza mucha recursividad con el relleno de inundación, por lo que puede retrasar un poco su navegador.
Es una función: llámalo con
g("input")
JSFiddle: http://jsfiddle.net/mh66xge6/1/
JSFiddle sin golf: http://jsfiddle.net/mh66xge6/
fuente
Python 3, 364 bytes
Estoy seguro de que se podría sacar más de esto ... pero nunca va a competir con CJam y Perl de todos modos.
Similar a otras respuestas. Una peculiaridad es que primero pone la cuadrícula al revés (para que los índices de bucle sean más convenientes) y agrega una fila y columna adicionales de
.
(para evitar problemas con los-1
índices de ajuste). Ejecutar llamandoP(string)
.fuente