Canlandırın Maceracı


12

Meydan okuma

Senin görevin ürpertici (yani Halloween) labirent hareket maceracı Adve animasyon etmektir. Adve bir ; Yine de karakter sıvısı, bu yüzden farklı bir karakterle temsil edilmesini umursamıyor.

Adve'ye animasyon uygulamak için her kareyi yazdırırsınız; bir çerçeve içinde bulunduğu yeri gösteren haritadır. Adve her turda bir boşluk ileri gider ve asla geri gitmez. İlk sırada başlar ve sonda biter.

Giriş

Sınırlayıcı veya dize dizisine sahip bir dize gibi makul herhangi bir biçim. Girişin, yalnızca bir olası yol içeren 3 * 3'ten büyük bir harita olacağını varsayabilirsiniz. Mevcut olan tek karakter #ve olacaktır .

Çıktı

Çerçeveler.

Örnek labirent ( tamam ... labirent )

İşte içinde Adve olmayan bir harita; ilk ve son kareler bu boş harita (bu harita 9x15):

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

Bu , bayt en kısa kod kazanır!

Bunun için kesin çıktıyı burada bulabilirsiniz (37 kare).

Bu , bayt en kısa kod kazanır!


İlk ve son satırlarda her zaman tek bir boş hücre olur mu? Her zaman tek bir olası yol olacak mı (çatallanma yok)?
Luis Mendo

@LuisMendo, evet, ve "tek bir olası yol" var
Daniel

1
Giriş her zaman en üstte olacak mı?
Yıkılabilir Limon

@Zararlı Su karpuz, evet ve çıkış en altta olacak.
Daniel

4
Gerçek adı Dave, ama hepsi karışık.
mbomb007

Yanıtlar:


4

Perl, 84 bayt

@Ton Hospel'e yaklaşık 30 bayt golf için doğru yöne doğru rehberlik ettiğin için teşekkürler !

Bayt sayısı 82 bayt kod ve -0pbayrak içerir.

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

İki son boşluk olduğunu ve son satır olmadığını unutmayın (aksi halde çalışmaz).

Labirent Adve için çıkmak için gerekli tüm çerçeveleri çıktı olarak girdi olarak alır. Adve'nin a &yerine bir olduğunu unutmayın , çünkü ikincisi utf8 değildir (ve perl varsayılan olarak utf8 kullanmaz). -0pEBayraklarla çalıştırın :

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

Sadece gözler için , bu animasyonlu sürümü de biraz daha uzun yaptım, ancak her baskı ve uyku 0.15 saniye arasındaki terminali temizleyeceğim, bu yüzden Adve aslında hareket ediyor gibi görünecek:

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' <<< "### #####
##  #####
## ######
##      #
####### #
#   ### #
# # #   #
# #   ###
# #######
#    ####
#### ####
####  ###
##### ###
##### ###"

Bence bu en iyi algoritma ama yine de 20 bayttan daha fazla
golf oynayabilir

@TonHospel -9 bayt (şimdiye kadar kaldırdım, $s="@+"daha önce fark etmemiştim, @+bu sadece başarılı bir normal ifade oluşursa değişti . Ve bir veya iki bayt redoyerine while). Nasıl daha fazla golf hakkında ipucu var mı? Sanırım bunlardan bir y///şekilde kurtulmak ya da s///kısaltmak zorundayım ... ama her iki şekilde de nasıl yapacağımı bilmiyorum.
Dada

@TonHospel (ancak bir çözüm üzerinde çalıştıysanız ve göndermek istiyorsanız, aynı algoritma veya başka bir şey olduğu için tutmayın, hiç umursamıyorum;))
Dada

Normal ifade değişkenlerinin döngülerde tutulması veya tutulmaması çok incedir. y///Eğer yönünü belirtmek için bir şeye ihtiyacım beri gayet Ama ana gelişme birleştiren sübstitüsyonlanndan gelecektir (ancak seçim için olsun fark hangi tarafta)
Ton Hospel

@TonHospel Gerçekten görmeliydim, ama birleştirmek için çok fazla uğraşıyordum s/ &/&A/ve s/& /A&/birlikte (ve yan yana), bunların birleştirmem gereken regex olmadığını görmek için çok çalışıyordum ! Çok teşekkürler! (Ve nasıl golf
Dada

3

JavaScript (ES6), 137

(@ETHproductions 1 bayt kaydedildi)

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]

Daha az 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
}

Ölçek

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>


Aptal, aptal bana, teşekkürler @ETHproductions
edc65

Harika iş. Muhtemelen 160 byte civarında
bitirdim
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.