Codegolf - Пути И Трата Времени

  • Автор темы An2niy85
  • Обновлено
  • 21, Oct 2024
  • #1

Помещение

Недавно я пришел на встречу примерно на полчаса раньше и решил подождать снаружи. Я также решил, что это будет выглядеть странно, если я просто неподвижно буду стоять перед домом. Поэтому я решил пойти на небольшую прогулку по ограниченной территории. Я также пришел к выводу, что если бы я начал ходить кругами, было бы очевидно, что я слоняюсь. Поэтому я был вдохновлен на создание своего первого испытания Code Golf.

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

Вам будет предоставлен список, карта местности, которая будет содержать либо

 
 
 
 
 
 
 
 
 [[" ", "#", " ", "v", "<"],

[" ", "#", " ", "v", "^"],

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

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

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

[" ", "#", ">", ">", "^"]]
 
or 17 , которые представляют собой какие-то свободные пространства и препятствия. Свободное пространство можно пересечь только один раз, и на его прохождение уходит 1 минута. Ваше исходное положение будет обозначено значком [[" ", "#", " ", " ", " "], [" ", "#", " ", " ", " "], ["@", "#", " ", "$", " "], [" ", " ", " ", " ", " "], [" ", "#", " ", " ", " "], [" ", "#", " ", " ", " "]] per roguelike tradition, and the target will be represented with a [[" ", "#", " ", " ", " "], [" ", "#", ">", "v", " "], ["v", "#", "^", "$", " "], [">", ">", "^", " ", " "], [" ", "#", " ", " ", " "], [" ", "#", " ", " ", " "]] потому что это то, что вы потеряете там. Вам также будет дано целое число, которое будет обозначать, сколько минут вам придется потратить впустую, прежде чем не покажется, что вы вторгаетесь. Когда вы приземлитесь на 7 , it will have to have been the exact amount minutes (so if you were counting down, it will have to be 1 on an adjacent tile, and be 0 on the tile). It will always be possible to reach the destination. Your program or function will have to return a list showing the shortest path with <, >, ^, and v to represent the four possible directions.

Примеры

Вход:

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

и

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

Выход:

5

Вход:

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

и

"$"

Выход:

"$"

Вход:

"@"

и

"#"

Выход:

" "

Правила

  • Применяются стандартные лазейки
  • Каждую плитку можно перемещать только один раз.
  • Точное количество времени необходимо провести за доской.
  • В случае нескольких путей должен отображаться только один путь.
  • Это кодовый вопрос для игры в гольф, поэтому побеждает самый короткий ответ.
  • Согласно вопросу пользователя202729 в ​​комментариях, вы можете предположить правильный ввод.

Добавьте комментарий, если требуются дополнительные разъяснения

#код-гольф #поиск пути

An2niy85


Рег
10 Nov, 2023

Тем
63

Постов
194

Баллов
519
  • 26, Oct 2024
  • #2

JavaScript (ES6), 171 байт

Принимает входные данные в синтаксисе каррирования

 
 
 
 def f(a,n,r=-1,s=0):

j=len(a[0]);x=1;z=y=0

if r<0:s,r=divmod(sum(a,[]).index('@'),j)

for c in'>v<^':
	u=r+x;v=s+y;x,y=-y,x
	if j>u>-1<v<len(a):b=[e[:]for e in a];b[s][r]=c;w=a[v][u];z=n*(w<'!')and f(b,n-1,u,v)or n==1and w=='$'and b
	if z:return z
 
. Выходы путем изменения входная матрица.

R

Попробуйте онлайн!

Прокомментировал

print R[0] ||answer||

Питон 2, 310 256 байт

Спасибо @cairdcoinheringaahing за S -3 bytes
Спасибо @Mnemonic за -8 байт
Спасибо @JonathanAllan за -3 байта
Спасибо @ovs за -5 байт

'@'

Попробуйте онлайн!

Некоторые объяснения:

y is used to ensure, that both x и for i,y in enumerate(G):"@"in y>S(y.index("@"),i,G,L,R) coordinates are in boundaries. Exception will be raised upon access to R . Python слишком хорош, и отрицательные индексы приемлемы, поэтому проверьте '$' is added.

R+=[G]*(0==c<'$'==G[y][x]) used to create copy of (-1, 0), (0, 1), (0, -1), (1, 0) по ценностям

~-(i^2)/2 и ~-i/2 используются для создания пар G , that used to move in grid (все равно должен быть более короткий путь!)

T=[r[:]for r in G] check, that x>-1<y достигается за необходимое количество шагов. G[y][x] is used to get this result from recursive function calls.

y Found x and try-except of 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] в функции ввода и вызова except:0 .

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() 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]=' ')) может содержать более одного решения, поэтому сначала выведите результат

 

Egor123563


Рег
03 Jun, 2014

Тем
62

Постов
197

Баллов
537
Тем
403,760
Комментарии
400,028
Опыт
2,418,908

Интересно