ถนนคาวมีจุดจบหรือไม่?


13

ฉันรัก> <>,> <> คือชีวิต! ค่าสองมิติน่าทึ่ง! ในการท้าทายนี้คุณจะต้องบอกว่าถนน "คาว" สิ้นสุดลงหรือไม่ในขณะที่เล่นกอล์ฟ

คำนิยาม

ถนนคาวถูกสร้างขึ้นด้วยกระเบื้องรวมถึงถนนต่อไปนี้:

v (go down)
> (go right)
^ (go up)
< (go left)
/ (mirror)
\ (mirror)

ตัวละครอื่น (ยกเว้น-|+) อาจถูกมองว่าเป็นสิ่งที่ทำให้ไขว้เขวเช่นดอกไม้ (หรือหัวปลา) ที่ขอบถนน

ถนนจะเริ่มต้นที่มุมซ้ายบนของตารางสี่เหลี่ยมคั่นด้วย-|+สัญลักษณ์ ถนนมีจุดจบถ้าคุณตามติดท้ายคุณจะต้องติดกับชายแดนไม่เช่นนั้นคุณจะถูกขังอยู่ในเส้นทางที่ไม่มีที่สิ้นสุด

การค้นหาเส้นทางของคุณทำได้โดยทำตามคำแนะนำv>^<และกระจกเงา กระจกจะสะท้อน 90 °ขึ้นอยู่กับว่าคุณมาจากไหน นี่คือวิธีการใช้งาน (ใช้v>^<เพื่อแสดงเส้นทาง):

 ^    ^
>/<  >\<
 v    v
</>  <\>
 ^    ^

ถนนอาจมีลักษณะเช่นนี้หากสิ้นสุด:

+--------------------+
|>\/  this way >\/>  | this one ends here
| v^            \/   |
| v^   ^.^           |
| \/\         >v     |
| /\/         ^<     |
+--------------------+

วงวนไม่สิ้นสุด:

+--------+
|>>\ This|
|\\   is |
|  \\ a  |
| \ /trap| 
+--------+

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

ถนนไม่จำเป็นต้องมีคำแนะนำเท่านั้น สามารถใช้ช่องว่างหรือตัวอักษรเพื่อทำให้เสร็จ <v^>-|ซึ่งหมายความว่าคุณจะต้องดำเนินการต่อไปในทิศทางเดียวกันยกเว้นถ้าคุณข้ามตัวละครใน

จะมีหนึ่งv>^<ในมุมซ้ายบนเสมอ<หรือ^บอกเป็นนัยว่าถนนเส้นนี้สิ้นสุด

คุณอาจส่งฟังก์ชั่นที่ใช้สตริงเป็นพารามิเตอร์หรือโปรแกรมแบบสแตนด์อโลนโดยใช้ STDIN / อะไรก็ตามที่เป็นทางเลือกที่ใกล้เคียงที่สุดในภาษาของคุณ

การส่งของคุณจะต้องส่งคืนหรือพิมพ์ค่า STDOUT จริง / ค่าเท็จเมื่อเสร็จสิ้น ค่าความจริงหมายถึงถนนที่มีจุดจบในขณะที่ความเท็จหมายความว่ามันเป็นวงไม่สิ้นสุด

กรณีทดสอบ

+--------------------+
|>\/  this way >\/>  | this one ends here
| v^            \/   |
| v^   ^.^           |
| \/\         >v     |
| /\/ ><>     ^<     |
+--------------------+
    True

+--------+
|>>\ This|
|\\   is |
|  \\ a  |
| \ /trap| 
+--------+
    False

+--+
|<v|
|^<|
+--+
    True

+--+
|>v|
|^<|
+--+
    False

+----------+
|v Hello \ |
|\\/\/   / |
| \/\\   \ |
|/  // >\  |
|  ^/\>\\/ |
|\  /\/\/  |
+----------+
    False

+-----+
|>\/\\|
|//\\/|
|\/\\\|
|//\//|
|\/\/ |
+-----+
    True

2 test cases added as suggested by @MartinBüttner
+----+
|v   |
|\\  |
|//\ |
|\\v |
| \/ |
+----+
    False

+----+
|v   |
|\\  |
|//\ |
|\\^ |
| \/ |
+----+
    False

Test case inspired by @ETHproductions
+-------------------------+
|><>                      |
|something smells fishy...|
+-------------------------+
    False

ช่องโหว่มาตรฐานเป็นสิ่งต้องห้าม (เช่นเคย)

ผู้ชนะจะได้รับรหัสที่สั้นที่สุดเป็นไบต์ (มันน่าอัศจรรย์ที่ได้เห็น> <> คำตอบ :))



1
ที่ดีกว่านี้ได้รับ> <> คำตอบ ...
ตบมือ

@ConfusedMr_C จะทำให้ตัวเองถ้าฉันรู้ว่า langage นี้: / บางทีถ้าฉันหาเวลา ^^ '
Katenkyo

ฉันเดาว่าการแปลงอินพุตเป็น> <> แล้วเรียกล่าม> <> (โดยไม่รวมรหัสของสิ่งนั้นในการนับ) จะเป็นช่องโหว่หรือไม่
Paŭlo Ebermann

1
@ PaŭloEbermannเพื่อที่จะไม่เป็นช่องโหว่คุณจะต้องนับตัวอักษรในล่ามหรือใช้การแปลด้วยล่ามในตัว> <> และฉันไม่คิดว่ามันจะมีอยู่จริง ^^
Katenkyo

คำตอบ:


4

JavaScript, ES6, 177 161 145 ไบต์

f=(s,i=1,M=[],D)=>D==5||!~M[O="indexOf"](D+i)&&f(s,i-[M.push(D+i),L=s[O]('|'),-L,1,-1][D=`431255${5-D+'X3412'[D]}`['><^v-|/\\'[O](s[i+L])]||D],M,D)

เราสามารถตรวจจับวัฏจักรโดยเดินลัดเลาะไปตามเส้นทางและตรวจสอบการซ้ำของทูเปิล

  • ที่ตั้ง
  • ทิศทางมาจาก

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

ทิศทางขึ้นลงซ้ายและขวาได้รับมอบหมายตัวเลข1, 2, และ3 4รหัสจะพิจารณาสัญลักษณ์ปัจจุบันที่กำลังเยี่ยมชม ( s[i+L]) และเปลี่ยนทิศทางปัจจุบัน ( D) จากนั้นทิศทางใหม่จะถูกใช้เพื่อเรียกใช้ฟังก์ชันแบบเรียกซ้ำและประเมินพื้นที่ถัดไป 5เป็นทิศทางที่บ่งบอกถึงกำแพงและการtrueสิ้นสุดของโปรแกรม

นี่คือคำอธิบายของโค้ดที่ไม่ค่อยตีกอล์ฟ:

f=
(s,     // input string
 i=1,   // current location as offset string index
 M=[],  // record of previously visited spaces
 D      // current direction
  )=>(
    L=s[O="indexOf"]('|'), // find arena width `L` by index of first `|`

    // if D is 5, return true, or...
    D==5 ||

    // if direction + position is not new, return false
    !~M[O](D+i) &&

    // otherwise, save this direction + position
    M.push(D+i) &&

    // recursively call `f` with new direction and position
    f(s,
      i-[,L,-L,1,-1][D=            // modify position based on active direction
        `431255${5-D+'X3412'[D]}`  // from these possible directions...
          [                        // chose the one at the index...
            '><^v-|/\\'[O](        // based on the index of the symbol 
                           s[i+L]  // of the current character
                                 )
          ]
        ||D     // or preserve old D if symbol is not directional
      ],
      M,D)

สตริง`431255${5-D+'X3412'[D]}`เท็มเพลตมีนิพจน์ที่ซ้อนกันที่จัดการมิรเรอร์: เนื่องจากทิศทางเป็นตัวเลขจึงสามารถใช้เป็นดัชนีได้ นิพจน์'X3412'[D]ประเมินถึงอักขระที่ 8 ในสตริงทิศทางที่เป็นไปได้และดังนั้นจึงสอดคล้องกับ\อักขระที่ 8 ในสตริงสัญลักษณ์'><^v-|/\\') การแสดงออกกล่าวว่า

  • หากทิศทางปัจจุบันDเป็น1(ขึ้น) จากนั้นทิศทางใหม่ในการกดปุ่ม\กระจกจะเป็น3(ซ้าย)
  • หากทิศทางปัจจุบันDคือ2(ลง) จากนั้นทิศทางใหม่ในการกดปุ่ม\กระจกจะเป็น4(ขวา)
  • เป็นต้น

กระจกอื่น/จะใช้การแสดงออก'X4321'[D]แต่เนื่องจากมันเป็นเพียงการนับถอยหลังสั่งซื้อ4เราจึงสามารถแสดงได้ง่าย5-Dกว่า


5

ไม่สอดคล้อง> <> คำตอบ

คุณต้องการ> <> ฉันให้คุณ> <>!

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

ข้อพิจารณาเหล่านี้นำมาพิจารณาแล้วฉันตัดสินใจที่จะแก้ปัญหาที่เข้ากันได้กับ> <> ล่ามออนไลน์เพื่อที่จะยืนยันได้ว่าล่ามติดอยู่ในอินพุตหรือใช้เวลานานในการทำทุกอย่าง ฉันต้องเพิ่มบรรทัดต่อท้ายรหัสเพื่อให้ล่ามออนไลน์แสดงรหัสที่เพิ่มและไม่ผิดพลาดเมื่อพยายามเขียน

โอ้และตั้งแต่ฉันถูกตัดสิทธิ์อย่างชัดเจนโดยตอนนี้ฉันไม่ได้รำคาญกับการเล่นกอล์ฟรหัส

โดยไม่ต้องกังวลใจต่อรหัสในทุกสิริ:

50i:0(?v   :"^"=?v:"v"=?v:">"=?v:"<"=?v:"/"=?v:"\"=?v:"|"=?v:"-"=?va=?v1+10.
>.!603f<         v"."~                                     <      <   >~1+010.
>.!01+1p}:$}:}v! <      <      <      <      <      <
  ;oooo"true" <<
              ^

หากต้องการใช้งานให้คัดลอกมันในล่ามออนไลน์เพิ่มบรรทัดต่อท้ายที่เพียงพอเพื่อจัดการอินพุตของคุณส่งรหัสให้อินพุตเป็น;-separated linesและเพลิดเพลินกับการขับขี่

การทดสอบบางอย่าง:

กับ

+--------------------+
|>\/  this way >\/>  | this one ends here
| v^            \/   |
| v^   ^.^           |
| \/\         >v     |
| /\/         ^<     |
+--------------------+` 

codespace สุดท้าย:

50i:0(?v   :"^"=?v:"v"=?v:">"=?v:"<"=?v:"/"=?v:"\"=?v:"|"=?v:"-"=?va=?v1+10.
>.!603f<         v"."~                                     <      <   >~1+010.
>.!01+1p}:$}:}v! <      <      <      <      <      <
  ;oooo"true" <<
            ^
 ....................
.>\/           >\/>  .                   
. v^            \/   .
. v^   ^ ^           .
. \/\         >v     .
. /\/         ^<     .
 ....................

เอาต์พุต "true" และ stop


กับ

+--------+
|>>\ This|
|\\   is |
|  \\ a  |
| \ /trap| 
+--------+

codespace สุดท้าย:

50i:0(?v   :"^"=?v:"v"=?v:">"=?v:"<"=?v:"/"=?v:"\"=?v:"|"=?v:"-"=?va=?v1+10.
>.!603f<         v"."~                                     <      <   >~1+010.
>.!01+1p}:$}:}v! <      <      <      <      <      <
  ;oooo"true" <<
            ^
 ........ 
.>>\     .
.\\      .
.  \\    .
. \ /    .
 ........

ลูปตลอดไป


แม้ว่ามันจะไม่เป็นไปตามมาตรฐาน แต่ฉันรักที่มาของคุณ! ขอบคุณสำหรับรายการนี้! มันเป็นเรื่องน่าเศร้าที่มันวนซ้ำไปตลอดกาลเมื่อมันควรจะบ้า แต่ก็ยังทำได้ดีอยู่ดี ^^
Katenkyo

ฉันอัพเดทล่ามปลาออนไลน์ ตอนนี้รองรับอินพุตหลาย
บรรทัด

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