Trouvez le littoral


14

Votre tâche consiste à trouver la longueur du littoral d'une carte des îles fournie dans une carte ASCII. La carte d'entrée comprendra un ou plusieurs #caractères qui indiquent la terre et des espaces qui indiquent l'eau. Le littoral est considéré comme n'importe quel bord entre la terre et l'eau, y compris les lacs intérieurs et les îles.

Votre solution doit être un programme complet qui lit dans un fichier, une chaîne ou un tableau de chaînes et renvoie un seul entier à l'écran ou à la sortie standard. Chaque ligne d'entrée peut avoir un espace de début ou de fin et zéro ou plusieurs caractères de hachage. Les frontières de la carte sont supposées être de l'espace (eau).

Les lignes peuvent être de différentes longueurs.

Exemples:

Input:
##
##
Output: 8

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

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

C'est le golf par code, donc le plus petit nombre d'octets gagne.


Pouvons-nous supposer que l'entrée est complétée par un rectangle avec des espaces?
Martin Ender

Pourquoi un programme complet? Habituellement, les fonctions sont également autorisées, et je ne vois pas une bonne raison pour que ce défi soit restrictif.
nimi

@ MartinBüttner, oui. J'espérais que "les frontières de la carte sont supposées être de l'espace (eau)". Dites-moi si je devrais clarifier cela.
Logic Knight

@nimi, je comprends votre inquiétude, mais comme le défi remonte à 12 heures, il y a 4 réponses, et d'autres personnes peuvent y travailler en ce moment, je suis réticent à le changer.
Logic Knight

@CarpetPython non, je veux dire si nous pouvons supposer que toutes les lignes de l'entrée ont la même longueur.
Martin Ender

Réponses:


14

Escargots , 8 octets

A
\#o!\#

L' Aoption signifie compter tous les chemins correspondants plutôt que les points de départ à partir desquels une correspondance réussit. \#consomme un #, otourne dans une direction cardinale, et !\#est une affirmation négative qui réussit s'il n'y en a pas #devant nous.


4

Pyth - 25 23 octets

Tout d'abord, il remplit l'entrée d'un rect. Compte ensuite les occurrences de " #"plus de 4 permutations de transpositions et inversions de l'entrée + espace.

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

Essayez-le en ligne ici .


Comment cela peut-il détecter les côtes sur le bord de l'entrée?
feersum

Je le garnis d'abord, j'ai oublié de le dire.
Maltysen

3

ES6, 123 115 114 octets

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

Edit: 9 octets enregistrés grâce à @ edc65.


Je ne suis pas sûr que ce soit un programme complet qui écrit sur stdout ou à l'écran. En dehors de cela: vous devez utiliser param de la fonction replace. 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

Et mieuxa=>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, bien sûr, je perds deux octets en devant capturer la valeur du tableau interne. En outre, une bonne prise sur ce paramètre de remplacement.
Neil

2

MATL , 42 octets

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

Cela accepte l'entrée comme un tableau de cellules de chaînes, de la forme

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

Il convertit d'abord l'entrée en un tableau de caractères 2D, en remplissant les espaces, puis en une matrice de zéros et de uns. La convolution 2D est ensuite appliquée deux fois, avec deux masques différents: le premier pour étendre la matrice, le second pour détecter les bords.

Essayez-le en ligne!


0

Japt, 22 19 octets

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

Suppose que l'entrée est complétée par des espaces pour former un rectangle. Testez-le en ligne!

Comment ça fonctionne

          // 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.
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.