ค้นหาข้างในของ Loop


14

งาน

รับแผนภาพ ASCII ของลูป

เช่น

....................
......@@@@@.........
......@...@.........
.....@@...@@@@@.....
....@@........@.....
....@........@@.....
....@@@@@@@@@@......
....................
....................

และตำแหน่งบนลูป

เช่น

(7,1)

คุณจะต้องค้นหาวงในและด้านนอกของวง

เช่น

00000000000000000000
00000011111000000000
00000011111000000000
00000111111111100000
00001111111111100000
00001111111111100000
00001111111111000000
00000000000000000000
00000000000000000000

ข้อมูลจำเพาะ

  • คุณอาจรับอินพุตสำหรับแผนภาพเป็นสตริงที่คั่นด้วยการขึ้นบรรทัดใหม่หรือรายการเทียบเท่าที่ชัดเจน

  • คุณจะได้รับพิกัดบนลูป (0 หรือ 1 ดัชนี) เป็นส่วนหนึ่งของอินพุตของคุณ คุณสามารถวางต้นกำเนิดของคุณได้ทุกที่ที่คุณต้องการ คุณอาจจะใช้เวลานี้ในการประสานงาน(<row>, <column>), (<column>, <row>)หรือเป็นตำแหน่งเชิงเส้นในสตริง คุณอาจได้รับข้อมูลเหล่านี้ในวิธีการที่สมเหตุสมผล อักขระทั้งหมดในลูปจะเหมือนกับอักขระที่ดัชนีนั้น

  • ผลลัพธ์ที่ต้องการคืออาร์เรย์ 2 มิติของค่าความจริงและค่าเท็จอย่างไรก็ตามสตริงของ 1และ0คั่นด้วยการขึ้นบรรทัดใหม่หรือรายการเทียบเท่าใด ๆ ที่ชัดเจนในภายหลังทั้งสอง ภายในและภายนอกจะต้องมีค่าความจริงที่แตกต่างกัน แต่ไม่สำคัญว่าจะเลือกแบบไหน

  • การวนซ้ำถูกกำหนดเป็นกลุ่มของตัวละครเพื่อให้พวกเขาเป็นตัวละครเดียวกันทั้งหมด ( เช่น@ ) และเพื่อให้ตัวละครทุกตัวในวงมีเส้นทางไปยังตัวละครดั้งเดิม (ตัวละครที่พิกัดของอินพุต) ที่ผ่านเหมือนกันเท่านั้น ตัวอักษร (รูปทรงเรขาคณิตของรถแท็กซี่ไม่มีเส้นทแยงมุม )

  • ภายในคือลูปทั้งหมดและสถานที่ที่ไม่สามารถไปถึงขอบของไดอะแกรมโดยไม่ข้ามลูป

  • ภายนอกมีอยู่ทุกที่

  • นี่คือ

กรณีทดสอบ

Pastebin


เราสามารถใช้พิกัดเป็นพิกัดเชิงเส้นในสตริงได้หรือไม่
ข้อบกพร่อง

@ flawr คุณอาจ
โพสต์ Rock Garf Hunter

เราได้รับอนุญาตให้ใช้แผนภาพเป็นเมทริกซ์ของตัวละครหรือไม่ ชอบ[['.', '.'],['.', '@']]แทนที่จะเป็นสตริงที่มีการขึ้นบรรทัดใหม่หรือไม่
hbaderts

@hbaderts นั่นเทียบเท่ากันอย่างเห็นได้ชัด
Post Rock Garf Hunter

1
@WeatWizard ขอบคุณสำหรับกรณีทดสอบเพิ่มเติม! แต่ฉันอยากจะแนะนำให้ใส่ไว้ลงในข้อมูลหรือในส่วนสำคัญ / Pastebin ในการที่จะทำให้ความท้าทายมากขึ้นอีกนิด decluttered =)
flawr

คำตอบ:


6

MATLAB, 163 159 146 78 ไบต์

function m=f(m,y,x);[~,i]=bwfill(m~=m(y,x),x,y,8);m=m*0;m(i)=1;m=bwfill(m,'h')

ขอบคุณ @ rahnema1 สำหรับ -66 ไบต์ !!!

ตอนนี้มันไม่ทำงานบนลองออนไลน์! แต่จำเป็นต้องมีการปรับเปลี่ยนเล็กน้อยเนื่องจาก MATLAB และ Octave เข้ากันไม่ได้ทั้งหมด

คำอธิบาย

ครั้งแรกที่เราสร้างรูปแบบไบนารีที่เพียงปกปิดตัวละครทุกตัวที่เท่ากับตัวอักษรเริ่มต้น จากนั้นเราจะกำหนดส่วนประกอบที่เชื่อมต่อที่อักขระเริ่มต้นอยู่

% determine the connected component that is contains initial character

[~,i]=bwfill(m~=m(y,x),x,y,8);     % i contains the indices of the connected component
m=m*0;m(i)=1;                      % create an image of the connected component

หลังจากนั้นเราสร้างภาพขององค์ประกอบที่เชื่อมต่อนั้นและนำไปใช้เติม "หลุม" ทั้งหมดในภาพ

m=bwfill(m,'h')

ฉันคิดว่าการเล่นกอล์ฟอ็อกเทฟดีกว่าดังนั้นคุณอาจลดให้เหลืออย่างน้อย 72 ไบต์
rahnema1

@ rahnema1 ฉันเริ่มต้นแล้วใน MATLAB ดังนั้นฉันจะไม่เปลี่ยนการส่งตอนนี้ แต่ขอขอบคุณสำหรับคำแนะนำ =)
ข้อบกพร่อง

5

MATLAB: 67 ไบต์

function A=f(A,r,c),A=bwlabel(A==A(r,c),4);A=imfill(A==A(r,c),'h');

คำเตือนคู่:

  • A จะถือว่าเป็นอาร์เรย์อักขระ
  • ดัชนีใน MATLAB นั้นใช้ดัชนี 1 ตัวโดยมีการทำดัชนีแถวก่อน มันสันนิษฐานว่าการเปลี่ยนแปลงเหล่านี้จะทำกับฟังก์ชั่นอินพุต (เช่นตัวอย่างคำถามจะถูกเรียกว่าเป็นoutput = f(A,2,8) )
  • bwlabelและimfillเป็นส่วนหนึ่งของกล่องเครื่องมือประมวลผลภาพ

1
ยินดีต้อนรับสู่ codegolf!
rahnema1

@ rahnema1: ประหลาดใจฉันไม่ได้ไปเร็วเพราะฉันเล่นกอล์ฟใน SO ก่อนที่เว็บไซต์นี้จะเกิด
gnovice
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.