Interactive Maze Solver


13

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

เนื่องจากเขาต้องเรียกใช้โปรแกรมของคุณด้วยหน่วยความจำจึงต้องสั้นที่สุด

หมายเหตุ: ฉันใช้ปัญหานี้จากhttp://acmgnyr.org/year2016/problems.shtmlแต่ปรับใช้เล็กน้อยและเขียนโปรแกรมผู้พิพากษา / กรณีทดสอบด้วยตัวเอง

สเปค

  • นี่เป็นปัญหาเชิงโต้ตอบดังนั้นโปรแกรมของคุณจะส่งออกไปยัง stdout และรับคำตอบจาก stdin
  • โปรแกรมหนึ่งเอาท์พุทของคุณสามารถของการย้ายright, left, ,downup
  • จากนั้นจะได้รับเป็นอินพุตอย่างใดอย่างหนึ่งต่อไปนี้:
    • wall- นี่หมายความว่าบ็อบชนกำแพง บ๊อบจะอยู่ในที่เดียวกัน
    • solved- บ๊อบพบทางออกแล้ว! โปรแกรมของคุณควรออกโดยไม่ต้องพิมพ์อะไรอีก
    • ok - บ๊อบสามารถเคลื่อนที่ในทิศทางที่กำหนดได้
  • หากเขาวงกตไม่มีทางออกโปรแกรมของคุณควรส่งออกno exitเพื่อแจ้งให้ Bob รู้ว่าเขาควรยอมแพ้ โปรแกรมของคุณควรออกโดยไม่ต้องพิมพ์อะไรอีก
  • เนื่องจากบ็อบกำลังรีบออกไปโปรแกรมของคุณจึงไม่ควรเคลื่อนไหวออกไปภายนอก ในคำอื่น ๆโปรแกรมของคุณไม่ได้รับอนุญาตให้ย้ายไปในทิศทางเดียวกันจากตารางเดียวกันสองครั้ง
  • นี่คือโปรแกรมที่สั้นที่สุดชนะ!

ตัวอย่าง

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

########
#S     #
###### #
     # #
     #X#

right
              ok
right
              ok
right
              ok
right
              ok
right
              ok
right
              wall
down
              ok
right
              wall
down
              ok
right
              wall
down
              solved

#####
# S #
#####

right
              ok
right
              wall
down
              wall
up
              wall
left
              ok
down
              wall
up
              wall
left
              ok
down
              wall
up
              wall
left
              wall
right
              ok
no exit
              solved

###############################
#S                            #
##############       ###      #
             #       #X#      #
             #                #
             ##################

right
              ok
right
              ok
right
              ok
right
              ok
right
              ok
right
              ok
right
              ok
right
              ok
right
              ok
right
              ok
right
              ok
right
              ok
right
              ok
right
              ok
right
              ok
right
              ok
right
              ok
right
              ok
right
              ok
right
              ok
right
              ok
right
              ok
right
              ok
right
              ok
right
              ok
right
              ok
right
              ok
right
              ok
right
              wall
down
              ok
right
              wall
down
              ok
right
              wall
down
              ok
right
              wall
down
              wall
left
              ok
down
              wall
up
              ok
up
              ok
left
              ok
down
              ok
down
              ok
down
              wall
left
              ok
down
              wall
up
              ok
up
              ok
left
              ok
down
              ok
down
              ok
down
              wall
left
              ok
down
              wall
up
              ok
up
              ok
left
              wall
down
              ok
left
              wall
down
              ok
left
              ok
down
              wall
up
              wall
left
              ok
down
              wall
up
              solved

โปรแกรมตรวจสอบ

  • ฉันเขียนตัวตรวจสอบวิธีแก้ไขใน Python คุณสามารถค้นหาได้ที่https://gist.github.com/Maltysen/f0186019b3aa3812d812f8bb984fee19
  • เรียกใช้เหมือนpython mazechecker.py ./mazesolverกัน
  • mazesมันจะทดสอบโปรแกรมของคุณในเขาวงกตทั้งหมดที่อยู่ในโฟลเดอร์ที่เรียกว่า
  • เขาวงกตอยู่ในไฟล์แยกต่างหากในรูปแบบเดียวกันจากด้านบน
  • มันจะตรวจสอบเงื่อนไขทั้งหมดที่ระบุไว้ข้างต้นและแจ้งให้คุณทราบหากการแก้ปัญหาของคุณละเมิดใด ๆ
  • python mazechecker.py -d ./mazesolverคุณสามารถมีได้พิมพ์ข้อมูลการวินิจฉัยเพิ่มเติมกับ
  • คุณสามารถค้นหาซิปmazesโฟลเดอร์ที่นี่ คุณสามารถเพิ่มของคุณเองหากคุณต้องการ

1
อาจเป็นเรื่องที่ควรระบุว่าปัญหานั้นเผยแพร่ภายใต้ใบอนุญาต CC-BY-NA-SA ดังนั้นการเรียบเรียงเสียงของคุณจึงจำเป็นต้องอยู่ภายใต้ใบอนุญาตเดียวกัน
Nick Kennedy

3
เราจะได้รับsolvedเมื่อส่งออกno exitหรือไม่ ถ้าเป็นเช่นนั้นโปรดระบุไว้ในกฎไม่ใช่เฉพาะในกรณีทดสอบ!
สูญเสีย

1
" โปรแกรมของคุณไม่ได้รับอนุญาตให้ย้ายไปในทิศทางเดียวกันจากจตุรัสเดียวกันสองครั้ง " คำถามสองข้อเกี่ยวกับเรื่องนี้: 1. สมมติว่าฉันอยู่ในตำแหน่งx,yและไปupพร้อมตอบกลับwallจากนั้นrightตอบกลับอีกครั้งwallฉันขอลองupอีกครั้งได้ไหม หรือเป็นเพียงleftและdownยังคงใช้ได้ตั้งแต่ฉันยังไม่ได้ย้ายจากสแควร์นี้หรือยัง
Kevin Cruijssen

1
2. สมมุติว่าฉันมีเขาวงกตนี้ ด้วยโฟลว์นี้: ถูกต้อง (ok); ถูกต้อง (ok); ขวา (ผนัง); ขึ้น (ok) ; ขึ้น (ok); ขึ้น (ผนัง); ซ้าย (ผนัง); ลง (ตกลง); ลง (ตกลง); ลง (ตกลง); ลง (ตกลง); ลง (ผนัง); ขวา (ผนัง); ขึ้น (ok); ขึ้น (ok); ตอนนี้ฉันได้รับอนุญาตให้ขึ้นไปอีกแม้ว่าฉันจะทำจากสี่เหลี่ยมจัตุรัสนั้นมาก่อน (ที่ตัวหนา) แล้วหรือยัง?
Kevin Cruijssen

1
@KevinCruijssen ฉันไม่ได้ติดตามอย่างชัดเจนว่าฉันมาจากไหนในคำตอบของฉัน แต่ฉันติดตามทุกทิศทางที่ถูกประมวลผลในแต่ละตารางและฉันลองสี่เหลี่ยมที่ไม่เคยดูก่อน เมื่อได้ลองสี่เหลี่ยมที่ไม่ได้รับการเข้าชมแล้วการเคลื่อนไหวทางกฎหมายที่เหลืออยู่เพียงอย่างเดียวก็คือที่มาของฉัน (เข้าชมแล้ว แต่ไม่ใช่ไปในทิศทางนี้)
Arnauld

คำตอบ:


7

JavaScript (ES6),  180  174 ไบต์

ใช้prompt()เพื่อแสดงทิศทางและดึงผลลัพธ์

_=>(g=p=>[...'012301234'].some((d,i)=>g[p]>>d&1|i<4&g[P=[p[0]+(d-2)%2,p[1]+~-d%2]]>0?0:(r=prompt('up/left/down/right/no exit'.split`/`[g[p]|=1<<d,d]))<'s'?g(P):r<'t'))([0,0])

ลองออนไลน์! (ด้วย I / O อัตโนมัติ)

ตัวอย่างแบบโต้ตอบ

คำเตือน : รหัสนี้จะแสดงกล่องโต้ตอบ prompt () จนกว่าจะป้อน 'แก้ไข' หรือฟังก์ชั่นการคิดออกว่าไม่มีทางออกใด ๆ

(
_=>(g=p=>[...'012301234'].some((d,i)=>g[p]>>d&1|i<4&g[P=[p[0]+(d-2)%2,p[1]+~-d%2]]>0?0:(r=prompt('up/left/down/right/no exit'.split`/`[g[p]|=1<<d,d]))<'s'?g(P):r<'t'))([0,0])
)()

แสดงความคิดเห็น

_ => (                      // anonymous function taking no argument
  g = p =>                  // g = recursive function taking the current position p = [x, y]
    [ ...'0123',            // i<4  : try to move on squares that haven't been visited yet
      ...'0123',            // 3<i<8: try to go back to where we initially came from
      ...'4'                // i=8  : if everything failed, there must be no exit
    ].some((d, i) =>        // for each direction d at index i:
      g[p] >> d & 1         //   if this direction was already tried at this position
      | i < 4 &             //   or i is less than 4 and
      g[P = [               //   the square at the new position P = [X, Y] with:
        p[0] + (d - 2) % 2, //     X = x + dx[d]
        p[1] + ~-d % 2      //     Y = y + dy[d]
      ]] > 0 ?              //   was already visited:
        0                   //     abort
      : (                   //   else:
        r = prompt(         //     output the direction:
          [ 'up',           //       0 = up
            'left',         //       1 = left
            'down',         //       2 = down
            'right',        //       3 = right
            'no exit'       //       4 = no exit
          ][                //
            g[p] |= 1 << d, //       mark this direction as used
            d               //       d = actual index of the string to output
          ]                 //     r = result of prompt()
        )                   //
      ) < 's' ?             //     if r = 'ok':
        g(P)                //       do a recursive call at the new position
      :                     //     else:
        r < 't'             //       yield true if r = 'solved' or false if r = 'wall'
    )                       // end of some()
)([0, 0])                   // initial call to g at (0, 0)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.