Шляхи та витрата часу


22

Приміщення

Тож нещодавно я був приблизно на півгодини рано на зустріч і вирішив почекати на вулиці. Я також визначив, що це буде дивно виглядати, якби я просто нерухомо стояв перед будинком. Тому я вирішив піти на швидку прогулянку, в межах обмеженої зони. Я також зробив висновок, що якби я почав ходити по колах, це дало б зрозуміти, що я граю. Тож я надихнувся створити свій перший виклик Code Golf.

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

Вам буде наданий список, карта місцевості, яка буде містити " "або "#", які являють собою вільні пробіли та певні перешкоди. Вільні пробіли можна перетнути лише один раз, і на це потрібно 1 хвилина. Ваша початкова позиція буде позначена "@"традицією, що нагадує шахрайство, а ціль буде представлена ​​символом, "$"тому що ви там збираєтесь втратити. Вам також дадуть ціле число, яке відображатиме скільки хвилин вам доведеться витратити, перш ніж здаватися, ніби ви втручаєтесь. Коли ви приземлитесь на"$", це повинно бути точну кількість хвилин (тому, якщо ви відраховували, на сусідній плитці вона повинна бути 1, а на плитці - 0). Завжди можна буде дістатися до пункту призначення. Вашій програмі або функції доведеться повернути список, який показує найкоротший шлях з <,>, ^ і v, щоб представляти чотири можливі напрямки.

Приклади

Вхід:

[[" ", " ", " ", " "],
 ["@", " ", " ", "$"],
 [" ", " ", " ", " "],
 [" ", " ", " ", " "]]

і

5

Вихід:

[[">", ">", ">", "v"],
 ["^", " ", " ", "$"],
 [" ", " ", " ", " "],
 [" ", " ", " ", " "]]

Вхід:

[[" ", "#", " ", " ", " "],
 [" ", "#", " ", " ", " "],
 ["@", "#", " ", "$", " "],
 [" ", " ", " ", " ", " "],
 [" ", "#", " ", " ", " "],
 [" ", "#", " ", " ", " "]]

і

7

Вихід:

[[" ", "#", " ", " ", " "],
 [" ", "#", ">", "v", " "],
 ["v", "#", "^", "$", " "],
 [">", ">", "^", " ", " "],
 [" ", "#", " ", " ", " "],
 [" ", "#", " ", " ", " "]]

Вхід:

[[" ", "#", " ", " ", " "],
 [" ", "#", " ", " ", " "],
 ["@", "#", " ", "$", " "],
 [" ", " ", " ", " ", " "],
 [" ", "#", " ", " ", " "],
 [" ", "#", " ", " ", " "]]

і

17

Вихід:

[[" ", "#", " ", "v", "<"],
 [" ", "#", " ", "v", "^"],
 ["v", "#", " ", "$", "^"],
 [">", ">", "v", ">", "^"],
 [" ", "#", "v", "^", "<"],
 [" ", "#", ">", ">", "^"]]

Правила

  • Застосовуються стандартні лазівки
  • Кожну плитку потрібно перемістити лише один раз
  • Точну кількість часу необхідно провести на дошці
  • У випадку кількох шляхів потрібно відображати лише один шлях
  • Це кодове питання про гольф, тому найкоротша відповідь виграє
  • Відповідно до запитання користувача202729 у коментарях, ви можете припустити правильну інформацію.

Додайте коментар, якщо потрібні додаткові роз'яснення


1
Чи гарантується, що "Завжди можна буде дістатися до пункту призначення в зазначений час "?
користувач202729

Так, так буде, завжди буде спосіб, навіть якщо
згорнувся

5
Ласкаво просимо до PPCG! :) Приємний перший виклик.
Джузеппе

Що сталося з півхвилини на кожному кінці ?! (не потрібно нічого змінювати, якщо це не очевидно)
Джонатан Аллан

Відповіді:


6

JavaScript (ES6), 171 байт

Здійснює введення в синтаксис currying (a)(n). Виводиться шляхом зміни вхідної матриці.

a=>g=(n,y=a[F='findIndex'](r=>~(i=r[F](v=>v>'?'))),x=i,R=a[y])=>!n--|[-1,0,1,2].every(d=>(R[x]='<^>v'[d+1],(c=(a[Y=y+~-d%2]||0)[X=x+d%2])<1?g(n,Y,X):n|c!='$')&&(R[x]=' '))

Спробуйте в Інтернеті!

Прокоментував

a =>                           // a[] = input matrix
g = (                          // g = recursive function taking:
  n,                           //   n = number of remaining moves
                               //   (x, y) = current coordinates, initialized as follows:
  y = a[F = 'findIndex'](r =>  //     y = index of the row containing the starting point,
    ~(i = r[F](v => v > '?'))  //         found by iterating over all rows r until we
  ),                           //         find some i such that r[i] > '?'
  x = i,                       //     x = index of the column of the starting point
  R = a[y]                     //   R[] = current row
) =>                           //
  !n-- |                       // decrement n; force failure if we're out of moves
  [-1, 0, 1, 2].every(d =>     // for each direction d, where -1 = left, 0 = up,
    (                          // 1 = right and 2 = down:
      R[x] = '<^>v'[d + 1], (  //   update the current cell with the direction symbol
        c = (                  //   c = content of the new cell at (X, Y) with:
          a[Y = y + ~-d % 2]   //     Y = y + dy
          || 0                 //     (use a dummy value if this row does not exist)
        )[X = x + d % 2]       //     X = x + dx
      ) < 1 ?                  //   if c is a space:
        g(n, Y, X)             //     we can go on with a recursive call
      :                        //   else:
        n | c != '$'           //     return false if n = 0 and we've reached the target
    ) &&                       //   unless the above result is falsy,
    (R[x] = ' ')               //   restore the current cell to a space
  )                            // end of every()

5

Python 2 , 310 256 байт

Дякую @cairdcoinheringaahing за except:03 байти
Дякуємо @Mnemonic за -8 байт
Дякуємо @JonathanAllan за -3 байти
Дякую @ovs за -5 байт

G,L=input()
R=[]
def S(x,y,G,c,R):
 try:
	if x>-1<y<G[y][x]in' @':i=0;exec"T=[r[:]for r in G];T[y][x]='<v^>'[i];S(x+~-i/2,y+~-(i^2)/2,T,c-1,R);i+=1;"*4
	R+=[G]*(0==c<'$'==G[y][x])
 except:0
for i,y in enumerate(G):"@"in y>S(y.index("@"),i,G,L,R)
print R[0]

Спробуйте в Інтернеті!

Деякі пояснення:

try-exceptвикористовується для того, щоб xі yкоординати, і координати були в межах. Виняток буде підвищено після доступу до G[y][x]. Python занадто хороший і негативні показники прийнятні, тому перевірка x>-1<yдодана.

T=[r[:]for r in G]використовується для створення копії Gзначень

~-i/2і ~-(i^2)/2використовуються для генерації пар (-1, 0), (0, 1), (0, -1), (1, 0), які раніше рухалися по сітці (все одно має бути коротший шлях!)

R+=[G]*(0==c<'$'==G[y][x])перевірити, що '$'досягається необхідною кількістю кроків. Rвикористовується для отримання цього результату від рекурсивних викликів функцій.

for i,y in enumerate(G):"@"in y>S(y.index("@"),i,G,L,R)Знайдено xі yз '@'у вхідній і виклику функції S.

print R[0] R може містити більше одного рішення, тому виведіть лише спочатку



1
Ви можете зберегти байт, замінивши if G[y][x]=='$':на if'$'==G[y][x]:.

1
Насправді всю цю умову можна замінити R+=(G[y][x]=='$')*(c==0)*[G]на інший байт.

1
Так, не впевнений, що я бачив. Ви можете зберегти пару байтів у першому стані за допомогоюif(x>-1<y)*(G[y][x]in' @'):

1
Більш коротким шляхом y+cmp(i%2,i/2)буде ваш y+~-(i^2)/2; там все-таки може бути коротше.
Джонатан Аллан

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.