ค้นหาแนวชายฝั่ง


14

งานของคุณคือการหาความยาวของแนวชายฝั่งของแผนที่เกาะที่ระบุในแผนที่ ASCII แผนที่นำเข้าจะประกอบด้วย#อักขระอย่างน้อย 1 ตัวที่ระบุที่ดินและช่องว่างที่ระบุถึงน้ำ แนวชายฝั่งถือว่าเป็นขอบระหว่างที่ดินกับน้ำรวมถึงทะเลสาบและเกาะต่างๆ

โซลูชันของคุณควรเป็นโปรแกรมที่สมบูรณ์ที่อ่านในไฟล์สตริงหรืออาร์เรย์ของสตริงและส่งออกจำนวนเต็มเดียวไปยังหน้าจอหรือ stdout แต่ละบรรทัดอินพุตอาจมีช่องว่างนำหน้าหรือต่อท้ายและอักขระแฮชเป็นศูนย์หรือมากกว่า เส้นขอบของแผนที่ถือเป็นช่องว่าง (น้ำ)

เส้นอาจมีความยาวต่างกัน

ตัวอย่าง:

Input:
##
##
Output: 8

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

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

นี่คือรหัสกอล์ฟดังนั้นจำนวนไบต์ที่น้อยที่สุดจึงชนะ


เราสามารถสมมติว่าอินพุตนั้นถูกเสริมให้เป็นสี่เหลี่ยมที่มีช่องว่างได้หรือไม่?
Martin Ender

ทำไมโปรแกรมที่สมบูรณ์ โดยปกติแล้วฟังก์ชั่นจะได้รับอนุญาตและฉันไม่เห็นเหตุผลที่ดีสำหรับความท้าทายนี้ที่จะ จำกัด
nimi

@ MartinBüttnerใช่ ฉันหวังว่า "ขอบเขตของแผนที่จะถือว่าเป็นพื้นที่ (น้ำ)" ที่ครอบคลุม แจ้งให้เราทราบหากฉันควรทำให้ชัดเจน
Logic Knight อัศวิน

@nimi ฉันเข้าใจความกังวลของคุณ แต่เมื่อความท้าทายมีอายุ 12 ชั่วโมงมี 4 คำตอบและคนอื่น ๆ อาจกำลังทำงานอยู่ในตอนนี้ฉันลังเลที่จะเปลี่ยน
Logic Logic Knight

@CarpetPython ไม่ฉันหมายความว่าเราสามารถสรุปได้ว่าบรรทัดทั้งหมดของอินพุตมีความยาวเท่ากัน
Martin Ender

คำตอบ:


14

หอยทาก 8 ไบต์

A
\#o!\#

Aตัวเลือกวิธีการนับเส้นทางที่ตรงกันทั้งหมดค่อนข้างที่จุดเริ่มต้นการแข่งขันประสบความสำเร็จจาก \#กิน a #, oเปลี่ยนไปในทิศทางที่สำคัญและ!\#เป็นการยืนยันเชิงลบซึ่งประสบความสำเร็จหากไม่มี#ด้านหน้าของเรา


4

Pyth - 25 23 ไบต์

ก่อนอื่นก็ใส่อินพุตไปยัง rect จากนั้นนับการเกิดขึ้นของ" #"การเปลี่ยนถ่าย 4 ครั้งและการพลิกกลับของอินพุต + ช่องว่าง

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

ลองมันออนไลน์ได้ที่นี่


จะตรวจจับแนวชายฝั่งที่ขอบของอินพุตได้อย่างไร
feersum

ฉันยัดมันก่อนฉันลืมที่จะพูดอย่างนั้น
Maltysen

3

ES6, 123 115 114 ไบต์

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

แก้ไข: บันทึกแล้ว 9 ไบต์ขอบคุณ @ edc65


ฉันไม่แน่ใจเกี่ยวกับโปรแกรมนี้ที่เขียนไปยัง stdout หรือบนหน้าจอ นอกเหนือจากนี้: คุณควรใช้พารามิเตอร์ของฟังก์ชั่นแทนที่ 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

และดีกว่าa=>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 แน่นอนฉันเสียสองไบต์โดยต้องจับค่าอาร์เรย์ภายใน นอกจากนี้จับดีบนพารามิเตอร์แทนที่
Neil

2

MATL , 42ไบต์

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

สิ่งนี้ยอมรับอินพุตเป็นอาร์เรย์ของสตริงของเซลล์

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

ก่อนอื่นจะแปลงอินพุตเป็นอาร์เรย์ถ่าน 2 มิติการเว้นวรรคด้วยช่องว่างจากนั้นเป็นเมทริกซ์ของศูนย์และวัตถุ 2D-convolution จะถูกนำมาใช้สองครั้งด้วยมาสก์สองแบบที่แตกต่างกัน: อันดับแรกสำหรับการขยายเมทริกซ์, ที่สองสำหรับการตรวจจับขอบ

ลองออนไลน์!


0

Japt 22 22ไบต์

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

สมมติว่าอินพุตเป็นเบาะด้วยช่องว่างในรูปแบบสี่เหลี่ยมผืนผ้า ทดสอบออนไลน์!

มันทำงานอย่างไร

          // 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.
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.