Animiere Adve the Adventurer

12

Die Herausforderung

Deine Aufgabe ist es, Adve the Adventurer zu animieren, der sich durch ein gruseliges (dh Halloween) Labyrinth bewegt. Adve ist ein ; Er ist jedoch ein flüssiger Charakter, und es macht ihm nichts aus, von einem anderen Charakter dargestellt zu werden.

Um Adve zu animieren, drucken Sie jeden Frame aus. Ein Rahmen ist die Karte mit seiner aktuellen Position. Adve rückt in jeder Runde um ein Feld vor und niemals zurück. Er beginnt in der ersten Reihe und endet in der letzten.

Eingang

Jedes vernünftige Format wie eine Zeichenfolge mit einem Trennzeichen oder einem Zeichenfolgenarray. Sie können davon ausgehen, dass es sich bei der Eingabe um eine Karte handelt, die größer als 3 * 3 ist und nur einen möglichen Pfad enthält. Die einzigen anwesenden Zeichen sind #und .

Ausgabe

Die Frames.

Beispiel Labyrinth ( ok ... Labyrinth )

Hier ist eine Karte ohne Adve; Der erste und letzte Frame sind diese leere Karte (diese Karte ist 9x15):

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

Das ist , also gewinnt der kürzeste Code in Bytes!

Die genaue Ausgabe dazu finden Sie hier (37 Frames).

Das ist , also gewinnt der kürzeste Code in Bytes!

Daniel
quelle
Haben die erste und letzte Zeile immer eine leere Zelle? Wird es immer einen einzigen möglichen Pfad geben (keine Verzweigungen)?
Luis Mendo
@ LuisMendo, ja, und es gibt "nur einen möglichen Weg"
Daniel
1
Wird der Eingang immer oben sein?
Destructible Lemon
@DestructibleWatermelon, ja, und der Ausgang wird unten sein.
Daniel
4
Sein richtiger Name ist Dave, aber er ist völlig durcheinander.
mbomb007

Antworten:

4

Perl, 84 Bytes

Vielen Dank an @Ton Hospel , der mich in die richtige Richtung geführt hat, um ungefähr 30 Bytes Golf zu spielen!

Bytecount enthält 82 Byte Code und -0pFlags.

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

Beachten Sie, dass es zwei abschließende Leerzeichen und keine abschließende Newline gibt (sonst funktioniert es nicht).

Nimmt das Labyrinth als Eingabe und gibt alle erforderlichen Frames aus, damit Adve es verlässt. Beachten Sie, dass Adve &eher ein als ein ist , da letzteres nicht utf8 ist (und Perl standardmäßig utf8 nicht verwendet). Führe es mit -0pEFlags aus:

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

Nur für die Augen , ich habe auch diese animierte Version gemacht, die etwas länger ist, aber das Terminal zwischen jedem Ausdruck löscht und 0,15 Sekunden ruht, so dass es aussieht, als würde sich Adve tatsächlich bewegen:

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
quelle
Ich denke, es ist der beste Algorithmus, aber er kann immer noch um mehr als 20 Bytes reduziert werden ...
Ton Hospel
@TonHospel -9 Bytes bisher (Ich habe das entfernt $s="@+", ich hatte vorher nicht gemerkt , dass @+sich das nur ändert, wenn eine erfolgreiche Regex auftritt. Und redostattdessen whileein oder zwei Bytes gespeichert). Irgendwelche Tipps, wie man mehr Golf spielt? Ich schätze, ich muss die y///irgendwie loswerden oder s///kürzer machen ... aber so oder so weiß ich nicht wie.
Dada
@TonHospel (aber wenn du an einer Lösung gearbeitet hast und sie posten möchtest, halte sie nicht fest, weil es derselbe Algorithmus ist oder so, es macht mir nichts aus;))
Dada
Wie Regex-Variablen in Schleifen gehalten werden oder nicht, ist sehr subtil. Das y///ist in Ordnung , da man etwas braucht Richtung anzuzeigen (aber beachten Sie , auf welcher Seite wählen bekommen) , aber die wichtigste Verbesserung kommt aus der Kombination von Substitutionen
Ton Hospel
@TonHospel Eigentlich hätte ich es sehen sollen, aber ich habe mich zu sehr bemüht, s/ &/&A/und s/& /A&/zusammen (und nebeneinander) zu kombinieren, um zu sehen, dass dies nicht der Regex war, den ich kombinieren musste! Danke vielmals! (Und danke, dass ich herausgefunden habe, wie man Golf spielt!)
Dada
3

JavaScript (ES6), 137

(1 Byte gespeichert dank @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]

Weniger golfen

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
}

Prüfung

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
quelle
Äh, dumm mich, danke @ETHproductions
edc65
Gute Arbeit. Ich hätte wahrscheinlich 160 Bytes gefunden
ETHproductions