Etkileşimli Labirent Çözücü


13

Bob kaçırıldı ve bir labirentte kaldı. Senin işin bir çıkış yolu bulmasına yardım etmek. Ama çok karanlık ve korkutucu bir labirent olduğu için hiçbir şey göremiyor. Duvarları sadece içine girdiğinde hissedebilir ve çıkışı ne zaman bulduğunu bilir, ancak bundan daha fazlasını bilmez.

Programınızı bellekle çalıştırması gerektiğinden, olabildiğince kısa olmalıdır.

Not: Bu sorunu http://acmgnyr.org/year2016/problems.shtml adresinden aldım , ancak biraz uyarladım ve hakim programı / test davalarını kendim yazdım.

Şartname

  • Bu etkileşimli bir sorundur, bu nedenle program stdout'a hamle çıkarır ve stdin'den yanıtlar alırsınız.
  • Hamle Programınız olabilir çıkış biri right, left, down, up.
  • Daha sonra aşağıdakilerden birini girdi olarak alacaktır:
    • wall- bu Bob'un bir duvara çarptığı anlamına gelir. Bob aynı yerde kalacak.
    • solved- Bob çýkýţ buldu! Programınız artık başka bir şey yazdırmadan da çıkmalıdır.
    • ok - Bob verilen yönde hareket edebildi.
  • Labirentten çıkış yoksa programınız no exitBob'tan vazgeçmesi gerektiğini bildirmek için çıktı almalıdır. Programınız başka bir şey yazdırmadan çıkmalıdır.
  • Bob çıkmak için acele ettiğinden, programınız herhangi bir yabancı hareket yapmamalıdır. Başka bir deyişle, programınızın aynı kareden iki kez aynı yönde hareket etmesine izin verilmez .
  • Bu , bu yüzden en kısa program kazanır!

Örnekler

Aşağıdaki örneklerde, Sbaşlangıç ​​karesi, Xçıkış, #bir duvar ve boşluklar geçerli karelerdir. Tek bir doğru cevap olmadığından, bunlar sadece bir çözümün örnek örnekleridir. Ayrıca labirentin çizimlerinin sadece görmeniz için orada olduğunu ve programınızın bunları girdi olarak almayacağını unutmayın.

########
#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

Kontrol Programı

  • Python'da bir çözüm denetleyicisi yazdım. Https://gist.github.com/Maltysen/f0186019b3aa3812d812f8bb984fee19 adresinde bulabilirsiniz .
  • Gibi çalıştırın python mazechecker.py ./mazesolver.
  • Programınız adlı bir klasördeki tüm labirentlerde test edecektir mazes.
  • Labirentler yukarıdan aynı formatta ayrı dosyalardadır.
  • Yukarıda listelenen tüm koşulları kontrol eder ve çözümünüzün herhangi birini ihlal edip etmediğini size bildirir.
  • İle ek tanılama bilgileri yazdırmasını sağlayabilirsiniz python mazechecker.py -d ./mazesolver.
  • Burada sıkıştırılmış bir mazesklasör bulabilirsiniz . İsterseniz buna kendiniz de ekleyebilirsiniz.

1
Muhtemelen sorunun bir CC-BY-NA-SA lisansı altında yayınlandığını açıkça belirtmek gerekir ve bu nedenle remixiniz mutlaka aynı lisans altındadır.
Nick Kennedy

3
solvedÇıktı alırken bir süre alabilir miyiz no exit? Eğer öyleyse lütfen sadece test durumlarında değil, kurallarda da belirtin!
wastl

1
" Programınızın aynı kareden iki kez aynı yönde hareket etmesine izin verilmiyor. " Bununla ilgili iki soru var: 1. Diyelim ki pozisyondayım x,yve upcevapla wall, sonra righttekrar cevapla wall, sonra uptekrar deneyebilir miyim , veya sadece leftve downhenüz bu meydandan taşınmaz beri hala kullanılabilir?
Kevin Cruijssen

1
2. Diyelim ki bu labirentim var . Bu akışla: sağ (ok); tamam peki); sağ (duvar); yukarı (tamam) ; yukarı (tamam); yukarı (duvar); sol (duvar); aşağı (ok); aşağı (ok); aşağı (ok); aşağı (ok); aşağı (duvar); sağ (duvar); yukarı (tamam); yukarı (tamam); Daha önce o belirli kareden daha önce (kalın olanda) yapmış olmama rağmen tekrar yukarı çıkmama izin veriliyor mu?
Kevin Cruijssen

1
@KevinCruijssen Cevabımda nereden geldiğimi açıkça takip etmiyorum. Bunun yerine, her bir karede işlenen tüm yönleri izlerim ve önce beklenmedik kareleri denerim. Tüm ziyaret edilmemiş kareler denendiğinde, geriye kalan tek yasal hamle nereden geldiğimdir (daha önce ziyaret edildi, ancak bu yönde değil).
Arnauld

Yanıtlar:


7

JavaScript (ES6),  180  174 bayt

Kullanımları prompt()çıkışına yön ve sonuç almak.

_=>(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])

Çevrimiçi deneyin! (otomatik I / O ile)

Etkileşimli snippet

UYARI : Bu kod, 'çözüldü' girilene veya işlev hiç çıkış olmadığını anlayana kadar bir istem () iletişim kutusu görüntüler.

(
_=>(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])
)()

Yorumlananlar

_ => (                      // 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)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.