สามเหลี่ยมสามเหลี่ยม: เพียงแค่เชื่อมต่อรูปหลายเหลี่ยม


9

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

ตาราง

เราจะใช้เค้าโครงสามเหลี่ยมของ Martinสำหรับอินพุต:

ตารางสามเหลี่ยม

สังเกตความจริงที่ว่าจุดกึ่งกลางของรูปสามเหลี่ยมเป็นรูปสี่เหลี่ยมมุมฉากและมุมบนซ้าย "จุด" ขึ้น เราสามารถอธิบายส่วนย่อยของตารางนี้ได้โดยให้ "แผนที่ดาว" เป็นรูปสี่เหลี่ยมผืนผ้าเพื่อระบุสามเหลี่ยมที่รวมอยู่และที่ไม่รวมอยู่ด้วย ตัวอย่างเช่นแผนที่นี้:

** **
*****

สอดคล้องกับรูปหลายเหลี่ยมขนาดเล็กที่สุดที่มีรู:

9-iamond มีรู

หลุม

polyiamond ซึ่งมีหลุมเช่นตัวอย่างข้างต้น (ภูมิภาคไม่ใช่ส่วนหนึ่งของ polyiamond ซึ่งถูกล้อมรอบทุกด้านตามภูมิภาคที่มี ) ไม่ได้ทอพอโลยีพูดเพียงแค่เชื่อมต่อ

ความท้าทาย

เขียนฟังก์ชั่นหรือโปรแกรมซึ่งจะเป็น input เป็น "แผนที่ดาว" ตามที่อธิบายไว้ข้างต้นและเอาท์พุท truthy ถ้าหากว่าย่อยที่ระบุของตารางสามเหลี่ยมเป็นpolyiamond เพียงแค่เชื่อมต่อ

ตัวอย่างเพิ่มเติม

*** ***
*******

สอดคล้องกับรูปหลายเหลี่ยม

13-iamond ที่ไม่มีรู

ซึ่งเชื่อมต่อได้ง่าย


*   *
** **
 ***

สอดคล้องกับรูปหลายเหลี่ยม

9-iamond ที่ไม่มีรู

ซึ่งเชื่อมต่อได้ง่าย


**  **
*** **
 ****

สอดคล้องกับที่ไม่ใช่โพลีออน

13 รูปสามเหลี่ยมที่ไม่มีอะไรน่าสนใจ

ซึ่งจะไม่สามารถเชื่อมต่อได้อย่างง่ายดายแม้ว่าจะเป็นรูปหลายเหลี่ยม

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

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

สภาพการชนะ

นี่คือ ดังนั้นคำตอบที่สั้นที่สุดในหน่วยไบต์จะเป็นผู้ชนะ

กรณีทดสอบ

แผนที่ Truthy:

1) *

2) *
   *

3) **

4) *** ***
   *******

5) *   *
   ** **
    ***

6) *
   **
    *

7)    **
     ***
   ****

8) ****
   **   *
    *****

9) ***********
   **    **  **
    ****  **  **
              **
   ************

แผนที่เท็จ:

1) *
   *
   *

2) * *

3) *
    *

4)  **
   **

5) ***

   ***

6) ** **
   *****

7) **  **
   *** **
    ****

8)  *
    *

9) *****
   **   *
    *****

1
เป็นคำถามที่ดี หากกริดรูปสามเหลี่ยมกำลังจะกลายเป็นสิ่งที่ฉันขอแนะนำให้พวกเขาเป็นตัวอย่างAV VA\nVAVAVแทน** **\n*****มันจะช่วยให้มนุษย์มองเห็นได้ง่ายขึ้น ฉันทำการแก้ไขหนึ่งในไดอะแกรม ASCII ของ Martin แล้ว
ระดับแม่น้ำ St

ฉันไม่ได้เกี่ยวข้องกับความสามารถในการอ่านของมนุษย์โดยเฉพาะ ฉันอยากจะทำทุกอย่างเพื่อให้โปรแกรมอ่านง่ายขึ้นในขณะที่เหลือน้อย
quintopia

โดยพื้นฐานแล้วถ้ามีเท็จจะมีเพียงส่วน "เชื่อมต่อ" เป็นมุมเท่านั้น?
Michael Klein

1
หรือหากมีชิ้นส่วนที่ไม่ได้เชื่อมต่อเลย มาร์ตินพูดแบบนี้: ถ้าจริงทั้งร่างและพื้นดินเชื่อมต่อกันตามขอบเพื่อให้น้ำท่วมถึง 2 ครั้งเพียงพอที่จะเปลี่ยนสีของเครื่องบิน
quintopia

คำตอบ:


4

หอยทาก 95 ไบต์

F&
lr|=((ul.)2 ,l~a~)d|!((ul.)2 ,l~a~)u}\*}+l\ ,~a~|{\ (lr|=((ul.)2 ,l~a~)d|!((ul.)2 ,l~a~)u}+~

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

F&                         ,, option F: pad lines with spaces to the length of the longest
                           ,, option &: print 1 iff match succeeds from every cell
lr                         ,, direction left or right, or
      | =((ul.)2 ,l~a~) d  ,, direction down, if we are an even number of orthogonal moves from the top left
      | !((ul.)2 ,l~a~) u  ,, or, direction up if we are odd number of moves from the top left
    }  \*                  ,, literal '*'
}+                         ,, 1 or more times
l\ ,~a~                    ,, check that we are on the leftmost * in the top line

|                          ,, the part before this is for starting on '*'; part after for starting on ' '

{ \                        ,, literal ' '
    (   lr                 ,, direction left or right, or
      | =((ul.)2 ,l~a~) d  ,, same drill as before...
      | !((ul.)2 ,l~a~) u 
}+                         ,, 1 or more times
~                          ,, end on an out of bounds cell

ฉันไม่เข้าใจวิธีการใช้งาน แต่ใช้งานได้ทั้งหมด
quintopia

3

CJam, 101 98 ไบต์

qN/_z,f{' e]}{S2*f+W%z}4*:eeee::f+:~{_(aL{+_{_2,.+1$2,.-@_:+1&!2*(a.+}%2${a1$&},\;@1$-@@}h;\;-}2*!

ลองออนไลน์

ในที่สุดฉันก็เอาชนะความกลัวของฉันในการใช้งานเติมน้ำท่วมใน CJam มันน่าเกลียดอย่างที่ฉันคาดไว้และมันสามารถเล่นกอล์ฟได้อย่างแน่นอน

แนวคิดทั่วไปคือการดำเนินการเติมน้ำท่วมสองครั้ง (ซึ่งถูกนำไปใช้จริงเป็นการลบออกจากรายการของเซลล์ที่ไม่ได้เข้าชม) บัตรผ่านแรกจะลบช่องว่างทั้งหมดที่สามารถเข้าถึงได้จากขอบ รอบที่สองจะเลือกลำดับแรก*ในการอ่านและลบสามเหลี่ยมทั้งหมดที่เข้าถึงได้จากนั้น ถ้าหากว่ารายการผลลัพธ์ว่างเปล่ารูปหลายเหลี่ยมก็เชื่อมต่อกัน:

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