Animare Adve the Adventurer


12

La sfida

Il tuo compito è quello di animare Adve the Adventurer che si muove attraverso un labirinto raccapricciante (cioè Halloween). Adve è un ; è fluido nei personaggi, però, quindi non gli dispiace essere rappresentato da un personaggio diverso.

Per animare Adve, stampi ogni fotogramma; una cornice è la mappa con la sua posizione attuale al suo interno. Adve si sposta di uno spazio in avanti ogni turno e non fa mai marcia indietro. Comincia nella prima fila e termina nell'ultima.

Ingresso

Qualsiasi formato ragionevole come una stringa con un delimitatore o un array di stringhe. Puoi supporre che l'input sarà una mappa maggiore di 3 * 3, contenente solo un possibile percorso. Gli unici personaggi presenti saranno #e .

Produzione

I telai.

Esempio di labirinto ( ok ... labirinto )

Ecco una mappa senza Adve in essa; il primo e l'ultimo fotogramma sono questa mappa vuota (questa mappa è 9x15):

### #####
##  #####
## ######
##      #
####### #
#   ### #
# # #   #
# #   ###
# #######
#    ####
#### ####
####  ###
##### ###
##### ###
##### ###

Questo è , quindi vince il codice più breve in byte!

L' output esatto per questo può essere trovato qui (37 frame).

Questo è , quindi vince il codice più breve in byte!


La prima e l'ultima riga avranno sempre una singola cella vuota? Ci sarà sempre un singolo percorso possibile (nessuna biforcazione)?
Luis Mendo,

@LuisMendo, sì, e c'è "un solo percorso possibile"
Daniel,

1
L'ingresso sarà sempre in cima?
Limone distrutti

@DestructibleWatermelon, sì, e l'uscita sarà in fondo.
Daniel,

4
Il suo vero nome è Dave, ma è tutto confuso.
mbomb007,

Risposte:


4

Perl, 84 byte

Grazie @Ton Hospel per avermi guidato nella giusta direzione per giocare a golf di circa 30 byte!

Bytecount include 82 byte di codice e -0pflag.

/.*/;say y/A/ /r;s/&(.{@{+}})? /A$1&/s||s/ (.{@{+}})?&/&$1A/s||s/ /&/?redo:y;A&;  

Nota che ci sono due spazi finali e nessuna nuova riga finale (altrimenti non funzionerà).

Prende il labirinto come input come output tutti i frame necessari per far uscire Adve. Nota che Adve è un &anziché un , poiché quest'ultimo non è utf8 (e perl non usa utf8 per impostazione predefinita). Eseguilo con le -0pEbandiere:

perl -0pE '/.*/;say y/A/ /r;s/&(.{@{+}})? /A$1&/s||s/ (.{@{+}})?&/&$1A/s||s/ /&/?redo:y;A&;  ' <<< "### #####
##  #####
## ######
##      #
####### #
#   ### #
# # #   #
# #   ###
# #######
#    ####
#### ####
####  ###
##### ###
##### ###"

Solo per gli occhi , ho anche realizzato questa versione animata, che è un po 'più lunga, ma cancellerà il terminale tra ogni stampa e dormirà 0,15 sec, quindi sembrerà che Adve si stia effettivamente muovendo:

perl -0nE 'system(clear);/.*/;say y/A/ /r;select($,,$,,$,,0.15);s/&(.{@{+}})? /A$1&/s||s/ (.{@{+}})?&/&$1A/s||s/ /&/?redo:say"\e[H",y/A&/  /r' <<< "### #####
##  #####
## ######
##      #
####### #
#   ### #
# # #   #
# #   ###
# #######
#    ####
#### ####
####  ###
##### ###
##### ###"

Penso che sia l'algoritmo migliore ma può ancora essere golfato di oltre 20 byte ...
Ton Hospel

@TonHospel -9 byte finora (ho rimosso il $s="@+", non mi ero reso conto in precedenza che @+è cambiato solo se si verifica una regex corretta . E redoinvece di whilesalvare uno o due byte). Qualche suggerimento su come giocare a golf di più? Immagino che dovrei sbarazzarmi di quelli in y///qualche modo, o rendere il s///più breve ... ma in entrambi i casi non so come.
Dada,

@TonHospel (ma se hai lavorato su una soluzione e vuoi pubblicarla, non tenerla perché è lo stesso algoritmo o qualcosa del genere, non mi dispiacerà affatto;))
Dada

Il modo in cui le variabili regex sono o non sono mantenute nei loop è molto sottile. La y///va bene da quando avete bisogno di qualcosa per indicare la direzione (a meno di notare che si arriva a scegliere da quale parte) Ma il principale miglioramento verrà da sostituzioni che conciliano
Ton Hospel

@TonHospel In effetti, avrei dovuto vederlo, ma stavo provando troppo a combinare s/ &/&A/e s/& /A&/insieme (e l'uno accanto all'altro) per vedere che quelli non erano il regex che dovevo combinare! Molte grazie! (E grazie per avermi fatto scoprire come giocare a golf!)
Dada,

3

JavaScript (ES6), 137

(1 byte salvato thx @ETHproductions)

m=>(o=>{for(p=m.search` `-o,r=[m];[d,o/d,-o/d].some(q=>1/m[d=q,q+=p]?p=q:0);r.push(q.join``))(q=[...m])[p]=0})(d=1+m.search`
`)||[...r,m]

Meno golf

m=>{
  d = o = 1+m.search`\n`; // offset to next row and starting direction
  p = m.search` `-o; // starting position, 1 row above the first
  for( r=[m]; // r is the output array, start with empty maze
       // try moving in 3 directions (no back)
       // if no empty cell found, we have exit the maze
       [d,o/d,-o/d].some(q => 1/m[d=q,q+=p]? p=q : 0);
       r.push(q.join``) // add current frame
     )
     q=[...m], q[p] = 0; // build frame, '0' used to mark Adve position
  return [...r,m] // add last frame with maze empty again
}

Test

F=
m=>(o=>{for(p=m.search` `-o,r=[m];[d,o/d,-o/d].some(q=>1/m[d=q,q+=p]?p=q:0);r.push(q.join``))(q=[...m])[p]=0})(d=1+m.search`\n`)||[...r,m]

function go() {
  var i=I.value,r=F(i),
      frame=x=>(x=r.shift())&&(O.textContent=x,setTimeout(frame,100))
  frame()
}

go()
#I { width:10em; height: 19em; font-size:10px}
#O { white-space:pre; font-family: monospace; font-size:10px; vertical-align: top; padding: 4px}
<table><tr><td>
<textarea id=I>### #####
##  #####
## ######
##      #
####### #
#   ### #
# # #   #
# #   ###
# #######
#    ####
#### ####
####  ###
##### ###
##### ###
##### ###
</textarea><button onclick='go()'>go</button></td><td id=O></td></tr></table>


Uh, sciocco me, grazie @ETHproductions
edc65

Ottimo lavoro. Probabilmente sarei finito per circa 160 byte
ETHproductions
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.