Animer Adve l'aventurier

12

Le défi

Votre tâche est d'animer Adve l'Aventurier se déplaçant à travers un labyrinthe effrayant (c'est-à-dire Halloween). Adve est un ; son caractère est fluide, cependant, cela ne le dérange pas d'être représenté par un personnage différent.

Pour animer Adve, vous imprimez chaque image; un cadre est la carte avec son emplacement actuel. Adve avance d'un espace à chaque tour et ne revient jamais en arrière. Il commence au premier rang et se termine au dernier.

Contribution

Tout format raisonnable comme une chaîne avec un délimiteur ou un tableau de chaînes. Vous pouvez supposer que l'entrée sera une carte supérieure à 3 * 3, contenant un seul chemin possible. Les seuls personnages présents seront #et .

Production

Les cadres.

Exemple de labyrinthe ( ok ... labyrinthe )

Voici une carte sans Adve; les première et dernière images sont cette carte vide (cette carte est 9x15):

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

C'est le , donc le code le plus court en octets gagne!

La sortie exacte pour cela peut être trouvée ici (37 images).

C'est le , donc le code le plus court en octets gagne!

Daniel
la source
Les première et dernière lignes auront-elles toujours une seule cellule vide? Y aura-t-il toujours un seul chemin possible (pas de bifurcations)?
Luis Mendo
@LuisMendo, oui, et il n'y a "qu'un seul chemin possible"
Daniel
1
L'entrée sera-t-elle toujours au sommet?
Destructible Lemon
@DestructibleWatermelon, oui, et la sortie se fera en bas.
Daniel
4
Son vrai nom est Dave, mais il est tout mélangé.
mbomb007

Réponses:

4

Perl, 84 octets

Merci @Ton Hospel de m'avoir guidé dans la bonne direction pour jouer au golf environ 30 octets!

Bytecount comprend 82 octets de code et d' -0pindicateurs.

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

Notez qu'il y a deux espaces finaux, et pas de nouvelle ligne finale (cela ne fonctionnera pas autrement).

Prend le labyrinthe comme entrée et génère toutes les images nécessaires pour qu'Adve en sorte. Notez qu'Adve est un &plutôt qu'un , car ce dernier n'est pas utf8 (et perl n'utilise pas utf8 par défaut). Exécutez-le avec des -0pEdrapeaux:

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

Juste pour les yeux , j'ai également fait cette version animée, qui est un peu plus longue, mais effacera le terminal entre chaque impression et dormira 0,15 sec, il semblera donc qu'Adve se déplace réellement:

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
la source
Je pense que c'est le meilleur algorithme mais il peut encore être parcouru de plus de 20 octets ...
Ton Hospel
@TonHospel -9 octets jusqu'à présent (j'ai supprimé le $s="@+", je n'avais pas réalisé plus tôt que cela @+ne change que si une expression régulière réussie se produit. Et redoau lieu d' whileenregistrer un ou deux octets). Une indication sur la façon de jouer au golf plus? Je suppose que je dois m'en débarrasser d'une y///manière ou d'une autre, s///mais je ne sais pas comment.
Dada
@TonHospel (mais si vous avez travaillé sur une solution et que vous voulez la publier, ne la retenez pas parce que c'est le même algorithme ou quelque chose, ça ne me dérange pas du tout;))
Dada
La façon dont les variables d'expression régulière sont ou non conservées dans les boucles est très subtile. C'est y///bien puisque vous avez besoin de quelque chose pour indiquer la direction (mais notez que vous pouvez choisir de quel côté) Mais la principale amélioration viendra de la combinaison des substitutions
Ton Hospel
@TonHospel En effet, j'aurais dû le voir, mais j'essayais trop fort de combiner s/ &/&A/et s/& /A&/ensemble (et le prochain ensemble) pour voir que ce n'étaient pas les regex que je devais combiner! Merci beaucoup! (Et merci de m'avoir permis de découvrir comment jouer au golf!)
Dada
3

JavaScript (ES6), 137

(1 octet enregistré 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]

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

Tester

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
la source
Euh, idiot moi, merci @ETHproductions
edc65
Bon travail. J'aurais probablement fini vers 160 octets
ETHproductions