Animate Adve the Adventurer

12

Tantangan

Tugas Anda adalah untuk menghidupkan Adve the Adventurer yang bergerak melalui labirin menyeramkan (yaitu Halloween). Adve adalah ; dia adalah karakter yang berubah-ubah, jadi dia tidak keberatan diwakili oleh karakter yang berbeda.

Untuk menghidupkan Adve, Anda mencetak setiap bingkai; bingkai adalah peta dengan lokasi saat ini di dalamnya. Adve bergerak satu ruang maju setiap belokan dan tidak pernah mundur. Dia mulai di baris pertama dan berakhir di yang terakhir.

Memasukkan

Format beralasan seperti string dengan pembatas atau string array. Anda dapat berasumsi bahwa input akan berupa peta yang lebih besar dari 3 * 3, hanya berisi satu jalur yang memungkinkan. Satu-satunya karakter yang ada adalah #dan .

Keluaran

Frame.

Contoh labirin ( ok ... labirin )

Ini adalah peta tanpa Adve di dalamnya; frame pertama dan terakhir adalah peta kosong ini (peta ini berukuran 9x15):

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

Ini adalah , jadi kode terpendek dalam byte menang!

The tepat output untuk ini dapat ditemukan di sini (37 frame).

Ini adalah , jadi kode terpendek dalam byte menang!

Daniel
sumber
Apakah baris pertama dan terakhir selalu memiliki satu sel kosong? Akankah selalu ada satu kemungkinan jalur (tidak ada bifurkasi)?
Luis Mendo
@LuisMendo, ya, dan ada "hanya satu jalan yang mungkin"
Daniel
1
Akankah pintu masuk selalu di atas?
Destructible Lemon
@DestructibleWatermelon, ya, dan pintu keluar akan di bagian bawah.
Daniel
4
Nama aslinya adalah Dave, tapi dia bingung.
mbomb007

Jawaban:

4

Perl, 84 byte

Terima kasih @Ton Hospel untuk membimbing saya ke arah yang benar untuk bermain golf sekitar 30 byte!

Bytecount mencakup 82 byte kode dan -0pbendera.

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

Perhatikan bahwa ada dua ruang terakhir, dan tidak ada baris baru final (tidak akan berfungsi sebaliknya).

Mengambil labirin sebagai input sebagai output semua frame yang dibutuhkan Adve untuk keluar darinya. Perhatikan bahwa Adve &lebih daripada a , karena yang terakhir tidak utf8 (dan perl tidak menggunakan utf8 secara default). Jalankan dengan -0pEbendera:

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

Hanya untuk mata , saya juga membuat versi animasi ini, yang sedikit lebih lama, tetapi akan menghapus terminal antara setiap cetakan dan tidur 0,15 detik, sehingga akan terlihat seperti Adve benar-benar bergerak:

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
sumber
Saya pikir ini adalah algoritma terbaik tetapi masih dapat diturunkan lebih dari 20 byte ...
Ton Hospel
@TonHospel -9 byte sejauh ini (saya menghapus $s="@+", saya tidak menyadari sebelumnya bahwa @+hanya berubah jika regex yang berhasil terjadi. Dan redobukannya whilemenyimpan satu atau dua byte). Adakah petunjuk tentang cara bermain golf lebih banyak? Kurasa aku harus menyingkirkannya y///entah bagaimana, atau s///memperpendeknya ... tapi bagaimanapun aku tidak tahu caranya.
Dada
@TonHospel (tetapi jika Anda bekerja pada solusi dan ingin mempostingnya, jangan pegang karena itu algoritma yang sama atau sesuatu, saya tidak akan keberatan sama sekali;))
Dada
Bagaimana variabel regex disimpan atau tidak dalam loop sangat halus. Ini y///bagus karena Anda perlu sesuatu untuk menunjukkan arah (tetapi perhatikan Anda harus memilih di sisi mana) Tapi peningkatan utama akan datang dari menggabungkan substitusi
Ton Hospel
@TonHospel Memang, saya seharusnya melihatnya, tetapi saya berusaha terlalu keras untuk menggabungkan s/ &/&A/dan s/& /A&/bersama - sama (dan selanjutnya bersama-sama) untuk melihat bahwa itu bukan regex yang saya butuhkan untuk digabungkan! Terima kasih banyak! (Dan terima kasih telah memberi tahu saya cara bermain golf!)
Dada
3

JavaScript (ES6), 137

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

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

Uji

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
sumber
Eh, konyol aku, terima kasih @ETHproductions
edc65
Kerja bagus. Saya mungkin akan berakhir sekitar 160 byte
ETHproduk