Brainfuck ile MarioLANG Birimini Çevirme


28

MarioLANG , kaynak kodunun Super Mario Bros. seviyesine benzeyen iki boyutlu bir programlama dilidir. Dahası, talimat seti Brainfuck 'a çok benziyor . Bu, MarioLANG'nın esas olarak, talimat göstergesinin Mario gibi hareket ettiği 2-D Brainfuck olduğu anlamına gelir. Bu yüzden MarioLANG’nın Programlama Dili Sınavına gönderimini yazarken , bir Brainfuck’a “Merhaba, Dünya!” MarioLANG programına. Bunun çok sistematik bir süreçle mümkün olduğunu fark ettim, hadi bir Brainfuck to MarioLANG derleyicisi yazalım!

Not: MarioLANG spec tamamen açık değildir, bu yüzden Ruby uygulamasının yorumunu kabul ediyorum .

Süreci aşağıdaki Brainfuck programı ile açıklayacağım:

++[>+++++[>+++++++>++++++++++>+++>+<<<<-]<-]>>++.>+.+++++++..+++.>+++.>.

Yazdırır Hello!ve takip eden bir yeni satır.

  1. Dönüştürme <ve >için (ve )sırasıyla:

    ++[)+++++[)+++++++)++++++++++)+++)+((((-](-]))++.)+.+++++++..+++.)+++.).
    
  2. Mario üzerinde yürümek için bir zemin ekleyin:

    ++[)+++++[)+++++++)++++++++++)+++)+((((-](-]))++.)+.+++++++..+++.)+++.).
    ========================================================================
    
  3. Şimdi sorun şu ki, MarioLANG [ve gibi döngülere sahip değil ]. Bunun yerine, Mario'nun gerçekten bir döngüde yürümesini sağlamak için asansörler ve yön talimatları kullanmak zorundayız. İlk olarak, yerini [ile >ve zemin değiştirmek ". Ve biz de değiştirmek ]ile [!ve zemin değiştirmek =#:

    ++>)+++++>)+++++++)++++++++++)+++)+((((-[!(-[!))++.)+.+++++++..+++.)+++.).
    =="======"===============================#===#============================
    
  4. "Ve #asansörler oluştururlar (başlayarak olabilir #biten, "şimdi hepimiz Mario geri yürümeye için yardımcı zemin vardır ihtiyaç). İle başlar !ve biter <:

    ++>)+++++>)+++++++)++++++++++)+++)+((((-[!(-[!))++.)+.+++++++..+++.)+++.).
    =="======"===============================#===#============================
             !                               <    
             #==============================="    
      !                                          <
      #=========================================="
    

    Tercüman asansörün uçlarını daha kısa hatlar boyunca bağlayamadığından, tüm hatların en azından en geniş kapalı devre sürece olması gerektiğini unutmayın. Bu nedenle orta çizgileri boşluklarla dolduruyoruz.

Ve bu kadar. Tamamen işlevsel, eşdeğer bir MarioLANG programımız var.

Meydan okuma

Geçerli bir Brainfuck programı verildiğinde, yukarıdaki prosedürü bir MarioLANG programında derlemek için uygulayın.

Girişte yalnızca komut karakterleri olduğunu, yani karakter dışında karakterlerin olduğunu varsayabilirsiniz ,.+-<>[].

Tüm yardımcı katlar, ana program katına mümkün olduğunca yakın olmalıdır. Ara katların hatlarını mümkün olduğu kadar az (en büyük muhafaza halkasının genişliğine kadar) veya ana programın sonuna kadar doldurmayı seçebilirsiniz.

STDIN (veya en yakın alternatif), komut satırı argümanı veya işlev argümanı yoluyla giriş alarak ve sonucu STDOUT (veya en yakın alternatif), fonksiyon dönüş değeri veya function (out) parametresi ile çıktı alarak bir program veya işlev yazabilirsiniz. Sonucu STDOUT'a yazdırmazsanız, yine de yeni satırlarla ayrılmış tek bir dize olmalıdır.

Bu kod golf, yani en kısa cevap (bayt cinsinden) kazanır.

Test Kılıfları

Test senaryoları şu şekilde biçimlendirilir: ilk satır Brainfuck programıdır (girişiniz), daha sonra boş bir satır vardır ve bir sonraki boş satıra kadar her şey MarioLANG'da beklenen çıktıdır. Bu örnekler minimum miktarda yastıklı boşluk kullanır. Alternatif olarak, her bir çizgiyi, çıktının ilk çizgisinin genişliğine boşluklarla doldurabilirsiniz.

>,++-.<

),++-.(
=======

,[.,]

,>.,[!
="===#
 !   <
 #==="

>>[-]<<[->>+<<]

))>-[!((>-))+(([!
=="==#=="=======#
  !  <  !       <
  #=="  #======="

++[>+++++[>+++++++>++++++++++>+++>+<<<<-]<-]>>++.>+.+++++++..+++.>+++.>.

++>)+++++>)+++++++)++++++++++)+++)+((((-[!(-[!))++.)+.+++++++..+++.)+++.).
=="======"===============================#===#============================
         !                               <    
         #==============================="    
  !                                          <
  #=========================================="

[][[[][[]]][]][[]]

>[!>>>[!>>[![![!>[![!>>[![!
"=#"""=#""=#=#=#"=#=#""=#=#
! <  ! < ! <    ! <   ! <  
#="  #=" #="    #="   #="  
        !    <       !    <
        #===="       #===="
    !          <     
    #=========="     
   !                <
   #================"


>>+++++++>>++>>++++>>+++++++>>+>>++++>>+>>+++>>+>>+++++>>+>>++>>+>>++++++>>++>>++++>>+++++++>>+>>+++++>>++>>+>>+>>++++>>+++++++>>+>>+++++>>+>>+>>+>>++++>>+++++++>>+>>+++++>>++++++++++++++>>+>>+>>++++>>+++++++>>+>>+++++>>++>>+>>+>>++++>>+++++++>>+>>+++++>>+++++++++++++++++++++++++++++>>+>>+>>++++>>+++++++>>+>>+++++>>++>>+>>+>>+++++>>+>>++++++>>+>>++>>+>>++++++>>+>>++>>+>>++++++>>+>>++>>+>>++++++>>+>>++>>+>>++++++>>+>>++>>+>>++++++>>+>>++>>+>>++++++>>++>>++++>>+++++++>>+>>+++++>>+++++++>>+>>+++++>>+>>+>>+>>++++>>+>>++>>+>>++++++>>+>>+++++>>+++++++>>+>>++++>>+>>+>>++>>+++++>>+>>+++>>+>>++++>>+>>++>>+>>++++++>>+>>+++++>>+++++++++++++++++++>>++>>++>>+++>>++>>+>>++>>++++>>+++++++>>++>>+++++>>++++++++++>>+>>++>>++++>>+>>++>>+>>++++++>>++++++>>+>>+>>+++++>>+>>++++++>>++>>+++++>>+++++++>>++>>++++>>+>>++++++[<<]>>[>++++++[-<<++++++++++>>]<<++..------------------->[-<.>>+<]>[-<+>]>]<<[-[-[-[-[-[-[>++>]<+++++++++++++++++++++++++++++>]<++>]<++++++++++++++>]<+>]<++>]<<[->.<]<<]

))+++++++))++))++++))+++++++))+))++++))+))+++))+))+++++))+))++))+))++++++))++))++++))+++++++))+))+++++))++))+))+))++++))+++++++))+))+++++))+))+))+))++++))+++++++))+))+++++))++++++++++++++))+))+))++++))+++++++))+))+++++))++))+))+))++++))+++++++))+))+++++))+++++++++++++++++++++++++++++))+))+))++++))+++++++))+))+++++))++))+))+))+++++))+))++++++))+))++))+))++++++))+))++))+))++++++))+))++))+))++++++))+))++))+))++++++))+))++))+))++++++))+))++))+))++++++))++))++++))+++++++))+))+++++))+++++++))+))+++++))+))+))+))++++))+))++))+))++++++))+))+++++))+++++++))+))++++))+))+))++))+++++))+))+++))+))++++))+))++))+))++++++))+))+++++))+++++++++++++++++++))++))++))+++))++))+))++))++++))+++++++))++))+++++))++++++++++))+))++))++++))+))++))+))++++++))++++++))+))+))+++++))+))++++++))++))+++++))+++++++))++))++++))+))++++++>(([!))>)++++++>-((++++++++++))[!((++..-------------------)>-(.))+([!)>-(+)[!)[!((>->->->->->->)++)[!(+++++++++++++++++++++++++++++)[!(++)[!(++++++++++++++)[!(+)[!(++)[!((>-).([!(([!
========================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================="===#=="======="================#=========================="========#="=====#==#=="="="="="="="=====#================================#=====#=================#====#=====#=="=====#===#
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         !   <          !                <                          !        < !     <                 !     <                                                                      !     <    
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         #==="          #================"                          #========" #====="                 #====="                                                                      #====="    
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                !                                                                       <            !                                        <                                                
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                #======================================================================="            #========================================"                                                
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   !                                                <                                          
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   #================================================"                                          
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 !                                                                    <                        
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 #===================================================================="                        
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               !                                                                           <                   
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               #==========================================================================="                   
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             !                                                                                   <             
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             #==================================================================================="             
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           !                                                                                                  <
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           #=================================================================================================="

Yanıtlar:


5

CJam, 148 144 bayt

q"<>[""()>"er']/"[!"*_">!"1$|"\"#=":Cer:FF,[{SF,*L{'=t}/FI>(C#"['=-{_'##}{_CW</s}w],2*(:M'#tM('!tLM+ ;LW=34ctLW=('<tLW< ;L"S/=~:L;}fI]z~]{S-},N*

CJam tercümanında çevrimiçi olarak deneyin .


1

Python, 707 karakter

def b(c):
 c,l,o,x,j,m=list(c.replace(">",")").replace("<","(")),[list("="*len(c))],[],[],0,0
 for i,z in enumerate(c):
  i+=j
  if"["==z:
   c[i],l[0][i]=">",'"'
   x.append(i)
  if"]"==z:
   c[i],l[0][i]="[!","=#"
   c,l[0],m,d,b=list("".join(c)),list("".join(l[0])),max(m,len(x)),0,x.pop()
   for a in o:d+=b<a[0]and-~i>a[0]or b<a[1]and-~i>a[1]
   o.append((b,i+1,d))
   j+=1
 for q in o:
  d=q[2]*2+1
  while len(l)<=d+1:l.append(list(" "*len(c)))
  l[d][q[0]],l[d+1][q[0]],l[d][q[1]],l[d+1][q[1]]="!","#","<",'"'
  for i in range(q[0]+1,q[1]):l[d+1][i]="="
 g="\n".join(l.rstrip()for l in("".join(c)+"\n"+"\n".join("".join(f)for f in l)).split("\n"))
 while"\n\n"in g:g=g.replace("\n\n","\n")
 return g

Muhtemelen golf oynamak için çok fazla alan var. Son test durumu için işe yaramaz.

Örnek kullanım:

>>> print b("++[>+++<-]>[<+++>-]<.")
=="=======#="=======#==
  !       < !       <
  #=======" #======="

Çıktıdaki hiçbir çizgi sonda boşluk içermez.


6
İşe yaramazsa, bir çözüm değildir (imo).
mınxomaτ
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.