Finde die Küste

14

Ihre Aufgabe ist es, die Länge der Küste einer Karte von Inseln in einer ASCII-Karte zu finden. Die Eingabekarte besteht aus einem oder mehreren #Zeichen für Land und Leerzeichen für Wasser. Die Küste gilt als ein Rand zwischen Land und Wasser, einschließlich Binnenseen und Inseln.

Ihre Lösung sollte ein vollständiges Programm sein, das eine Datei, eine Zeichenfolge oder ein Array von Zeichenfolgen einliest und eine einzelne Ganzzahl auf dem Bildschirm oder der Standardausgabe ausgibt. Jede Eingabezeile kann ein vor- oder nachgestelltes Leerzeichen sowie null oder mehr Hash-Zeichen enthalten. Die Ränder der Karte werden als Raum (Wasser) angenommen.

Zeilen können unterschiedlich lang sein.

Beispiele:

Input:
##
##
Output: 8

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

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

Dies ist Codegolf, also gewinnt die kleinste Byteanzahl.

Logik-Ritter
quelle
Können wir annehmen, dass die Eingabe auf ein Rechteck mit Leerzeichen aufgefüllt ist?
Martin Ender
Warum ein komplettes Programm? Normalerweise sind auch Funktionen erlaubt, und ich sehe keinen guten Grund für diese Herausforderung, restriktiv zu sein.
nimi
@ MartinBüttner, ja. Ich hatte gehofft, dass "Die Grenzen der Karte werden als Raum (Wasser) angenommen" dies abdeckte. Lassen Sie mich wissen, ob ich das klarer machen soll.
Logic Knight
@nimi, ich verstehe Ihre Besorgnis, aber da die Herausforderung 12 Stunden alt ist, gibt es 4 Antworten, und andere Leute arbeiten möglicherweise gerade daran. Ich zögere, sie zu ändern.
Logic Knight
@CarpetPython nein ich meine, ob wir davon ausgehen können, dass alle Zeilen der Eingabe die gleiche Länge haben.
Martin Ender

Antworten:

14

Schnecken , 8 Bytes

A
\#o!\#

Die AOption bedeutet, dass alle übereinstimmenden Pfade gezählt werden und nicht, ab welchen Startpunkten eine Übereinstimmung erfolgreich ist. \#verbraucht a #, odreht sich in eine Himmelsrichtung und !\#ist eine negative Behauptung, die erfolgreich ist, wenn es kein #vor uns gibt.

Feersum
quelle
4

Pyth - 25 23 Bytes

Zuerst wird der Eingang mit einem Rect aufgefüllt. Zählt dann das Auftreten von " #"über 4 Permutationen von Transpositionen und Umkehrungen des Input + Space.

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

Probieren Sie es hier online aus .

Maltysen
quelle
Wie kann das Küstenlinien am Rand der Eingabe erkennen?
Feersum
Ich fülle es zuerst auf, ich habe vergessen, das zu sagen.
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

Bearbeiten: 9 Bytes dank @ edc65 gespeichert.

Neil
quelle
Ich bin mir nicht sicher, ob dies ein vollständiges Programm ist, das auf stdout oder auf dem Bildschirm schreibt. Abgesehen davon: Sie sollten param der Ersetzungsfunktion verwenden. 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
Und bessera=>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, ich verliere natürlich zwei Bytes, wenn ich den inneren Array-Wert erfassen muss. Auch netter Fang an diesem Ersetzungsparameter.
Neil
2

MATL , 42 Bytes

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

Dadurch wird die Eingabe als Zellenarray von Zeichenfolgen des Formulars akzeptiert

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

Die Eingabe wird zuerst in ein 2D-Zeichen-Array konvertiert, mit Leerzeichen aufgefüllt und dann in eine Matrix aus Nullen und Einsen. Die 2D-Faltung wird dann zweimal mit zwei verschiedenen Masken angewendet: erstens zum Erweitern der Matrix, zweitens zum Erkennen von Kanten.

Probieren Sie es online!

Luis Mendo
quelle
0

Japt, 22 19 Bytes

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

Angenommen, die Eingabe wird mit Leerzeichen aufgefüllt, um ein Rechteck zu bilden. Online testen!

Wie es funktioniert

          // 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
quelle