Інтерактивний лабіринт Solver


13

Боба викрали і застрягли в лабіринті. Ваше завдання - допомогти йому знайти вихід. Але оскільки це дуже темний і страшний лабіринт, він нічого не може побачити. Він може відчувати стіни лише тоді, коли набігає на нього, і знає, коли знайшов вихід, але нічого іншого не знає.

Оскільки він повинен запускати вашу програму по пам'яті, вона повинна бути якомога коротшою.

Примітка. Я взяв цю проблему з http://acmgnyr.org/year2016/problems.shtml , але трохи її адаптував, і сам написав програму / тестові справи судді.

Специфікація

  • Це інтерактивна проблема, тому ви програму буде виводити рухи до stdout і приймати відповіді від stdin.
  • Ваша програма може виводити один з ходів right, left, down, up.
  • Потім він отримає як вхід одне з наступних:
    • wall- це означає, що Боб вдарився об стіну. Боб залишиться там же.
    • solved- Боб знайшов вихід! Тепер ваша програма також повинна вийти, не друкуючи нічого іншого.
    • ok - Боб зміг рухатися в заданому напрямку.
  • Якщо в лабіринті немає виходу, ваша програма повинна вийти, no exitщоб повідомити Бобу, що він повинен відмовитися. Потім ваша програма повинна вийти, не друкуючи нічого іншого.
  • Оскільки Боб поспішає виходити, ваша програма не повинна робити жодних сторонніх рухів. Іншими словами, вашій програмі не дозволяється двічі рухатися в одному напрямку з одного і того ж квадрата .
  • Це , тому найкоротша програма виграє!

Приклади

У наступних прикладах 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, і тому ваш ремікс обов'язково має ту саму ліцензію.
Нік Кеннеді

3
Чи отримуємо ми solvedпри виведенні no exit? Якщо так, будь ласка, вкажіть це в правилах, а не тільки в тестових випадках!
wastl

1
" Вашій програмі заборонено рухатись в одному напрямку з одного і того ж квадрата двічі ". Два питання щодо цього: 1. Скажімо, я перебуваю на позиції x,yта йдіть up, відповідайте wall, потім rightзнову відповідайте wall, чи можу я спробувати upще раз, або доступні лише leftта downє, оскільки я ще не переїхав з цієї площі?
Kevin Cruijssen

1
2. Скажімо, у мене цей лабіринт . З цим потоком: праворуч (нормально); праворуч (ок); права (стіна); вгору (гаразд) ; вгору (гаразд); вгору (стіна); зліва (стіна); вниз (добре); вниз (добре); вниз (добре); вниз (добре); вниз (стіна); права (стіна); вгору (гаразд); вгору (гаразд); Мені зараз знову дозволено підніматися вгору, хоча я вже з цього конкретного квадрата раніше (на сміливому)?
Кевін Крейссен

1
@KevinCruijssen Я не чітко відслідковую, звідки я прийшов у своїй відповіді. Натомість я стежу за всіма напрямками, які були оброблені на кожній площі, і спробую спочатку невидимі квадрати. Коли всі невідомі сквери були випробувані, єдиний законний хід - це те, звідки я прийшов (вже відвідав, але не в цьому напрямку).
Арнольд

Відповіді:


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])

Спробуйте в Інтернеті! (з автоматизованим введенням-виведенням)

Інтерактивний фрагмент

ПОПЕРЕДЖЕННЯ : цей код буде відображати діалогове вікно підказки (), поки не буде введено "вирішено" або функція з'ясує, що виходу взагалі немає.

(
_=>(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)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.