Konwertuj Brainfuck do MarioLANG

28

MarioLANG to dwuwymiarowy język programowania, w którym kod źródłowy przypomina poziom Super Mario Bros. Ponadto zestaw instrukcji jest bardzo podobny do zestawu Brainfuck . Oznacza to, że MarioLANG jest zasadniczo 2-D Brainfuck, w którym wskaźnik instrukcji porusza się jak Mario. Kiedy więc napisałem swoje zgłoszenie MarioLANG do Quizu języka programowania, zacząłem od konwersji Brainfuck „Hello, World!” program do MarioLANG. Zauważyłem, że jest to możliwe przy bardzo systematycznym procesie, więc napiszmy kompilator Brainfuck-to-MarioLANG!

Uwaga: Specyfikacja MarioLANG nie jest całkowicie jednoznaczna, więc zakładam interpretację implementacji Ruby .

Wyjaśnię ten proces następującym programem Brainfuck:

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

Drukuje Hello!i końcowy znak nowej linii.

  1. Konwertuj <i odpowiednio >na (i ):

    ++[)+++++[)+++++++)++++++++++)+++)+((((-](-]))++.)+.+++++++..+++.)+++.).
    
  2. Dodaj podłogę, po której Mario będzie chodził:

    ++[)+++++[)+++++++)++++++++++)+++)+((((-](-]))++.)+.+++++++..+++.)+++.).
    ========================================================================
    
  3. Problem polega na tym, że MarioLANG nie ma pętli takich jak [i ]. Zamiast tego musimy użyć wind i instrukcji kierunkowych, aby Mario rzeczywiście chodził w pętli. Po pierwsze, możemy zastąpić [z >i zmienić głos ". A także wymienić ]się [!i zmienić głos =#:

    ++>)+++++>)+++++++)++++++++++)+++)+((((-[!(-[!))++.)+.+++++++..+++.)+++.).
    =="======"===============================#===#============================
    
  4. "I #mogą tworzyć windy (począwszy od #, kończąc na "), więc teraz wszyscy musimy są podłogi pomocnicze do Mario iść z powrotem. Rozpocznij !i zakończ <:

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

    Zauważ, że wszystkie linie muszą być co najmniej tak długie, jak największa pętla zamykająca, ponieważ interpreter nie jest w stanie połączyć końców windy krótszymi liniami. Dlatego wypełniamy środkowe linie spacjami.

I to wszystko. Mamy w pełni funkcjonalny, równoważny program MarioLANG.

Wyzwanie

Biorąc pod uwagę poprawny program Brainfuck, zaimplementuj powyższą procedurę, aby skompilować go do programu MarioLANG.

Możesz założyć, że na wejściu są tylko znaki poleceń, tzn. Nie ma żadnych znaków oprócz ,.+-<>[].

Wszystkie podłogi pomocnicze muszą znajdować się jak najbliżej głównego piętra programu. Możesz wybrać wypełnienie linii podłóg pośrednich tak mało, jak to możliwe (do szerokości największej otaczającej pętli) lub do końca programu głównego.

Możesz napisać program lub funkcję, pobierając dane wejściowe przez STDIN (lub najbliższą alternatywę), argument wiersza poleceń lub argument funkcji i wypisując wynik przez STDOUT (lub najbliższą alternatywę), wartość zwracaną funkcji lub parametr funkcji (wyjściowej). Jeśli nie wydrukujesz wyniku do STDOUT, nadal powinien to być pojedynczy ciąg oddzielony znakiem nowej linii.

To jest kod golfowy, więc wygrywa najkrótsza odpowiedź (w bajtach).

Przypadki testowe

Przypadki testowe są sformatowane w następujący sposób: pierwszy wiersz to program Brainfuck (twoje wejście), potem jest pusty wiersz i wszystko, aż do następnego pustego wiersza jest oczekiwanym wynikiem w MarioLANG. W tych przykładach użyto minimalnej ilości wypełnionych miejsc. Alternatywnie możesz wypełnić każdą linię spacjami do szerokości pierwszego wiersza wyniku.

>,++-.<

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

,[.,]

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

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

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

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

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

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

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


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

))+++++++))++))++++))+++++++))+))++++))+))+++))+))+++++))+))++))+))++++++))++))++++))+++++++))+))+++++))++))+))+))++++))+++++++))+))+++++))+))+))+))++++))+++++++))+))+++++))++++++++++++++))+))+))++++))+++++++))+))+++++))++))+))+))++++))+++++++))+))+++++))+++++++++++++++++++++++++++++))+))+))++++))+++++++))+))+++++))++))+))+))+++++))+))++++++))+))++))+))++++++))+))++))+))++++++))+))++))+))++++++))+))++))+))++++++))+))++))+))++++++))+))++))+))++++++))++))++++))+++++++))+))+++++))+++++++))+))+++++))+))+))+))++++))+))++))+))++++++))+))+++++))+++++++))+))++++))+))+))++))+++++))+))+++))+))++++))+))++))+))++++++))+))+++++))+++++++++++++++++++))++))++))+++))++))+))++))++++))+++++++))++))+++++))++++++++++))+))++))++++))+))++))+))++++++))++++++))+))+))+++++))+))++++++))++))+++++))+++++++))++))++++))+))++++++>(([!))>)++++++>-((++++++++++))[!((++..-------------------)>-(.))+([!)>-(+)[!)[!((>->->->->->->)++)[!(+++++++++++++++++++++++++++++)[!(++)[!(++++++++++++++)[!(+)[!(++)[!((>-).([!(([!
========================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================="===#=="======="================#=========================="========#="=====#==#=="="="="="="="=====#================================#=====#=================#====#=====#=="=====#===#
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         !   <          !                <                          !        < !     <                 !     <                                                                      !     <    
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         #==="          #================"                          #========" #====="                 #====="                                                                      #====="    
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                !                                                                       <            !                                        <                                                
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                #======================================================================="            #========================================"                                                
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   !                                                <                                          
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   #================================================"                                          
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 !                                                                    <                        
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 #===================================================================="                        
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               !                                                                           <                   
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               #==========================================================================="                   
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             !                                                                                   <             
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             #==================================================================================="             
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           !                                                                                                  <
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           #=================================================================================================="
Martin Ender
źródło

Odpowiedzi:

5

CJam, 148 144 bajtów

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*

Wypróbuj online w interpretatorze CJam .

Dennis
źródło
1

Python, 707 znaków

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

Prawdopodobnie jest dużo miejsca do gry w golfa. Nie działa dla ostatniego przypadku testowego.

Przykładowe użycie:

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

Żadne wiersze wyniku nie zawierają końcowych spacji.

Loovjo
źródło
6
Jeśli to nie działa, to nie jest rozwiązanie (imo).
mınxomaτ