เส้นทางและเสียเวลา


22

หลักฐาน

ดังนั้นเมื่อเร็ว ๆ นี้ฉันเพิ่งได้รับการนัดหมายประมาณครึ่งชั่วโมงและตัดสินใจที่จะรออยู่ข้างนอก ฉันยังระบุด้วยว่ามันจะดูแปลก ๆ ถ้าฉันยืนนิ่ง ๆ อยู่หน้าบ้าน ฉันเลยตัดสินใจเดินเร็ว ๆ ในพื้นที่ จำกัด ฉันยังสรุปด้วยว่าถ้าฉันเริ่มเดินเป็นวงกลมก็จะเห็นได้ชัดว่าฉันกำลังโวยวายอยู่ ดังนั้นฉันจึงได้แรงบันดาลใจในการสร้างความท้าทายครั้งแรกของรหัสกอล์ฟ

สเปค

คุณจะได้รับรายชื่อแผนที่ของพื้นที่ซึ่งจะมีอย่างใดอย่างหนึ่ง" "หรือ"#"ซึ่งเป็นตัวแทนของพื้นที่ว่างและอุปสรรคบางอย่าง สามารถข้ามพื้นที่ว่างได้เพียงครั้งเดียวเท่านั้นและใช้เวลา 1 นาทีในการข้าม ตำแหน่งเริ่มต้นของคุณจะมีความหมายด้วย"@"ประเพณีต่อชาวโร๊คไลค์และเป้าหมายจะถูกแทนด้วย"$"เพราะนั่นคือสิ่งที่คุณจะแพ้ที่นั่น คุณจะได้รับจำนวนเต็มซึ่งจะแสดงจำนวนนาทีที่คุณต้องเสียก่อนที่จะไม่ดูเหมือนว่าคุณกำลังบุกรุก เมื่อคุณลงจอดบน"$"มันจะต้องเป็นจำนวนนาทีที่แน่นอน (ดังนั้นถ้าคุณนับถอยหลังมันจะต้องเป็น 1 บนแผ่นต่อเนื่องและเป็น 0 บนแผ่นต่อไป) มันจะเป็นไปได้เสมอที่จะไปถึงปลายทาง โปรแกรมหรือฟังก์ชั่นของคุณจะต้องส่งคืนรายการที่แสดงพา ธ ที่สั้นที่สุดด้วย <,>, ^, และ v เพื่อแสดงเส้นทางทั้งสี่ที่เป็นไปได้

ตัวอย่าง

การป้อนข้อมูล:

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

และ

5

ouput:

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

การป้อนข้อมูล:

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

และ

7

เอาท์พุท:

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

การป้อนข้อมูล:

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

และ

17

เอาท์พุท:

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

กฎระเบียบ

  • ช่องโหว่มาตรฐานใช้
  • ต้องย้ายแต่ละไทล์ไปหนึ่งครั้งเท่านั้น
  • จำนวนเวลาที่แน่นอนจะต้องใช้เวลาบนกระดาน
  • ต้องแสดงเส้นทางเดียวเท่านั้นในกรณีที่มีหลายเส้นทาง
  • นี่คือคำถามการเล่นกอล์ฟรหัสดังนั้นคำตอบที่สั้นที่สุดชนะ
  • ตามคำถามของผู้ใช้ 202729 ในความคิดเห็นคุณอาจถือว่าการป้อนข้อมูลที่ถูกต้อง

เพิ่มความคิดเห็นหากต้องการคำชี้แจงเพิ่มเติมใด ๆ


1
มีการรับประกันหรือไม่ว่า "จะเป็นไปได้เสมอที่จะไปถึงจุดหมายตามเวลาที่กำหนด "
user202729

ใช่มันจะมีหนทางเสมอแม้ว่าจะมีความซับซ้อนก็ตาม
LForchini

5
ยินดีต้อนรับสู่ PPCG! :) ความท้าทายแรกที่ดี
จูเซปเป้

เกิดอะไรขึ้นกับครึ่งนาทีของการจบแต่ละครั้ง! (ไม่จำเป็นต้องเปลี่ยนแปลงอะไรเลยหากไม่ชัดเจน)
Jonathan Allan

คำตอบ:


6

JavaScript (ES6), 171 ไบต์

(a)(n)จะเข้าในไวยากรณ์ currying เอาต์พุตโดยการแก้ไขเมทริกซ์อินพุต

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:0-3 ไบต์
ขอบคุณ @ mememonic สำหรับ -8
bytes
ขอบคุณ @JonathanAllan สำหรับ-3 bytes ขอบคุณ @ovs for -5 bytes

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; อาจจะยังสั้นกว่า
Jonathan Allan

2

Python 2 , 264 261 251 249 ไบต์

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

ลองออนไลน์!


1
@Arnauld: อ๊ะ! แฟนซีเกินไปหน่อย คงที่
Chas Brown
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.