El escenario
Conduzco por un camino con mi auto y comienza a llover. Las gotas de lluvia caen al azar en mi ventana y ahora me pregunto, ¿dónde está la mayor área húmeda conectada?
La tarea
Para hacerlo más fácil, la ventana se divide en una matriz de 10 * 10 cuadrados. Su trabajo es encontrar la mayor área de caída de agua conectada en la ventana.
Entrada
Hay dos entradas posibles, puede usar una matriz bidimensional o una unidimensional. Puede elegir entre entradas como stdin, etc.
Ejemplo:
// 2-dimensional:
[[0,1,0,0,0,0,1,0,0,0],
[0,1,1,0,0,0,0,1,1,0],
[0,1,1,0,0,0,0,1,0,0],
[0,1,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,1,0],
[0,0,0,1,1,0,0,0,1,0],
[0,0,0,1,1,0,0,0,1,0],
[0,0,0,0,0,1,1,0,1,0],
[0,0,0,0,0,1,1,0,1,0],
[0,0,0,0,0,0,0,0,0,0]]
// 1-dimensional
[0,1,0,0,0,0,1,0,0,0,
0,1,1,0,0,0,0,1,1,0,
0,1,1,0,0,0,0,1,0,0,
0,1,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,1,0,
0,0,0,1,1,0,0,0,1,0,
0,0,0,1,1,0,0,0,1,0,
0,0,0,0,0,1,1,0,1,0,
0,0,0,0,0,1,1,0,1,0,
0,0,0,0,0,0,0,0,0,0]
Salida
Su código debe incluir el tamaño del área conectada más grande y las coordenadas x e y de las gotas de agua que pertenecen a esta área en el formato
"Tamaño: Coordenadas Z: (X1, Y1) (X2, Y2) .. ".
Ejemplo para la entrada anterior:
Size: 6 Coordinates: (1,0) (1,1) (2,1) (1,2) (2,2) (1,3)
El orden de las coordenadas no importa.
Reglas
- Las gotas de agua están conectadas, si se tocan entre sí ortogonalmente
- Las conexiones diagonales no cuentan
- Puede haber muchas áreas y su código tiene que encontrar la más grande
- Un campo vacío se representa como "0" y un campo húmedo como "1"
- Publique su solución con una breve explicación y la salida de la entrada anterior
- El código más corto dentro de los próximos 7 días ganará
- Si hay dos áreas con el mismo tamaño, puede elegir una
Respuestas:
Ruby, 171 caracteres
Entrada a través del parámetro de línea de comando como matriz unidimensional.
Salida para la entrada de muestra:
Size: 6 Coordinates: (1,0) (1,1) (1,2) (1,3) (2,2) (2,1)
Esta respuesta utiliza un enfoque simple de relleno de inundación, construyendo una lista de coordenadas para cada grupo de gotas de lluvia. La mayor parte del código se usa realmente para la verificación de límites y E / S.
fuente
Python - 192
Entrada (pegar antes del código):
Gracias Calvin's Hobbies por las ediciones sugeridas.
fuente
map(f,range(100))
lugar de[f(i)for i in range(100)]
guardar 8 caracteres. También creo que sus coordenadas son (y, x) no (x, y).C # -
548523522511503476(menos de 500 ... sí)
Estoy seguro de que hay mucho margen de mejora.
La forma en que ingresé los datos fue inicializar una matriz. No incluí esa matriz en el puntaje (si crees que esto es una trampa, puedo cambiar el código, pero agregará relativamente mucho código porque C # no es excelente para analizar matrices)
Pruébelo en http://ideone.com/UCVCPM
Nota: La versión actual no funciona en ideone porque no le gusta
using l=System.Collections...
, por lo que la versión de ideone está un poco desactualizada (y es más larga)Cómo funciona
Básicamente verifica si hay un
1
. Si encuentra uno, se utiliza el algoritmo de relleno por inundación para reemplazar todos los adyacentes1
's con0
y añade las coordenadas reemplazados a una lista temporal. A continuación se compara la lista de arriba (m
) a la lista temporal (t
) y se ponem
at
sit
contiene más elementos.fuente
Mathematica - 180 bytes
Esta función toma una matriz bidimensional.
Golfed
Bonito
Ejemplo
La salida es ligeramente anómala. Mathematica comienza a indexar en 1 en lugar de 0, y lo usa
{}
para indicar la posición. Agregue 2 bytes (-1
) si las posiciones deben estar indexadas en 0. Agregue muchos bytes si necesitan usar en()
lugar de{}
:(Explicación
f
es una función dex
. Se definec
como una transformación dex
, donde cada (i, j) ahora es igual a un número entero correspondiente al componente conectado al que pertenece. Implica el trabajo principal:Luego
m
calcula cuántos elementos hay en cada componente, los ordena por ese número y toma el último resultado (es decir, con la mayoría de los elementos). La última línea imprime el recuento y las posiciones enc
el índice contenido enm
.fuente
Haskell, 246
Entrada
Dos dimensiones y pegar antes del código como
g
, por ejemplo:Sin golf
fuente
C # 374 función de bytes
Esta es una versión muy modificada de mi respuesta a ¿Estás en la sala más grande? . Toma una matriz unidimensional de entradas y devuelve una cadena en el estilo requerido. Funciona construyendo conjuntos disjuntos a partir de la entrada (primer bucle), calculando el tamaño de cada conjunto y encontrando el conjunto más grande (segundo bucle) y luego agregando las celdas de ese conjunto a una cadena de salida (tercer bucle) que luego se devuelve .
Menos golf (y con código de prueba):
fuente
JavaScript (EcmaScript 6) 183
189Una función con entrada de matriz y valor de retorno de cadena. Si se necesita una salida real (no está claro para mí) agregue 7 bytes para 'alert ()'.
Prueba de salida
Más legible
Explicación
Obtenga una matriz de una sola dimensión y un parámetro opcional con el tamaño de una fila. La función también funciona con diferentes dimensiones de matriz, incluso x! = Y.
Pseudocódigo:
fuente
JavaScript, 273
La función toma una matriz y devuelve una cadena. Mi primer intento fue de ~ 500 caracteres y no usé Flood Fill. Este sí. Estoy aprendiendo JavaScript, por lo que cualquier sugerencia sería apreciada.
Esta función recorre la matriz de entrada y por cada 1 encontrado comienza allí y cambia todos los conectados a 1s a 0 usando la función Rellenar. Al hacerlo, recuerda el blob con más 1s. La función Rellenar cambia la posición actual a 0 y luego se llama a sí misma en la posición superior, a la derecha, debajo y a la izquierda.
Prueba aquí: http://goo.gl/9Hz5OH
Código legible
fuente
Scala, 420
Hola, mi entrada toma una matriz 2d como a
List[List[Int]]
, devuelve unString
Explicación
Dada una ventana como a
List[List[Int]]
, primero encontramos cada "1" y guardamos las coordenadas en una lista. Luego convertimos esa lista en unaMap
de las coordenadas de cada "1" a una lista de las coordenadas de cada "1" adyacente. Luego use el mapa de adyacencia para vincular de forma transitiva los sub-blobs en blobs, y finalmente devolveremos el blob más grande (e ignorando los blobs duplicados ya que el orden de las coordenadas devueltas no importa).Más legible
La crítica es muy apreciada.
fuente