Bir Kaplumbağa Portal Buluyor


30

Kaplumbağa yemeğini almak için ızgara boyunca hareket etmek istiyor. Oraya ulaşması için kaç hamle yapacağını bilmek istiyor.

Yavaş olduğu için, yolunu kısaltırsa, kullanacağı etki alanı etrafında teleporerler kurdu. Veya yolunu uzatırsa onlardan kaçının.

Kaplumbağa tanışın

🐢

Kaplumbağa bir ızgara üzerinde yaşıyor

XXXXXXXXXXXX🐢XXXXXXXXXXXX
Kaplumbağa herhangi bir kareye yaklaşabilir ...
XXXXXXXX🐢XXXXXXXX

Ancak, kaplumbağa bir dağ olan bir kareye hareket edemez

X🌄XXXXXX🌄🐢XX🌄XX🌄XXX

Kaplumbağa onun Çilek yemek istiyor ve onun Çilek bunun almak için ne kadar süreceğini bilmek istiyorum

X🌄🍓🐢🌄XX🌄XXXX
kaplumbağa alacağını Bu örnek 5 dönüşler
X🌄🍓🌄🌄XX
Neyse ki, Kaplumbağa bir teleporter bulundu! Izgara üzerinde birbiriyle eşleşen iki ışın var. Teleporter üzerine basmak hemen kaplumbağayı ilgili teleporter'e taşır. Teleporterlar çok dengesizdir ve onları bir kez kullandıktan sonra kaybolurlar ve artık kullanılamazlar.
🔵🌄🍓🐢🌄🔴X🌄XXXX
iki kere yukarı taşımak için kaplumbağa için artık daha hızlı. Şimdi kaplumbağaların en kısa yolu2
🔵🌄🐢🌄🔴X🌄XXXX

Meydan okuma

Başlangıçtaki bir ızgara konfigürasyonu verilmişse, hamle sayısı, kaplumbağanın çilekliğine ulaşması için harcayacaktır.

kurallar

  • Giriş ızgarasının bir çözümü olduğunu varsayabilirsiniz

  • Her bir şebekede sadece bir strawberryve iki portalsve bir tane olacaktır.turtle

  • Giriş ızgarası herhangi bir uygun formatta girilebilir

  • Kullanmanız gereken teleporterstek kullanımlık ürünler

  • Kaplumbağanın dönüştüğü dönüş teleporter, zaten üzerinde olduğu kareye doğru ilerliyor teleporter. Asla a'ya geçmez teleporterve bir hareket için orada kalır.

  • En kısa yolun portaldan faydalanması gerekmez.

  • Kaplumbağa dağ taşlarına geçemez

  • Sen temsil etmek herhangi bir ASCII karakter veya tamsayı kullanabilir mountains, turtle, empty grid square,strawberry

  • teleporterÇiftleri temsil etmek için aynı karakteri veya iki farklı ASCII karakterini veya tamsayıları kullanabilirsiniz.

  • Bir ızgara aynı en kısa yol uzunluğuna sahip birden fazla yola sahip olabilir

  • Bu

Kurallara Açıklamalar

  • Kullanmanız gereken teleporterstek kullanımlık ürünlerdir.

Sebep : Aşağıdaki durumun belirtildiği belirtildi:

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

Portallara yalnızca iki kez girip çıkılarak çözülebilir. Bu açıklamanın yapılması sırasında, her iki çözüm de tek kullanımlık olduğu varsayımıyla hareket etti veya daha önce kullanılan kareleri denemek için hiçbir neden yoktu. Çok çalışkan çözümlerini bozmamak için, bu kurulum için en iyi yol bu gibi görünüyordu. Bu nedenle, bu geçersiz bir ızgara olarak kabul edilir.

Liste olarak biçimlendirilmiş Test Durumları

[ ['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

İnsanlar için biçimlendirilmiş Test Kutuları

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

Kredi

Tasarım ve yapı: Aç fare, Arnauld tarafından

Önerilen Zorluklar Düzenleme Önerileri: Kamil-drakari , beefster

Genel Düzenleme Tavsiyesi: okx nedla2004 mbomb007


2
Teleporter kullanımının daha uzun süreceği bir test senaryosunun eklenmesinin iyi olacağını düşünüyorum.
Okx

@Okx Şimdi oluşturma ve ekleme.
akozi

Düzenlendi, teşekkürler.
akozi

1
@xnor Bunun, orijinal kurallarımdan soyut olabileceğini hissediyorum. Öyleyse, belki de bir tek kullanımlık eşyayı portallara taşımak daha iyidir.
akozi

1
İlgili (sanırım).
Charlie,

Yanıtlar:


13

JavaScript (ES7),  140 139  138 bayt

Girdi, aşağıdaki eşlemeyle bir tam sayı matrisi olarak alır:

  • -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

Çevrimiçi deneyin!

Nasıl?

gtt0(x,y)(X,Y)

benR,min(R,,ben) ne zaman kaplumbağa çileği bulduğunda.

İlk olarak t=2 kaplumbağanın başlangıç ​​konumunu bulmak için.

Kendisi ile çağırır t=-1eğer bir portala ulaşılırsa, kaplumbağa diğer portala ışınlanır. Biz artış yokben böyle bir yineleme sırasında.

Ziyaret edilen her kiremit, kaplumbağanın aynı kiremit üzerinde aynı yolda iki kez hareket etmesini önlemek için geçici olarak bir dağa ayarlanır. Bir çıkmazda tuzağa düşersek, özyineleme güncelleme yapmadan dururR,.

Yorumlananlar

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
“Gezilen her kiremit, kaplumbağanın aynı kiremitte iki kez hareket etmesini önlemek için geçici olarak bir dağa ayarlandı” Ne güzel bir numara. Harika cevap, ve her zaman olduğu gibi açıklamalar ile cevapları takdir ediyorum :)
akozi

5

Python 2 , 441 431 341 bayt

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)

Çevrimiçi deneyin!

Listeler olarak giriş yapın, ancak karakter yerine rakamları (Quintec sayesinde) ve teleporter hedefine ilişkin ayrı bir değer kullanın. Yığın Exchange bunları kaldırırsa, bu büyük girintiler sekme karakterleri olmalıdır. Herhangi bir ipucu veya fikir özellikle hoş karşılanır, çünkü bunun çok şey alabileceğini hissediyorum biraz daha kısa.

Programım için kullanılan sayıların mücadelesinde kullanılan karakterlerin tablosu aşağıdadır, ancak bu programı da kullanabilirsiniz .

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

Girdiyi karakter kullanmaktan sayılara değiştirmek suretiyle Quintec sayesinde -10 bayt.

- Jonathan Frech, ElPedro ve Jonathan Allan sayesinde birçok bayt.


2
Her nesnenin bir dize karakteri yerine bir sayı ile temsil edildiği bir listeyi alarak, muhtemelen birkaç karakteri tıraş edebilirsiniz.
Quintec

@ Quintec Eklendi, teşekkürler. Talimatlar için aynı şeyi yapmak isterdim, ancak köşegenlerin ayrı ayrı yapılması gerekiyordu. Yine de onları sayılara taşımak mümkün olabilir.
nedla2004

1
@ElPedro Ahha Ben kapalı 4 tıraş edebilirsiniz böyle
Jonathan Allan

1
... ve 356
Jonathan Allan

2
@ JonathanAllan ve ElPedro ve Jonathan French. Hepinizden harika ipuçları ve birlikte geldiğim birkaç şeyi birlikte ekledim. (Çok gecikmeden sonra)
nedla2004

2

Python 2 , 391 397 403 422 bayt

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

Çevrimiçi deneyin!

Sorun bir grafiğe dönüştürülür ve çözüm, kaplumbağanın çileğine giden en kısa yolu bulmaktır.

Challenge | This code
T         | -1
S         |  5
O         |  8
M         |  0
X         |  1
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.