เต่าพบพอร์ทัล


30

เต่าต้องการย้ายไปตามกริดเพื่อไปหาอาหารของเขา เขาต้องการที่จะรู้ว่ามันจะต้องใช้เวลาเท่าไรในการเดินทาง

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

พบกับเต่า

🐢

ชีวิตเต่าบนตาราง

XXXXXXXXXXXX🐢XXXXXXXXXXXX
เต่าสามารถย้ายไปยังตารางที่อยู่ติดกัน ...
XXXXXXXX🐢XXXXXXXX

แต่เต่าไม่สามารถย้ายไปที่ตารางที่มีภูเขา

X🌄XXXXXX🌄🐢XX🌄XX🌄XXX

เต่าอยากจะกินสตรอเบอร์รี่ของเขาและอยากจะรู้ว่าวิธีการที่จะใช้เวลานานที่จะได้รับของเขาสตรอเบอร์รี่

X🌄🍓🐢🌄XX🌄XXXX
ตัวอย่างนี้จะใช้เวลาเต่า5ผลัด X 🌄 🍓🌄🌄X X โชคดีที่เต่าพบเครื่องเคลื่อนย้ายมวลสาร! มีเทเลพอร์ทสองตัวบนกริดที่จับคู่กัน การเหยียบเครื่องเคลื่อนย้ายมวลสารจะย้ายเต่าไปยังเครื่องเคลื่อนย้ายมวลสารที่เกี่ยวข้องทันที Teleporter ไม่เสถียรและหลังจากใช้ครั้งเดียวพวกเขาจะหายไปและไม่สามารถใช้งานได้อีกต่อไป 🔵 🌄 🍓 🐢 🌄 🔴5
X🌄🍓🌄🌄XX
🔵🌄🍓🐢🌄🔴X🌄XXXX
คือตอนนี้เร็วขึ้นสำหรับเต่าที่จะเลื่อนขึ้นเป็นครั้งที่สอง ตอนนี้เต่าเส้นทางที่สั้นที่สุดคือ2
🔵🌄🐢🌄🔴X🌄XXXX

ความท้าทาย

เมื่อกำหนดเอาท์พุทกริดเริ่มต้นจำนวนการเคลื่อนไหวก็จะนำเต่าไปถึงสตรอเบอร์รี่ของเขา

กฎระเบียบ

  • คุณอาจคิดว่ากริดอินพุตมีวิธีแก้ปัญหา

  • แต่ละตารางจะมีหนึ่งstrawberryและสองportalsและหนึ่งturtle

  • กริดอินพุตอาจถูกป้อนในรูปแบบที่สะดวก

  • คุณควรรักษาteleportersเป็นรายการใช้เพียงครั้งเดียว

  • เลี้ยวที่ย้ายเต่าบนตารางที่เขามีอยู่แล้วในที่สอดคล้องกันteleporter teleporterเขาไม่เคยย้ายไปteleporterและอยู่ที่นั่นเพื่อย้าย

  • เส้นทางที่สั้นที่สุดไม่จำเป็นต้องใช้ประโยชน์จากพอร์ทัล

  • เต่าไม่สามารถผ่านเข้าไปในแผ่นกระเบื้องบนภูเขาได้

  • คุณอาจจะใช้อักขระ ASCII หรือจำนวนเต็มเพื่อเป็นตัวแทนmountains, turtle, empty grid square,strawberry

  • คุณสามารถใช้อักขระเดียวกันหรืออักขระ ASCII หรือตัวเลขสองตัวที่แตกต่างกันเพื่อแสดงteleporterคู่

  • กริดสามารถมีมากกว่าหนึ่งพา ธ ที่มีความยาวพา ธ สั้นที่สุดเท่ากัน

  • นี่คือ

ชี้แจงกฎ

  • คุณควรรักษาteleportersเป็นรายการใช้เพียงครั้งเดียว

เหตุผล : มันก็ชี้ให้เห็นว่ากรณีของ:

🐢X🔵X🍓🌄🌄🌄🌄🌄🔴XXXX

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

กรณีทดสอบที่จัดรูปแบบเป็นรายการ

[ ['T', 'X', 'X', 'S', 'X'], ['X', 'X', 'X', 'X', 'X'], ['X', 'X', 'X', 'X', 'X'] ] --> 3
[ ['T', 'M', 'X', 'S', 'X'], ['X', 'M', 'X', 'X', 'X'], ['O', 'X', 'X', 'X', 'O'] ] --> 4
[ ['T', 'M', 'X', 'S', 'O'], ['O', 'M', 'X', 'X', 'X'], ['X', 'X', 'X', 'X', 'X'] ] --> 2
[ ['T', 'M', 'X', 'S', 'X'], ['O', 'M', 'X', 'X', 'X'], ['O', 'X', 'X', 'X', 'X'] ] --> 4
[ ['T', 'M', 'S', 'X', 'O'], ['X', 'M', 'M', 'M', 'M'], ['X', 'X', 'X', 'X', 'O'] ] --> 7
[ ['T', 'X', 'X', 'S', 'X'], ['O', 'M', 'M', 'M', 'X'], ['X', 'X', 'O', 'X', 'X'] ] --> 3

กรณีทดสอบที่จัดรูปแบบสำหรับมนุษย์

T X X S X
X X X X X
X X X X X --> 3

T M X S X
X M X X X
O X X X O --> 4

T M X S O
O M X X X
X X X X X --> 2

T M X S X
O M X X X
O X X X X --> 4

T M S X O
X M M M M
X X X X O --> 7

T X X S X
O M M M X
X X O X X --> 3

เครดิต

การออกแบบและโครงสร้างผ่าน: Hungry mouse โดย Arnauld

ความท้าทายที่เสนอแก้ไขคำแนะนำ: Kamil-drakari , เนื้อวัว

คำแนะนำการแก้ไขทั่วไป: okx nedla2004 mbomb007


2
ฉันคิดว่ามันเป็นความคิดที่ดีที่จะเพิ่มกรณีทดสอบที่ใช้เครื่องเคลื่อนย้ายมวลสารจะทำให้ใช้เวลานานขึ้น
Okx

@Okx การสร้างและเพิ่มทันที
akozi

แก้ไขแล้วขอบคุณ
akozi

1
@ xnor ฉันรู้สึกว่าสิ่งนี้อาจเป็นนามธรรมจากกฎดั้งเดิมของฉัน ดังนั้นอาจจะดีกว่าถ้าคุณใช้พอร์ทัลรายการเดียว
akozi

1
ที่เกี่ยวข้อง (ฉันคิดว่า)
Charlie

คำตอบ:


13

JavaScript (ES7),  140 139  138 ไบต์

รับอินพุตเป็นเมทริกซ์ของจำนวนเต็มด้วยการแม็พต่อไปนี้:

  • -1
  • 0X
  • 1
  • 2
  • 3
m=>(R=g=(t,X,Y,i)=>m.map((r,y)=>r.map((v,x)=>r[(u=0,t?v-t:(x-X)**2+(y-Y)**2<3?v-3?~v?v:u--:R=R<i?R:i:1)||g(u,x,y,u-~i,r[x]=1),x]=v)))(2)|R

ลองออนไลน์!

อย่างไร?

ฟังก์ชันการค้นหาแบบเรียกซ้ำหลักก.สามารถมองหาไทล์เสื้อเฉพาะบนกระดาน (ถ้ามันถูกเรียกด้วยเสื้อ0 ) หรือสำหรับไทล์ใด ๆ ที่(x,Y)ซึ่งสามารถเข้าถึงได้จากตำแหน่งปัจจุบัน(X,Y)

ผมRนาที(R,ผม)เมื่อใดก็ตามที่เต่าพบสตรอเบอร์รี่

เสื้อ=2

เสื้อ=-1ผมในระหว่างการทำซ้ำดังกล่าว

R R

แสดงความคิดเห็น

m => (                        // m[] = input matrix
  R =                         // initialize R to a non-numeric value
  g = (t, X, Y, i) =>         // g = recursive search function taking t = expected tile,
                              //     (X, Y) = current coordinates, i = path length
    m.map((r, y) =>           // for each row r[] at position y in m[]:
      r.map((v, x) =>         //   for each tile v at position x in r[]:
        r[                    //     this statement will eventually restore r[x] to v
          ( u = 0,            //     u = next tile to look for, or 0 if none
            t ?               //     if we're looking for a specific tile:
              v - t           //       test whether we've found it
            :                 //     else:
              (x - X) ** 2 +  //       compute the squared Euclidean distance between
              (y - Y) ** 2    //       (x, y) and (X, Y)
              < 3 ?           //       if it's less than 3 (i.e. reachable from (X, Y)):
                v - 3 ?       //         if v is not equal to 3:
                  ~v ?        //           if v is not equal to -1:
                    v         //             test if v = 0
                  :           //           else (v = -1):
                    u--       //             set u = -1 to find the other portal
                :             //         else (v = 3):
                  R = R < i ? //           we've found the strawberry: set R = min(R, i)
                      R : i   //
              :               //       else (this tile can't be reached):
                1             //         yield 1
          ) ||                //     if the above result is falsy:
          g(                  //       do a recursive call:
            u,                //         t = u
            x, y,             //         move to (x, y)
            u - ~i,           //         unless u is set to -1, increment i
            r[x] = 1          //         set this tile to a mountain
          ),                  //       end of recursive call
          x                   //     restore r[x] ...
        ] = v                 //     ... to v
    ))                        // end of both map() loops
)(2) | R                      // initial call to g with t = 2; return R

1
"แผ่นกระเบื้องแต่ละอันถูกตั้งค่าไว้ชั่วคราวบนภูเขาเพื่อป้องกันเต่าเคลื่อนไหวสองครั้งบนแผ่นกระเบื้องเดียวกัน" ช่างเป็นกลอุบายที่น่ารัก คำตอบที่ดีและเป็นเสมอผมขอขอบคุณคำตอบ :)
akozi

5

Python 2 , 441 431 341 ไบต์

from itertools import*
G=input()
W=len(G[0])
H=len(G)
A=[0]*5
E=enumerate
for y,r in E(G):
 for x,C in E(r):A[C]=[x,y]
for L in count():
 for M in product(*[zip('UDLR'*2,'LRDU    ')]*L):
  x,y=A[0]
  for m in M:
    x+='R'in m;x-='L'in m;y+='D'in m;y-='U'in m
    if(x,y)==A[3]:x,y=A[2]
    if 1-(W>x>-1<y<H)or G[y][x]>3:break
  if[x,y]==A[1]:exit(L)

ลองออนไลน์!

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

ตารางสำหรับตัวอักษรที่ใช้ในการท้าทายตัวเลขที่ใช้สำหรับโปรแกรมของฉันอยู่ด้านล่าง แต่คุณสามารถใช้โปรแกรมนี้ได้

Challenge | My program
T         | 0
S         | 1
E         | 2
O         | 3
M         | 4
X         | -1

-10 ไบต์ขอบคุณ Quintec โดยการเปลี่ยนอินพุตจากการใช้อักขระเป็นตัวเลข

-A ไบต์จำนวนมากต้องขอบคุณ Jonathan Frech, ElPedro และ Jonathan Allan


2
คุณสามารถโกนหนวดได้สองสามตัวโดยใช้รายการที่วัตถุแต่ละอันแทนด้วยตัวเลขแทนที่จะเป็นตัวอักษรสตริง
Quintec

@Quintec เพิ่มแล้วขอบคุณ ฉันต้องการทำเช่นเดียวกันสำหรับทิศทาง แต่จากนั้นเส้นทแยงมุมจะต้องแยกจากกัน มันอาจจะเป็นไปได้ที่จะย้ายไปยังหมายเลข
nedla2004

1
@ElPedro Ahha ฉันสามารถโกน 4 แบบนี้ได้
Jonathan Allan

1
... และอีก 10 สำหรับ356
Jonathan Allan

2
@JonathanAllan และ ElPedro และ Jonathan French เคล็ดลับยอดเยี่ยมจากพวกคุณทุกคนและฉันได้เพิ่มพวกเขาเข้าด้วยกันกับคู่ของฉัน (หลังจากล่าช้ามาก)
nedla2004

2

Python 2 , 391 397 403 422ไบต์

M=input()
from networkx import*
a=b=c=d=0
N,h,w,S=[-1,0,1],len(M),len(M[0]),[]
for i in range(h):
 for j in range(w):
  I,m=(i,j),M[i][j]
  if m>7:c,d=a,b;a,b=I
  if m<0:Z=I
  if m==5:F=I
  S+=[I+I]
S+=[(a,b,c,d),(c,d,a,b)]
print len(shortest_path(from_edgelist([((A+p,B+q),(C,D))for A,B,C,D in S for p,q in[(p,q)for p in N for q in N]if-1<A+p<h and-1<B+q<w and M[C][D]*M[A+p][B+q]]),Z,F))-1

ลองออนไลน์!

ปัญหาได้รับการแปลเป็นกราฟและวิธีแก้ปัญหาคือการหาเส้นทางที่สั้นที่สุดจากเต่าสู่สตรอเบอร์รี่

Challenge | This code
T         | -1
S         |  5
O         |  8
M         |  0
X         |  1
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.