Una tartaruga trova un portale


30

La tartaruga vuole muoversi lungo la griglia per raggiungere il suo cibo. Vuole sapere quante mosse ci vorranno per arrivarci.

Inoltre, poichΓ© Γ¨ lento, ha dei teletrasporti installati intorno al suo dominio che utilizzerΓ  se questo accorcia il suo percorso. O evitali se allunga il suo cammino.

Incontra la tartaruga

🐒

La tartaruga vive su una griglia

XXXXXXXXXXXX🐒XXXXXXXXXXXX
La tartaruga puΓ² spostarsi in qualsiasi quadrato adiacente ...
XXXXXX↖↑↗XXβ†πŸ’β†’XXβ†™β†“β†˜XXXXXX

Tuttavia, la tartaruga non puΓ² spostarsi in un quadrato con una montagna

XπŸŒ„XXXX↖↑↗XXπŸŒ„πŸ’β†’XXπŸŒ„β†“β†˜XXπŸŒ„XXX

La tartaruga vuole mangiare la fragola, e vorrebbe sapere quanto tempo ci vorrΓ  per arrivare al suo Fragola

XπŸŒ„πŸ“πŸ’πŸŒ„XXπŸŒ„XXXX
Questo esempio potrebbe prendere la tartaruga 5 giri
XπŸŒ„πŸ“β†“πŸŒ„β†‘β†˜πŸŒ„β†‘Xβ†—X
Fortunatamente, la tartaruga ha trovato un teletrasporto! Ci sono due teletrasporti sulla griglia che si mappano l'un l'altro. Fare un passo sul teletrasporto sposta immediatamente la tartaruga sul corrispondente teletrasporto. I teletrasporto sono molto instabili e dopo averli usati una volta, scompaiono e non sono piΓΉ utilizzabili.
πŸ”΅πŸŒ„πŸ“πŸ’πŸŒ„πŸ”΄XπŸŒ„XXXX
Ora Γ¨ piΓΉ veloce per la tartaruga risalire due volte. Ora il percorso piΓΉ breve per le tartarughe Γ¨2
πŸ”΅πŸŒ„πŸ’β†‘πŸŒ„πŸ”΄β†‘XπŸŒ„XXXX

La sfida

Data una configurazione iniziale della griglia, il numero di mosse impiegherΓ  la tartaruga a raggiungere la sua fragola.

Regole

  • Si puΓ² presumere che la griglia di input abbia una soluzione

  • Ogni griglia avrΓ  solo uno strawberrye due portalse unoturtle

  • La griglia di input puΓ² essere inserita in qualsiasi formato conveniente

  • Dovresti trattare teleporterssono oggetti monouso

  • Il turno in cui la tartaruga si sposta su un teleporterquadrato Γ¨ giΓ  sul corrispondente teleporter. Non si sposta mai su una teleportere rimane lΓ¬ per una mossa

  • Il percorso piΓΉ breve non ha bisogno di utilizzare il portale

  • La tartaruga non puΓ² passare nelle tessere di montagna

  • È possibile utilizzare qualsiasi carattere ASCII o un numero intero di rappresentare mountains, turtle, empty grid square,strawberry

  • È possibile utilizzare lo stesso carattere o due diversi caratteri ASCII o numeri interi per rappresentare le teleportercoppie

  • Una griglia puΓ² avere piΓΉ di un percorso con la stessa lunghezza del percorso piΓΉ breve

  • Questo Γ¨

Chiarimenti alle regole

  • Dovresti trattare teleporterssono oggetti monouso.

🐒XπŸ”΅XπŸ“πŸŒ„πŸŒ„πŸŒ„πŸŒ„πŸŒ„πŸ”΄XXXX

Potrebbe essere risolto solo entrando ed uscendo dai portali due volte. Al momento di fare questo chiarimento, entrambe le soluzioni hanno agito supponendo che fossero o monouso, oppure non vi era motivo di provare i quadrati precedentemente utilizzati. Per evitare di rompere le loro soluzioni laboriose, questo sembrava il modo migliore per spiegare questa configurazione. Pertanto, questa sarebbe considerata una griglia non valida.

Casi di test formattati come elenchi

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

Casi di test formattati per l'uomo

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

Crediti

Design e struttura tramite: Mouse affamato di Arnauld

Sfide proposte Modifica consiglio: Kamil-drakari , carne di manzo

Consigli generali per la modifica: okx nedla2004 mbomb007


2
Penso che sarebbe una buona idea aggiungere un caso di prova in cui l'uso del teletrasporto richiederebbe piΓΉ tempo.
Okx,

@Okx Creazione e aggiunta ora.
akozi,

A cura, grazie.
akozi il

1
@xnor Sento che questo potrebbe essere astratto dalle mie regole originali. Quindi forse Γ¨ meglio portali di un oggetto monouso?
akozi,

1
Correlato (penso).
Charlie,

Risposte:


13

JavaScript (ES7), Β 140 139Β  138 byte

Prende l'input come una matrice di numeri interi con la seguente mappatura:

  • -1 = πŸ”΅ (qualsiasi portale)
  • 0 = X (vuoto)
  • 1 = πŸŒ„ (montagna)
  • 2 = 🐒 (tartaruga)
  • 3 = πŸ“ (fragola)
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

Provalo online!

Come?

La principale funzione di ricerca ricorsiva g è in grado di cercare una tessera specifica t alla lavagna (se chiamato con t≠0) o per qualsiasi tessera a (X,y) che può essere raggiunto dalla posizione corrente (X,Y).

Tiene traccia della lunghezza del percorso corrente in io e aggiorna il risultato migliore R a min(R,io) ogni volta che la tartaruga trova la fragola.

Viene prima chiamato con t=2 per trovare la posizione iniziale della tartaruga.

Si chiama con t=-1se viene raggiunto un portale, in modo tale che la tartaruga venga teletrasportata sull'altro portale. Non incrementiamoio durante tale iterazione.

Ogni tessera visitata viene temporaneamente impostata su una montagna per impedire alla tartaruga di spostarsi due volte sulla stessa tessera nello stesso percorso. Se rimaniamo intrappolati in un vicolo cieco, la ricorsione si ferma semplicemente senza aggiornamentoR.

Commentate

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
"Ogni tessera visitata viene temporaneamente impostata su una montagna per evitare che la tartaruga si sposti due volte sulla stessa tessera" Che bel trucco. Ottima risposta, e come sempre apprezzo le risposte con spiegazioni :)
akozi

5

Python 2 , 441 431 341 byte

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)

Provalo online!

Immettere come elenchi, ma utilizzando numeri anzichΓ© caratteri (grazie a Quintec) e un valore separato per la destinazione del teletrasporto. Tali rientri di grandi dimensioni dovrebbero essere caratteri di tabulazione se Stack Exchange li rimuove. Eventuali suggerimenti o idee sono particolarmente apprezzati, poichΓ© ritengo che questo potrebbe essere molto piΓΉ breve.

La tabella dei personaggi usati nella sfida ai numeri usati per il mio programma Γ¨ sotto, ma puoi anche usare questo programma .

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

-10 byte grazie a Quintec modificando l'input dall'uso dei caratteri ai numeri.

-Un sacco di byte grazie a Jonathan Frech, ElPedro e Jonathan Allan.


2
Probabilmente puoi radere alcuni caratteri prendendo in un elenco in cui ogni oggetto Γ¨ rappresentato da un numero anzichΓ© da un carattere stringa.
Quintec,

@Quintec Aggiunto, grazie. Vorrei fare lo stesso per le direzioni, ma le diagonali dovrebbero essere fatte separatamente. Tuttavia, potrebbe essere possibile spostarli in numeri.
nedla2004

1
@ElPedro Ahha posso radere 4 in questo modo
Jonathan Allan

1
... e altri 10 per 356
Jonathan Allan il

2
@JonathanAllan e ElPedro e Jonathan French. Ottimi consigli da tutti voi, e li ho aggiunti insieme a un paio di cose che mi sono venute in mente. (Dopo molti ritardi)
nedla2004,

2

Python 2 , 391 397 403 422 byte

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

Provalo online!

Il problema Γ¨ tradotto in un grafico e la soluzione Γ¨ trovare il percorso piΓΉ breve dalla tartaruga alla fragola.

Challenge | This code
T         | -1
S         |  5
O         |  8
M         |  0
X         |  1
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.