Encuentra la costa

14

Su tarea es encontrar la longitud de la costa de un mapa de islas provisto en un mapa ASCII. El mapa de entrada constará de 1 o más #caracteres que indican tierra y espacios que indican agua. Se considera que la costa es cualquier borde entre la tierra y el agua, incluidos los lagos interiores y las islas.

Su solución debe ser un programa completo que lea en un archivo, una cadena o una matriz de cadenas, y genere un solo entero en la pantalla o stdout. Cada línea de entrada puede tener espacio inicial o final, y cero o más caracteres hash. Se supone que los bordes del mapa son espacio (agua).

Las líneas pueden ser de diferentes longitudes.

Ejemplos:

Input:
##
##
Output: 8

Input:
    ###    ###
  #####     #
   ##
Output: 26

Input:
  #####
  #   #
  # # #
  #   #
  #####
Output: 36

Este es el código de golf, por lo que gana el conteo de bytes más pequeño.

Caballero Lógico
fuente
¿Podemos suponer que la entrada se rellena a un rectángulo con espacios?
Martin Ender
¿Por qué un programa completo? Por lo general, las funciones también están permitidas, y no veo una buena razón para que este desafío sea restrictivo.
nimi
@ MartinBüttner, sí. Tenía la esperanza de que "Los bordes del mapa se supone que son espacio (agua)" cubrieron eso. Avísame si debo aclarar eso.
Logic Knight
@nimi, entiendo tu preocupación, pero como el desafío tiene 12 horas, hay 4 respuestas, y otras personas pueden estar trabajando en eso en este momento, soy reacio a cambiarlo.
Logic Knight
@CarpetPython no Me refiero a si podemos suponer que todas las líneas de la entrada tienen la misma longitud.
Martin Ender

Respuestas:

14

Caracoles , 8 bytes

A
\#o!\#

La Aopción significa contar todas las rutas coincidentes en lugar de los puntos de partida desde los que una coincidencia tiene éxito. \#consume a #, ogira en una dirección cardinal y !\#es una afirmación negativa que tiene éxito si no hay una #frente a nosotros.

Feersum
fuente
4

Pyth - 25 23 bytes

Primero rellena la entrada a un rect. Luego cuenta las ocurrencias de " #"más de 4 permutaciones de transposiciones y reversiones de la entrada + espacio.

/ssm_B++;j;d;CB.t.zd" #

Pruébelo en línea aquí .

Maltysen
fuente
¿Cómo puede eso detectar costas en el borde de la entrada?
feersum
Lo llevo primero, olvidé decir eso.
Maltysen
3

ES6, 123 115 114 bytes

a=>a.map((s,i)=>s.replace(/#/g,(h,j)=>r+=(s[j-1]!=h)+(s[j+1]!=h)+((a[i-1]||'')[j]!=h)+((a[i+1]||'')[j]!=h)),r=0)|r

Editar: Guardado 9 bytes gracias a @ edc65.

Neil
fuente
No estoy seguro de que esto sea un programa completo que escriba en stdout o en pantalla. Aparte de esto: debe usar el parámetro de la función de reemplazo. a=>['',...a,''].map((s,i,a)=>s.replace(/#/g,(_,j)=>r+=(s[j-1]!=_)+(s[j+1]!=_)+(a[i-1][j]!=_)+(a[i+1][j]!=_)),r=0)|r
edc65
Y mejora=>a.map((s,i)=>s.replace(/#/g,(_,j)=>r+=(s[j-1]!=_)+(s[j+1]!=_)+((a[i-1]||'')[j]!=_)+((a[i+1]||'')[j]!=_)),r=0)|r
edc65
@ edc65 Ah, por supuesto, pierdo dos bytes al tener que capturar el valor de la matriz interna. Además, buena captura en ese parámetro de reemplazo.
Neil
2

MATL , 42 bytes

c2\FTFt!*Y+2*qFTFtl-4lhhbvv_2X53$Y+t0>)s2/

Esto acepta la entrada como una matriz de celdas de cadenas, de la forma

{'#####', '#   #', '# # #', '#   #', '#####'}

Primero convierte la entrada en una matriz de caracteres 2D, rellena con espacios, y luego en una matriz de ceros y unos. La convolución 2D se aplica dos veces, con dos máscaras diferentes: primero para expandir la matriz, segundo para detectar bordes.

Pruébalo en línea!

Luis Mendo
fuente
0

Japt, 22 19 bytes

4o £UzX è"#%s|#$} x

Asume que la entrada se rellena con espacios para formar un rectángulo. ¡Pruébalo en línea!

Cómo funciona

          // Implicit: U = input string, S = a space
4o £    } // Create the array [0,1,2,3], and map each item X to:
UzX       //  Rotate U by 90 degrees X times.
è"#%s|#$  //  Count the number of "#"s followed by a space, newline, or end-of-string.
x         // Sum the resulting array.
ETHproductions
fuente