Un concurso simple, inspirado en esta pregunta de stackoverflow :
Se le da una imagen de una superficie fotografiada por un satélite. La imagen es un mapa de bits donde el agua está marcada con '
.
' y la tierra está marcada con '*
'. Grupos de adyacentes*
forman una isla. (Dos '*
' son adyacentes si son vecinos horizontales, verticales o diagonales). Su tarea es imprimir el número de islas en el mapa de bits.
Un single *
también cuenta como una isla.
Entrada de muestra:
.........**
**......***
...........
...*.......
*........*.
*.........*
Salida de muestra:
5
El ganador es la entrada con el menor número de bytes en el código.
*
isla solitaria*
también son islas.Respuestas:
Mathematica
188 185 170 115 130 4648 caracteresExplicación
En versiones anteriores, hice un gráfico de posiciones que tenían una distancia del tablero de ajedrez de 1 entre sí.
GraphComponents
Luego reveló el número de islas, una por componente.La versión actual usa
MorphologicalComponents
para encontrar y numerar grupos de unos en la matriz - regiones donde1
están físicamente contiguas. Debido a que las gráficas son innecesarias, esto resulta en una gran economía de código.Código
Ejemplo
5 5
Cómo funciona
Los datos se ingresan como una matriz; en Mathematica, esta es una lista de listas.
En la matriz de entrada, los datos se convierten en
1
'sy0
' s por el reemplazodonde
/.
es una forma infija deReplaceAll
seguida por reglas de reemplazo. Básicamente, esto convierte la matriz en una imagen en blanco y negro. Todo lo que necesitamos hacer es aplicar la funciónImage
,.Los cuadrados blancos corresponden a las celdas que tienen el valor, 1.
La siguiente imagen muestra algunos pasos que utiliza el enfoque. La matriz de entrada contiene solo
1
'sy0
' s. La matriz de salida etiqueta cada grupo morfológico con un número. (Empaqueté las matrices de entrada y salidaMatrixForm
para resaltar su estructura bidimensional).MorphologicalComponents
reemplaza1
s con un número entero correspondiente al número de clúster de cada celda.Max
devuelve el número de clúster más grande.Viendo las islas
Colorize
coloreará cada isla de manera única.fuente
MorphologicalComponents
quiere unImage
, pero incluso en v9 ¿no debería ser asíMax@MorphologicalComponents[d/.{"."->0,"*"->1}]
? Es decir, ¿el reemplazo se realiza primero?Max
desaparecería antes de que se realizara el reemplazo, ¿no?Max@MorphologicalComponents@d/.{"."->0,"*"->1}
no funciona, lo que tiene sentido esMax@MorphologicalComponents[d /. {"." -> 0, "*" -> 1}]
, así que tienes un personaje más.Ruby 1.9 (
134121113110)Toma el mapa en stdin o el nombre del archivo del mapa como el primer argumento de línea de comando e imprime el número de islas para stdout. Usando un relleno de inundación recursivo básico. ¡Las mejoras son bienvenidas como siempre!
Al igual que el color de David, también puede hacer que muestre las diferentes islas cambiando
$_[i]=?.
a$_[i]=c.to_s
yp c
haciaputs$_
, lo que le daría algo como esto:(¡al menos hasta que te quedes sin dígitos!)
Algunos casos de prueba:
5 5
9 9
1
2
3
fuente
C, 169 caracteres
Lee el mapa de stdin. No tuve suerte de mejorar la función de relleno de inundación recursiva,
r(j)
aunque parece que podría ser.fuente
Python 2,
223203 bytes¡Gracias a Step Hen y Arnold Palmer por eliminar 20 caracteres de espacios y paréntesis innecesarios!
Pensé que usar las comprensiones de listas podría disminuir el número de bytes, pero no proporcionó ninguna mejora significativa.
Pruébalo aquí.
Sigo intentando recortarlo alrededor de la lista n (vecinos), pero no he tenido éxito. Quizás alguien más tenga algunas ideas para esa sección.
fuente
(s.index(l),i)
yfor
,enumerate(l)
yif
,-v[0])<2
yand
,p=0:
yp
, ybool(x&n[p])
yelse
. También tiene más paréntesis de los necesarios en su declaración impresa, ya que tiene 2 grupos alrededorset
. Editar: Beat by StepHen porque hacer cosas en dispositivos móviles no es ideal.Perl 5 , 100 bytes
98 bytes de código + 2 bytes para
-p0
banderas.Pruébalo en línea!
Una adaptación (o más bien una simplificación) de mi respuesta al desafío ¿Cuántos agujeros? . Puede encontrar explicaciones de cómo funciona este código en esta otra respuesta (es un poco largo de explicar, por lo que prefiero no volver a escribir las explicaciones completas).
fuente
Python 2, 233 bytes
Demasiado largo, en comparación con otras respuestas. Puerto de mi respuesta a esta pregunta .
Pruébalo en línea
fuente
JavaScript, 158 bytes
Respuesta ES6 no competitiva (desafío de fechas posteriores al idioma) para 132 bytes:
Puerto de mi respuesta a ¿Cuántos agujeros? (Sí, estoy subiendo al carro, ahora que he visto a otras dos personas portar sus respuestas).
fuente
Python 2 , 225 bytes
Pruébalo en línea!
fuente