Znajdź linię brzegową

14

Twoim zadaniem jest znalezienie długości linii brzegowej mapy wysp na mapie ASCII. Mapa wejściowa będzie się składać z 1 lub więcej #znaków wskazujących ląd i spacji wskazujących wodę. Linia brzegowa jest uważana za dowolną krawędź między lądem a wodą, w tym śródlądowymi jeziorami i wyspami.

Rozwiązaniem powinno być kompletny program, który wczytuje plik, ciąg znaków lub tablicę ciągów i wyświetla jedną liczbę całkowitą na ekranie lub standardowym wyjściu. Każda linia wejściowa może mieć spację wiodącą lub końcową oraz zero lub więcej znaków skrótu. Przyjmuje się, że granice mapy to przestrzeń (woda).

Linie mogą mieć różne długości.

Przykłady:

Input:
##
##
Output: 8

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

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

To jest golf golfowy, więc wygrywa najmniejsza liczba bajtów.

Logic Knight
źródło
Czy możemy założyć, że dane wejściowe są wypełnione prostokątem ze spacjami?
Martin Ender,
Dlaczego kompletny program? Zwykle funkcje są również dozwolone i nie widzę dobrego powodu, aby to wyzwanie było restrykcyjne.
nimi
@ MartinBüttner, tak. Miałem nadzieję, że „Granice mapy przyjmowane są za przestrzeń (wodę)”. Daj mi znać, czy powinienem to wyjaśnić.
Logic Knight
@nimi, rozumiem twoją troskę, ale ponieważ wyzwanie ma 12 godzin, są 4 odpowiedzi, a inni ludzie mogą nad nim teraz pracować, niechętnie go zmieniam.
Logic Knight
@CarpetPython nie Mam na myśli, czy możemy założyć, że wszystkie wiersze wejścia mają tę samą długość.
Martin Ender

Odpowiedzi:

14

Ślimaki , 8 bajtów

A
\#o!\#

Ta Aopcja oznacza policzenie wszystkich pasujących ścieżek, a nie punktów początkowych, w których odniesiono sukces. \#pochłania a #, oobraca się w kierunku kardynalnym i !\#jest twierdzeniem negatywnym, które się powiedzie, jeśli nie będzie #przed nami.

feersum
źródło
4

Pyth - 25 23 bajtów

Najpierw dopełnia wejście do prostownika. Następnie zlicza wystąpienia " #"ponad 4 permutacji transpozycji i odwrotności wejścia + spacja.

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

Wypróbuj online tutaj .

Maltysen
źródło
Jak może to wykryć linie brzegowe na brzegu wejścia?
feersum
Najpierw padam, zapomniałem to powiedzieć.
Maltysen
3

ES6, 123 115 114 bajtów

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

Edycja: Zapisano 9 bajtów dzięki @ edc65.

Neil
źródło
Nie jestem pewien, czy to kompletny program, który zapisuje na standardowe wyjście lub na ekranie. Poza tym: powinieneś użyć parametru funkcji 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
I lepieja=>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 Ach, oczywiście, tracę dwa bajty, ponieważ muszę przechwycić wewnętrzną wartość tablicy. Również niezłe złapanie tego parametru zastępowania.
Neil
2

MATL , 42 bajty

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

Akceptuje to dane wejściowe jako tablicę komórek ciągów formy

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

Najpierw konwertuje dane wejściowe na tablicę znaków 2D, wypełniając je spacjami, a następnie na macierz zer i jedynek. Splot 2D jest następnie stosowany dwukrotnie, z dwiema różnymi maskami: pierwsza do rozszerzenia matrycy, druga do wykrywania krawędzi.

Wypróbuj online!

Luis Mendo
źródło
0

Japt, 22 19 bajtów

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

Zakłada, że ​​dane wejściowe są wypełnione spacjami, aby utworzyć prostokąt. Przetestuj online!

Jak to działa

          // 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.
ETHprodukcje
źródło