Paths & Wasting Time

22

Premis

Jadi baru-baru ini saya sekitar setengah jam lebih awal untuk membuat janji, dan memutuskan untuk menunggu di luar. Saya juga memutuskan bahwa itu akan terlihat aneh jika saya hanya berdiri tanpa bergerak di depan rumah. Karena itu, saya memutuskan untuk berjalan cepat, dalam area terbatas. Saya juga menyimpulkan bahwa jika saya mulai berjalan dalam lingkaran itu akan membuat jelas bahwa saya berkeliaran. Jadi saya terinspirasi untuk membuat tantangan Golf Code pertama saya.

Spesifikasi

Anda akan diberikan daftar, peta area, yang akan berisi salah satu " "atau "#", yang mewakili ruang bebas dan semacam rintangan. Ruang bebas hanya dapat dilintasi satu kali, dan dibutuhkan 1 menit untuk melewatinya. Posisi awal Anda akan ditandai dengan "@"tradisi per roguelike, dan target akan diwakili dengan a "$"karena itulah yang akan Anda kehilangan di sana. Anda juga akan diberikan bilangan bulat yang akan mewakili berapa menit Anda harus membuang sebelum tidak tampak seolah-olah Anda mengganggu. Ketika Anda mendarat di"$", itu harus menjadi jumlah menit yang tepat (jadi jika Anda menghitung mundur, itu harus 1 pada ubin yang berdekatan, dan menjadi 0 pada ubin). Akan selalu mungkin untuk mencapai tujuan. Program atau fungsi Anda harus mengembalikan daftar yang menunjukkan jalur terpendek dengan <,>, ^, dan v untuk mewakili empat kemungkinan arah.

Contohnya

Memasukkan:

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

dan

5

Ouput:

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

Memasukkan:

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

dan

7

Keluaran:

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

Memasukkan:

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

dan

17

Keluaran:

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

Aturan

  • Celah standar berlaku
  • Setiap ubin hanya boleh dipindahkan satu kali
  • Jumlah waktu yang tepat harus dihabiskan di papan tulis
  • Hanya satu jalur yang perlu ditampilkan dalam kasus beberapa jalur
  • Ini adalah pertanyaan kode golf sehingga jawaban terpendek menang
  • Sesuai pertanyaan user202729 dalam komentar, Anda dapat menerima input yang valid.

Tambahkan komentar jika diperlukan klarifikasi lebih lanjut

LForchini
sumber
1
Apakah dijamin bahwa "Akan selalu mungkin untuk mencapai tujuan pada waktu yang ditentukan "?
user202729
Ya, pasti akan, selalu ada jalan, bahkan jika berbelit
LForchini
5
Selamat datang di PPCG! :) Tantangan pertama yang bagus.
Giuseppe
Apa yang terjadi pada setengah menit di setiap akhir ?! (tidak perlu mengubah apa pun jika tidak jelas)
Jonathan Allan

Jawaban:

6

JavaScript (ES6), 171 byte

Mengambil input dalam sintaks currying (a)(n). Output dengan memodifikasi matriks input.

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

Cobalah online!

Berkomentar

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()
Arnauld
sumber
5

Python 2 , 310 256 byte

Terima kasih @cairdcoinheringaahing untuk except:0-3 byte
Terima kasih @Mnemonic untuk -8 byte
Terima kasih @Jonathan
Allan untuk -3 byte Terima kasih @ovs untuk -5 byte

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]

Cobalah online!

Beberapa penjelasan:

try-exceptdigunakan untuk memastikan, bahwa keduanya xdan ykoordinat berada dalam batas. Pengecualian akan dimunculkan pada akses ke G[y][x]. Python terlalu baik dan indeks negatif dapat diterima, jadi centang x>-1<yditambahkan.

T=[r[:]for r in G]digunakan untuk membuat salinan dari Gnilai-nilai

~-i/2dan ~-(i^2)/2digunakan untuk menghasilkan pasangan (-1, 0), (0, 1), (0, -1), (1, 0), yang digunakan untuk bergerak dalam kotak (masih harus ada cara yang lebih pendek!)

R+=[G]*(0==c<'$'==G[y][x])periksa, yang '$'tercapai dalam sejumlah langkah yang diperlukan. Rdigunakan untuk mendapatkan hasil ini dari panggilan fungsi rekursif.

for i,y in enumerate(G):"@"in y>S(y.index("@"),i,G,L,R)Ditemukan xdan ydari '@'fungsi input dan panggilan S.

print R[0] R mungkin mengandung lebih dari satu solusi, jadi output pertama saja

Possum Mati
sumber
-4 byte
caird coinheringaahing
1
Anda dapat menyimpan byte dengan menggantinya if G[y][x]=='$':dengan if'$'==G[y][x]:.
1
Sebenarnya, seluruh kondisi itu dapat diganti dengan R+=(G[y][x]=='$')*(c==0)*[G]byte lain.
1
Huh, tidak yakin apa yang saya lihat. Anda dapat menyimpan beberapa byte dalam kondisi pertama denganif(x>-1<y)*(G[y][x]in' @'):
1
Cara yang lebih pendek untuk Anda y+cmp(i%2,i/2)adalah y+~-(i^2)/2; mungkin masih ada yang lebih pendek.
Jonathan Allan
2

Python 2 , 264 261 251 249 byte

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

Cobalah online!

Chas Brown
sumber
1
@Arnauld: Ups! Terlalu mewah. Tetap.
Chas Brown