Animar a Adve el aventurero

12

El reto

Su tarea es animar a Adve the Adventurer moviéndose a través de un laberinto espeluznante (es decir, Halloween). Adve es un ; Sin embargo, es un personaje fluido, por lo que no le importa que lo represente un personaje diferente.

Para animar a Adve, imprime cada cuadro; un marco es el mapa con su ubicación actual en él. Adve se mueve un espacio hacia adelante cada turno y nunca retrocede. Comienza en la primera fila y termina en la última.

Entrada

Cualquier formato razonable como una cadena con un delimitador o una matriz de cadenas. Puede suponer que la entrada será un mapa mayor que 3 * 3, que contiene solo una ruta posible. Los únicos personajes presentes serán #y .

Salida

Los marcos

Ejemplo de laberinto ( ok ... laberinto )

Aquí hay un mapa sin Adve en él; el primer y el último cuadro son este mapa vacío (este mapa es 9x15):

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

Este es el , por lo que gana el código más corto en bytes.

La salida exacta para esto se puede encontrar aquí (37 cuadros).

Este es el , por lo que gana el código más corto en bytes.

Daniel
fuente
¿La primera y la última fila siempre tendrán una sola celda vacía? ¿Habrá siempre un único camino posible (sin bifurcaciones)?
Luis Mendo
@LuisMendo, sí, y hay "solo un camino posible"
Daniel
1
¿La entrada siempre estará en la parte superior?
Destructible Lemon
@DestructibleWatermelon, sí, y la salida estará en la parte inferior.
Daniel
44
Su verdadero nombre es Dave, pero está todo mezclado.
mbomb007

Respuestas:

4

Perl, 84 bytes

¡Gracias @Ton Hospel por guiarme en la dirección correcta para jugar golf alrededor de 30 bytes!

Bytecount incluye 82 bytes de código y -0pbanderas.

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

Tenga en cuenta que hay dos espacios finales y no hay una nueva línea final (de lo contrario no funcionará).

Toma el laberinto como entrada como salida de todos los cuadros necesarios para que Adve salga de él. Tenga en cuenta que Adve es &más bien un a , ya que este último no es utf8 (y perl no usa utf8 por defecto). Ejecútalo con -0pEbanderas:

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

Solo para los ojos , también hice esta versión animada, que es un poco más larga, pero borrará el terminal entre cada impresión y duerme 0,15 segundos, por lo que parecerá que Adve se está moviendo:

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' <<< "### #####
##  #####
## ######
##      #
####### #
#   ### #
# # #   #
# #   ###
# #######
#    ####
#### ####
####  ###
##### ###
##### ###"
Dada
fuente
Creo que es el mejor algoritmo, pero aún se puede reducir en más de 20 bytes ...
Ton Hospel
@TonHospel -9 bytes hasta ahora (eliminé el $s="@+", no me había dado cuenta antes de que @+solo se cambia si ocurre una expresión regular exitosa . Y en redolugar de whileguardar uno o dos bytes). ¿Alguna pista sobre cómo jugar más al golf? Supongo que tengo que deshacerme de ellos de y///alguna manera, o hacer el s///más corto ... pero de cualquier manera no sé cómo.
Dada
@TonHospel (pero si trabajó en una solución y desea publicarla, no la guarde porque es el mismo algoritmo o algo así, no me importará en absoluto;))
Dada
Cómo las variables regex se mantienen o no en bucles es muy sutil. El y///está muy bien ya que se necesita algo para indicar la dirección (pero nota que la oportunidad de elegir de qué lado) Pero la principal mejora vendrá de sustituciones que combinan
Ton Hospel
@TonHospel De hecho, debería haberlo visto, ¡pero estaba tratando demasiado de combinar s/ &/&A/y s/& /A&/juntos (y los siguientes) para ver que esos no eran la expresión regular que necesitaba combinar! ¡Muchas gracias! (¡Y gracias por dejarme descubrir cómo jugar al golf!)
Dada
3

JavaScript (ES6), 137

(1 byte guardado 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]

Menos 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
}

Prueba

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>

edc65
fuente
Uh, tonto, gracias @ETHproductions
edc65
Buen trabajo. Probablemente habría terminado alrededor de 160 bytes
ETHproductions