มีใครบางคนถูกทำลายชื่อเสียง?


26

Defenestrationคือการโยนบางคนหรือบางสิ่งออกจากหน้าต่าง
- วิกิพีเดีย

อินพุต

อินพุตจะประกอบด้วยสองส่วน:

  • แบบแปลนชั้นและบุคคลภายในบ้าน / อาคาร

    • v><^หมายถึงบุคคลชี้ไปในทิศทางที่มีความหมายโดยลูกศร ข้อมูลที่ป้อนจะมีหนึ่งคนเท่านั้น

    • -และ|เป็นตัวแทนของผนังและ#เป็นหน้าต่าง เป็นพื้นที่ว่างเปล่า

    ส่วนนี้ของการป้อนข้อมูลอาจถูกนำมาเป็นสตริงเดียวหรืออาร์เรย์ / รายการ / ฯลฯ ของสาย จะไม่มีช่องว่างต่อท้ายหรือนำหน้าและอินพุตจะเป็นรูปสี่เหลี่ยมผืนผ้าเสมอ

    ตัวอย่าง:

    -----###---
    |         |
    |     ^   |
    -----------
    
  • จำนวนเต็ม≥ 1 หมายถึงบุคคลที่เดินทาง (ในตัวอักษร)

เอาท์พุต

ผลลัพธ์ควรเป็น

  • 1หากบุคคลนั้นปรากฏหน้าต่าง "ข้างใน" (เช่นหลังจากเลื่อนไปข้างหน้าตามระยะทางที่ระบุในอินพุตบุคคลนั้นจะอยู่ด้านบนของ a #)

  • 2ถ้าบุคคลนั้นถูก defenestrated (เข้ามาติดต่อกับ#แล้วต่อไปอีก)

  • 3หากบุคคลนั้นชนกำแพง (สัมผัสกับ a -หรือ|เมื่อกดที่ผนังคนจะหยุดและไม่ผ่านต่อไป)

  • 0 หากไม่มีสิ่งใดในข้างต้นเป็นจริง (และบุคคลที่ทำไปแล้วคือเดินทางไปในที่ว่าง)

สมมติฐาน

ทั้งหมดต่อไปนี้สามารถสันนิษฐานได้ว่าเป็นจริง:

  • บุคคลนั้นจะไม่เดินทาง "นอกขอบเขต" ของพื้นที่อินพุต

  • หลังจากถูกกำจัดออกแล้วบุคคลนั้นจะไม่ติดต่อกับคนอื่น#หรือ a -/ |(ดังนั้นคุณไม่ต้องกังวลเกี่ยวกับว่า2 และ 1หรือ3ทั้งคู่เป็นจริง)

กรณีทดสอบ

สำหรับ "แปลนชั้น" ต่อไปนี้:

-----
|   |
|###|
|   |
| ^ |
In   Out
1    0
2    1
3    2

สำหรับแผนชั้นนี้:

> | # |
In   Out
1    0
2-99 3    * that is, any input 2-99 outputs 3

สำหรับแผนชั้นนี้:

||####|#|#|##|<
In   Out
any  3

กรณีทดสอบขั้นสุดท้าย:

|v|
|#|
| |
| |
| |
| |
In   Out
1    1
2-5  2  

7
ฉันเสนอชื่อเรื่องของความท้าทายนี้ให้เปลี่ยนเป็นการทดสอบการชน
แมว

1
คำถามติดตามผล: นี่ยกเว้นหลุมของ
Conor O'Brien

2
@ CᴏɴᴏʀO'BʀɪᴇɴHas someone been for-sparta'd?
cat

ทำไมการแก้ไขของฉันถึงถูกปฏิเสธ):
cat

@cat เนื่องจากเป็นการแก้ไขคำถามของคนอื่นจึงต้องมีการป้อนข้อมูล
Conor O'Brien

คำตอบ:


10

JavaScript (ES6), 147 146 ไบต์

(p,n)=>eval('l=p.search`\n`+1;m=p.match`[<>v^]`;for(r=d=i=0;i++<n&r<3;r-1?0:d=2)r=(c=p[m.index+i*({v:l,"<":-1,">":1}[m]||-l)])>"#"?3:c>" ";+r||d')

บันทึกแล้ว 1 ไบต์ขอบคุณ@NinjaBearMonkey !

คำอธิบาย

รับแผนผังเป็นสตริงและจำนวนของการเคลื่อนไหว ส่งคืนตัวเลข

(p,n)=>                               // p = floor plan as string, n = number of moves
  eval(`                              // use eval to enable for loop without {} or return
    l=p.search\`\n\`+1;               // l = line length
    m=p.match\`[<>v^]\`;              // m = the position and orientation of the person
    for(
      r=                              // r = result at the current step
        d=                            // d = 2 if the person has been defenestrated
          i=0;                        // i = current step
      i++<n&r<3;                      // for each step while the person has not hit a wall
      r-1?0:d=2                       // set d to 2 once the person enters the window
    )
      r=(                             // r = 0 if on " ", 1 if on "#" or 3 if on "|" or "-"
        c=p[m.index+i*                // c = character after current step
          ({v:l,"<":-1,">":1}[m]||-l) // get the index offset of each step
        ]
      )>"#"?3:c>" ";
    +r||d                             // return the result of the current step or d
  `)

ทดสอบ


3
ฉันชอบตัวอย่างการทดสอบของคุณ!
GamrCorps

ಠ_ಠฉันกำลังจะโพสต์สิ่งเดียวกันอย่างแน่นอน
Conor O'Brien

@ CᴏɴᴏʀO'Bʀɪᴇɴฮ่าฮ่าฉันรู้ว่าความรู้สึกนั้นดีเกินไป ...
user81655

คำตอบที่ดี btw! ฉลาดมาก
Conor O'Brien
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.