Animar Adve the Adventurer

12

O desafio

Sua tarefa é animar o Adve the Adventurer, movendo-se através de um labirinto assustador (ou seja, Halloween). Adve é um ; ele é fluido como personagem, então ele não se importa de ser representado por um personagem diferente.

Para animar o Adve, você imprime cada quadro; um quadro é o mapa com sua localização atual. Adve move um espaço para frente a cada turno e nunca recua. Ele começa na primeira linha e termina na última.

Entrada

Qualquer formato razoável, como uma string com um delimitador ou matriz de strings. Você pode assumir que a entrada será um mapa maior que 3 * 3, contendo apenas um caminho possível. Os únicos caracteres presentes serão #e .

Resultado

Os quadros.

Labirinto de exemplo ( ok ... labirinto )

Aqui está um mapa sem Adve; o primeiro e o último quadros são este mapa vazio (este mapa é 9x15):

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

Isso é , então o código mais curto em bytes vence!

A saída exata para isso pode ser encontrada aqui (37 quadros).

Isso é , então o código mais curto em bytes vence!

Daniel
fonte
A primeira e a última linha sempre terão uma única célula vazia? Sempre haverá um único caminho possível (sem bifurcações)?
Luis Mendo
@LuisMendo, sim, e não é "apenas um caminho possível"
Daniel
1
A entrada sempre estará no topo?
Destrutível Lemon
@DestructibleWatermelon, sim, e a saída estará na parte inferior.
Daniel
4
O nome verdadeiro dele é Dave, mas ele está todo confuso.
precisa saber é o seguinte

Respostas:

4

Perl, 84 bytes

Obrigado @Ton Hospel por me guiar na direção certa para jogar golfe em torno de 30 bytes!

Bytecount inclui 82 bytes de código e -0psinalizadores.

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

Observe que existem dois espaços finais e nenhuma nova linha final (não funcionará de outra maneira).

Pega o labirinto como entrada e gera todos os quadros necessários para o Adve sair dele. Observe que Adve é um em &vez de um , pois o último não é utf8 (e o perl não usa utf8 por padrão). Execute-o com -0pEsinalizadores:

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

Só para os olhos , eu também fiz esta versão animada, que é um pouco mais longa, mas limpará o terminal entre cada impressão e o sono 0,15 s, para que pareça que o Adve está realmente se movendo:

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
fonte
Eu acho que é o melhor algoritmo, mas ele ainda pode ser golfed para baixo por mais de 20 bytes ...
Ton Hospel
@TonHospel -9 bytes até agora (removi o arquivo $s="@+", não havia percebido anteriormente que isso @+só será alterado se ocorrer um regex bem - sucedido . E em redovez de whilesalvar um ou dois bytes). Alguma dica sobre como jogar mais? Acho que tenho que me livrar deles de y///alguma forma, ou s///diminuir, mas de qualquer maneira não sei como.
Dada
@TonHospel (mas se você trabalhou em uma solução e quer publicá-la, não prendê-lo porque é o mesmo algoritmo ou algo assim, eu não me importaria em tudo;))
Dada
Como as variáveis ​​regex são ou não mantidas em loops é muito sutil. O y///é muito bem desde que você precisa de algo para indicar a direção (de notar que você começa a escolher de que lado) Mas a principal melhoria virá de substituições que combinam
Ton Hospel
@TonHospel Na verdade, eu deveria ter visto, mas estava tentando muito combinar s/ &/&A/e s/& /A&/junto (e o próximo ao lado) para ver que esses não eram o regex que eu precisava combinar! Muito obrigado! (E obrigado por me deixar descobrir como jogar golfe)!
Dada
3

JavaScript (ES6), 137

(1 byte economizado 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 golfe

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
}

Teste

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
fonte
Uh, bobo me, @ETHproductions graças
edc65
Ótimo trabalho. Eu provavelmente teria acabou cerca de 160 bytes
ETHproductions