Animacja Adve the Adventurer

12

Wyzwanie

Twoim zadaniem jest animowanie Adve the Adventurer poruszającego się w przerażającym labiryncie. Adve jest ; jest jednak płynny, więc nie przeszkadza mu, że reprezentuje go inna postać.

Aby animować Adve, drukujesz każdą ramkę; ramka to mapa z jego bieżącą lokalizacją. Adve przesuwa się o jedno pole do przodu co turę i nigdy się nie wycofuje. Zaczyna w pierwszym rzędzie, a kończy w ostatnim.

Wejście

Każdy rozsądny format, taki jak ciąg znaków z separatorem lub tablicą ciągów. Możesz założyć, że wejście będzie mapą większą niż 3 * 3, zawierającą tylko jedną możliwą ścieżkę. Jedynymi obecnymi postaciami będą #i .

Wynik

Ramy.

Przykładowy labirynt ( ok ... labirynt )

Oto mapa bez Adve; pierwsza i ostatnia klatka to ta pusta mapa (ta mapa ma wymiary 9 x 15):

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

To jest , więc wygrywa najkrótszy kod w bajtach!

Dokładny wyjście na ten temat można znaleźć tutaj (37 klatek).

To jest , więc wygrywa najkrótszy kod w bajtach!

Daniel
źródło
Czy pierwszy i ostatni wiersz zawsze będą miały jedną pustą komórkę? Czy zawsze będzie jedna możliwa ścieżka (bez rozgałęzień)?
Luis Mendo
@LuisMendo, tak, i jest „tylko jedna możliwa ścieżka”
Daniel
1
Czy wejście zawsze będzie na górze?
Destructible Lemon
@DestructibleWatermelon, tak, a wyjście będzie na dole.
Daniel
4
Naprawdę nazywa się Dave, ale jest całkowicie pomieszany.
mbomb007,

Odpowiedzi:

4

Perl, 84 bajtów

Dzięki @Ton Hospel za poprowadzenie mnie we właściwym kierunku do gry w golfa około 30 bajtów!

Liczba bajtów zawiera 82 bajty kodu i -0pflag.

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

Zauważ, że są dwie końcowe spacje i brak końcowej nowej linii (inaczej nie zadziała).

Bierze labirynt jako dane wejściowe jako dane wyjściowe wszystkich potrzebnych ramek, aby Adve mógł z niego wyjść. Zauważ, że Adve jest &raczej niż a , ponieważ ten ostatni nie jest utf8 (a perl domyślnie nie używa utf8). Uruchom go z -0pEflagami:

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

Dla oczu stworzyłem też tę animowaną wersję, która jest nieco dłuższa, ale wyczyści terminal między każdym drukiem a snem 0,15 sekundy, więc będzie wyglądać, jakby Adve się poruszał:

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
źródło
Myślę, że to najlepszy algorytm, ale można go jeszcze pograć w golfa o ponad 20 bajtów ...
Ton Hospel,
@TonHospel -9 bajtów do tej pory (usunąłem $s="@+", nie zdawałem sobie wcześniej sprawy, że @+zmieni się to tylko w przypadku pomyślnego wyrażenia regularnego. redoZamiast whilezapisanego jednego lub dwóch bajtów). Wszelkie wskazówki na temat tego, jak bardziej grać w golfa? Zgaduję, że muszę się y///jakoś ich pozbyć lub s///skrócić ... ale tak czy inaczej nie wiem jak.
Dada,
@TonHospel (ale jeśli pracowałeś nad rozwiązaniem i chcesz go opublikować, nie trzymaj go, ponieważ jest to ten sam algorytm lub coś, nie mam nic przeciwko;))
Dada
To, jak zmienne regularne są lub nie są przechowywane w pętlach, jest bardzo subtelne. y///Jest w porządku, ponieważ trzeba coś wskazujący kierunek (ale zauważ, masz do wyboru, po której stronie) Ale głównym poprawa będzie pochodzić z substytucji łączących
Ton Hospel
@TonHospel Rzeczywiście, powinienem to zobaczyć, ale zbyt mocno starałem się łączyć s/ &/&A/i s/& /A&/razem (i obok siebie), aby zobaczyć, że nie były to wyrażenia regularne, których potrzebowałem połączyć! Wielkie dzięki! (I dzięki, że mogłem dowiedzieć się, jak grać w golfa!)
Dada
3

JavaScript (ES6), 137

(1 bajt zapisany dzięki xEETHproductions)

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]

Mniej golfa

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>

edc65
źródło
Uh, głupie ja, dzięki @ETHproductions
edc65
Świetna robota. Prawdopodobnie skończyłbym około 160 bajtów
ETHproductions