Yollar ve Zaman Kaybı


22

Öncül

Son zamanlarda bir randevuya yarım saat erken kaldım ve dışarıda beklemeye karar verdim. Ayrıca evin önünde hareketsiz durduğumda garip göründüğünü de belirledim. Bu nedenle sınırlı bir alanda hızlı bir yürüyüşe çıkmaya karar verdim. Ayrıca dairelerde dolaşmaya başladığımda, dolandırıcılık yaptığımı açıklığa kavuşturan sonucuna vardım. Bu yüzden ilk Code Golf mücadelemi yaratmam için ilham aldım.

Şartname

Size, ya boş alanları ya " "da "#"bir çeşit engelleri temsil eden ya da içerecek bir alanın bir listesi verilecektir . Boş alanlar yalnızca bir kez geçilebilir ve geçmesi 1 dakika sürer. Başlangıçtaki pozisyonunuz, "@"her bir tuhaf geleneğe göre gösterilecek ve hedef orada temsil edilecek "$"çünkü orada kaybedeceğiniz budur. Ayrıca davetsiz misafir olmuş gibi görünmeden önce kaç dakika harcamanız gerektiğini temsil edecek bir tamsayı verilecektir. Karaya indiğinde"$"kesin dakikalar olması gerekir (eğer geri sayıyorsanız, bitişik bir karoda 1, karoda 0 olması gerekir). Hedefe ulaşmak her zaman mümkün olacaktır. Programınız veya işleviniz, mümkün olan dört yönü göstermek için <,>, ^ ve v ile en kısa yolu gösteren bir liste döndürmelidir.

Örnekler

Giriş:

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

ve

5

Çıkışı:

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

Giriş:

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

ve

7

Çıktı:

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

Giriş:

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

ve

17

Çıktı:

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

kurallar

  • Standart boşluklar uygulanır
  • Her karo sadece bir kez taşınmalıdır
  • Tahtada tam zaman harcanmalıdır
  • Birden çok yol olması durumunda yalnızca bir yolun gösterilmesi gerekir
  • Bu bir kod golf sorusu yani en kısa cevap kazanır
  • Yorumlardaki user202729 sorusuna göre geçerli bir girdi kabul edebilirsiniz.

Daha fazla açıklama gerekirse, bir yorum ekleyin


1
"Hedefe belirtilen sürede her zaman ulaşmak mümkün olacak" garantisi var mı ?
user202729

Evet, olacak,
katlanmış

5
PPCG'ye Hoşgeldiniz! :) Güzel ilk meydan okuma.
Giuseppe

Her iki tarafta da yarım dakikaya ne oldu? (eğer belli değilse bir şeyi değiştirmenize gerek yoktur)
Jonathan Allan

Yanıtlar:


6

JavaScript (ES6), 171 bayt

Körleme sözdiziminde girdi alır (a)(n). Giriş matrisini değiştirerek çıktılar .

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

Çevrimiçi deneyin!

Yorumlananlar

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 bayt

İçin @cairdcoinheringaahing sayesinde except:0-3 bayt
için -8 bayt sayesinde @Mnemonic
bayt -3 sayesinde @JonathanAllan
için teşekkür ederiz @ovs -5 bayt

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]

Çevrimiçi deneyin!

Bazı açıklamalar:

try-exceptde o, sağlamak için kullanılır xve ykoordinatlar sınırları içindedir. İstisnası erişime açıktır G[y][x]. Python çok iyi ve negatif endeksler kabul edilebilir, bu yüzden kontrol x>-1<yeklendi.

T=[r[:]for r in G]Gdeğerlerin kopyasını oluşturmak için kullanılır

~-i/2ve ızgarada hareket etmek için kullanılan ~-(i^2)/2çiftleri üretmek için kullanılır (yine de daha kısa bir yol olmalı!)(-1, 0), (0, 1), (0, -1), (1, 0)

R+=[G]*(0==c<'$'==G[y][x])'$'gerekli adım sayısına ulaşıldığını kontrol edin. Rözyinelemeli fonksiyon çağrılarından bu sonucu almak için kullanılır.

for i,y in enumerate(G):"@"in y>S(y.index("@"),i,G,L,R)Bulunan xve ybir '@'giriş ve çağrı işlevinde S.

print R[0] R birden fazla çözüm içerebilir, bu nedenle ilk önce çıktı alın



1
Sen değiştirerek byte kaydedebilirsiniz if G[y][x]=='$':ile if'$'==G[y][x]:.

1
Aslında, bu koşulun tamamı R+=(G[y][x]=='$')*(c==0)*[G]başka bir bayt için değiştirilebilir .

1
Huh, ne gördüğümden emin değilim. İlk durumda bir çift bayt'ı kaydedebilirsinizif(x>-1<y)*(G[y][x]in' @'):

1
Sizin için daha kısa bir yol y+cmp(i%2,i/2)olacaktır y+~-(i^2)/2; hala daha kısa olabilir.
Jonathan Allan,

2

Python 2 , 264 261 251 249 bayt

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

Çevrimiçi deneyin!


1
@Arnauld: Hata! Biraz fazla süslü oldum. Sabit.
Chas Brown
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.