ลูกศรเขาวงกตหลบหนี


14

คำถาม

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

คุณอาจเริ่มต้นจากเซลล์ใด ๆ บนขอบนอกสุดของเขาวงกตและค้นหาเส้นทางที่นำคุณไปสู่เขาวงกตและทำให้คุณออกจากเซลล์อื่น อินพุตจะได้รับเป็นอาร์เรย์ที่มี <,>, ^ และ v. เอาต์พุตจะเป็นตัวเลขหลักเดียว (บูลีน, จำนวนเต็มหรือตัวอักษร, สิ่งใดจะทำ) เป็น 0 (บ่งบอกว่างานเป็นไปไม่ได้) หรือ 1 (บ่งบอกว่าคุณมี บรรลุภารกิจ)

ตัวอย่าง (อาร์เรย์จริงจะใหญ่กว่านี้)

^ v < >
> < v <
v > v ^

ผลผลิตจะได้

1
ในขณะที่คุณสามารถป้อนจาก <ทางด้านขวาซึ่งจะทำให้คุณออกจากด้านล่าง v โดยเส้นทาง "<v v"

ภารกิจคือการเขียนรหัสที่สั้นที่สุดที่เป็นไปได้ที่จะได้รับเขาวงกตเป็นอินพุทและตรวจสอบว่ามีเส้นทางในนั้นตามที่ระบุไว้ในกฎและส่งออกหลักเดียว 0 หรือ 1

อนุญาตให้แสดงผล TRUE และ FALSE แทนตัวเลขจริงได้


6
มันคงจะดีถ้ามีกรณีทดสอบจริง ๆ ให้ทำงานด้วย
เลียม

อินพุตเป็นอาร์เรย์หนึ่งมิติหรือสองมิติหรือไม่ และคุณสามารถป้อนทางขวาด้วย <หรือคุณสามารถป้อนด้วย ^ ได้ด้วยหรือไม่
bobbel

@bobbel Input สามารถกำหนดให้เป็น 1 หรืออาเรย์ 2 มิติแล้วแต่จำนวนใดจะต้องใช้รหัสที่สั้นกว่า แม้กระทั่งลูกศรสามารถป้อนเป็น 1 2 3 4 แทน <> ^ v หากสามารถย่อรหัสได้ และใช่คุณสามารถป้อนผ่าน ^ ด้วย
ghosts_in_the_code

1
ความเป็นไปได้ที่การสุ่ม 50 ถึง 50 อาเรย์จะไม่มีวิธีแก้ปัญหาอยู่ที่ประมาณ 0 มันจะดีกว่าถ้าคุณต้องการให้โซลูชันมีขั้นตอนอย่างน้อยจำนวนหนึ่งหรือผู้ใช้ระบุเส้นทางโซลูชัน
DavidC

1
สิ่งนี้ควรถูกเรียกว่า "ลูกศรหลบหนี" ... ยังคงไตร่ตรองวิธีแก้ปัญหาอยู่
บีกเกอร์

คำตอบ:


6

CJam, 89 81 ไบต์

q~"><v^":A2/{f{\*}z}/sA[1W52-52]er:T,,{[52md]51f%0e=1=},:E{[2704{__T=+}*]\-E&},,g

ลองใช้ออนไลน์ในล่าม CJam

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

q~        e# Read and evaluate all input. This pushes an array of strings.
"><v^":A  e# Push that string and save it in A.
2/        e# Split it into ["><" "v^"].
{         e# For each chunk:
  f{      e#   For each input string, push the string and the chunk; then:
    \*    e#     Join the chunk, using the string as separator.
  }       e#
  z       e#   Transpose rows and columns.
}/        e#
s         e# Flatten the resulting array of strings.
A         e# Push "><v^".
[1W52-52] e# Push [1 -1 52 -52].
er        e# Perform transliteration.
:T        e# Save the result in T.
,,        e# Push [0 ... 2703].
{         e# Filter; for each integer I in [0 ... 2703]:
  [52md]  e#   Push [I/52 I%52].
  51f%    e#   Take both integers modulo 51 to map 51 to 0.
  0e=     e#   Count the number of resulting zeroes.
  1=      e#   Check if the count is 1.
},        e# If it is, keep I.
:E        e# Save the filtered array in E.
{         e# For each integer I in E:
  [2704{  e#   Do 2704 times:
    __    e#     Push two copies of the integer on the stack.
    T=    e#     Select the corresponding element from T.
    +     e#     Add it to the first copy.
  }*]     e#   Collect all results in an array.
  \-      e#   Remove I from that array.
  E&      e#   Intersect with E.
},        e# If the intersection is non-empty, keep the integer.
,g        e# Push the sign of the length of the filtered array.
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.