Ok labirent kaçış


14

Soru

50 x 50 karakterlik bir diziniz var. Her hücrenin dört yönden herhangi birini gösteren bir oku vardır. Boş hücre yok. Hücreye girerken, okla belirtilen yönde çıkmalısınız. Ok aynı zamanda geldiğiniz yönü göstererek çıkmaz bir noktaya yol açabilir.

Labirentin en dış kenarındaki herhangi bir hücreden başlayıp sizi labirente götüren ve başka bir hücreden çıkmanıza neden olan bir yol bulabilirsiniz. Girdi, <,>, ^ ve v'yi içeren bir dizi olarak verilecektir. Çıktı, tek bir basamak (Boole, tamsayı veya karakter, her şey yapacaktır) 0 (görevin imkansız olduğunu gösterir) veya 1 ( görevi yerine getirdi).

Örnek (gerçek dizi bundan daha büyük olacaktır)

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

Çıktı

1
sağdaki <işaretinden girebileceğiniz için alttan v çıkmanıza neden olur "<v v" yolu ile

Görev, labirenti girdi olarak alacak en kısa kodu yazmak ve kurallarda belirtildiği gibi içinde bir yolun nerede olduğunu belirlemek ve tek bir basamak 0 veya 1 çıktısını vermektir.

Gerçek basamaklar yerine DOĞRU ve YANLIŞ çıkmasına da izin verilir.


6
Çalışmak için bazı gerçek test
Liam

Giriş bir boyutlu bir dizi mi yoksa iki boyutlu bir dizi mi? Sağa yalnızca <ile girebilir misiniz yoksa ^ ile de girebilir misiniz?
bobbel

@bobbel Girdi, daha kısa bir kod için hangisi gerekiyorsa 1 veya 2 boyutlu bir dizi olarak verilebilir. Kodu kısaltabilirse, oklar bile <> ^ v yerine 1 2 3 4 olarak girilebilir. Ve evet, ^ ile de girebilirsiniz.
ghosts_in_the_code

1
Rastgele 50 ila 50'lik bir dizinin bir çözümü olmayacağı olasılığı yaklaşık 0'dır. Çözeltinin en az belirli sayıda adımı olmasını veya kullanıcının çözüm yolunu belirtmesini isterseniz daha iyi olur.
DavidC

1
Buna "Ok kaçışı" denilmeliydi ... Hala bir çözüm düşünüyor.
beher

Yanıtlar:


6

CJam, 89 81 bayt

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

CJam yorumlayıcısında çevrimiçi deneyin .

Nasıl çalışır

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