Tìm đường bờ biển


14

Nhiệm vụ của bạn là tìm ra chiều dài đường bờ biển của bản đồ các đảo được cung cấp trong bản đồ ASCII. Bản đồ đầu vào sẽ bao gồm 1 hoặc nhiều #ký tự chỉ vùng đất và không gian biểu thị nước. Đường bờ biển được coi là bất kỳ cạnh nào giữa đất liền và nước, bao gồm các hồ và đảo nội địa.

Giải pháp của bạn phải là một chương trình hoàn chỉnh đọc trong một tệp, một chuỗi hoặc một chuỗi các chuỗi và xuất ra một số nguyên duy nhất cho màn hình hoặc thiết bị xuất chuẩn. Mỗi dòng đầu vào có thể có không gian hàng đầu hoặc dấu và không có hoặc nhiều ký tự băm. Các đường viền của bản đồ được coi là không gian (nước).

Các dòng có thể có độ dài khác nhau.

Ví dụ:

Input:
##
##
Output: 8

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

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

Đây là mã golf, vì vậy số byte nhỏ nhất sẽ thắng.


Chúng ta có thể giả sử rằng đầu vào được đệm vào một hình chữ nhật có khoảng trắng không?
Martin Ender

Tại sao một chương trình hoàn chỉnh? Thông thường các chức năng cũng được cho phép và tôi không thấy lý do chính đáng để thách thức này bị hạn chế.
nimi

@ MartinBüttner, vâng. Tôi đã hy vọng rằng "Đường viền của bản đồ được coi là không gian (nước)" bao trùm điều đó. Hãy cho tôi biết nếu tôi nên làm cho rõ ràng hơn.
Hiệp sĩ logic

@nimi, tôi hiểu mối quan tâm của bạn, nhưng vì thử thách đã 12 giờ, có 4 câu trả lời và những người khác có thể đang làm việc với nó ngay bây giờ, tôi miễn cưỡng thay đổi nó.
Hiệp sĩ logic

@CarpetPython không Ý tôi là liệu chúng ta có thể giả sử rằng tất cả các dòng của đầu vào có cùng độ dài hay không.
Martin Ender

Câu trả lời:


14

Ốc , 8 byte

A
\#o!\#

Các Atùy chọn có nghĩa là để đếm tất cả những con đường phù hợp chứ không phải đó điểm một trận đấu thành công từ khi bắt đầu. \#tiêu thụ a #, oquay theo hướng hồng y và !\#là một khẳng định tiêu cực thành công nếu không có #trước mặt chúng ta.


4

Pyth - 25 23 byte

Đầu tiên, nó đệm đầu vào cho một trực tràng. Sau đó đếm số lần xuất hiện của" #" hơn 4 hoán vị của chuyển vị và đảo ngược của không gian đầu vào +.

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

Hãy thử trực tuyến tại đây .


Làm thế nào mà có thể phát hiện đường bờ biển trên cạnh của đầu vào?
frageum

Tôi đệm nó trước, tôi quên nói điều đó.
Maltysen 6/2/2016

3

ES6, 123 115 114 byte

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

Chỉnh sửa: Đã lưu 9 byte nhờ @ edc65.


Tôi không chắc chắn về việc nuôi ong một chương trình hoàn chỉnh ghi vào thiết bị xuất chuẩn hoặc trên màn hình. Ngoài ra, bạn nên sử dụng param của chức năng thay thế. 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

Và tốt hơna=>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, tất nhiên, tôi mất hai byte bằng cách phải bắt giá trị mảng bên trong. Ngoài ra, bắt tốt đẹp trên tham số thay thế.
Neil

2

MATL , 42 byte

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

Điều này chấp nhận đầu vào là một mảng ô của chuỗi, có dạng

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

Đầu tiên, nó chuyển đổi đầu vào thành một mảng char 2D, đệm bằng khoảng trắng và sau đó thành một ma trận các số 0 và một. Tích chập 2D sau đó được áp dụng hai lần, với hai mặt nạ khác nhau: thứ nhất để mở rộng ma trận, thứ hai để phát hiện các cạnh.

Hãy thử trực tuyến!


0

Japt, 22 19 byte

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

Giả sử đầu vào được đệm bằng khoảng trắng để tạo thành hình chữ nhật. Kiểm tra nó trực tuyến!

Làm thế nào nó hoạt động

          // 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.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.