Перетворити Brainfuck в MarioLANG


28

MarioLANG - це двовимірна мова програмування, де вихідний код нагадує рівень Super Mario Bros. Крім того, його набір інструкцій дуже схожий на Brainfuck 's. Це означає, що MarioLANG - це по суті 2-D Brainfuck, де покажчик інструкцій рухається як Маріо. Тож коли я написав свою заявку на MarioLANG для вікторини з мовою програмування, я почав з перетворення Brainfuck "Привіт, світ!" програма на MarioLANG. Я помітив, що це можливо за допомогою дуже систематичного процесу, тому давайте напишемо компілятор Brainfuck-to-MarioLANG!

Примітка: специфікація MarioLANG не зовсім однозначна, тому я припускаю інтерпретацію реалізації Ruby .

Я поясню процес за допомогою наступної програми Brainfuck:

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

Він друкує Hello!та зворотний новий рядок.

  1. Перетворення <і >до (і ), відповідно:

    ++[)+++++[)+++++++)++++++++++)+++)+((((-](-]))++.)+.+++++++..+++.)+++.).
    
  2. Додайте підлогу, щоб Маріо ходив:

    ++[)+++++[)+++++++)++++++++++)+++)+((((-](-]))++.)+.+++++++..+++.)+++.).
    ========================================================================
    
  3. Тепер проблема полягає в тому, що MarioLANG не має циклів, як [і ]. Натомість нам доводиться використовувати ліфти та вказівки щодо спрямованості, щоб Маріо насправді ходив у петлі. По- перше, ми замінимо [з >і змінити слово ". І ми також замінити ]з [!і змінити слово =#:

    ++>)+++++>)+++++++)++++++++++)+++)+((((-[!(-[!))++.)+.+++++++..+++.)+++.).
    =="======"===============================#===#============================
    
  4. "І #можуть утворювати ліфти (починаючи з #, закінчуючи "), так що тепер все , що нам потрібні додаткові поверхи для Маріо йти назад. Початок !і закінчення з <:

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

    Зауважте, що всі лінії повинні бути як мінімум до тих пір, як найбільша петля, що обгороджує, тому що перекладач не в змозі з'єднати кінці ліфтів через більш короткі лінії. Тому прокладаємо середні лінії пробілами.

І це все. У нас є повністю функціональна, еквівалентна програма MarioLANG.

Змагання

З огляду на дійсну програму Brainfuck, реалізуйте описану вище процедуру, щоб компілювати її в програму MarioLANG.

Ви можете припустити, що у вводі є лише командні символи, тобто немає, крім символів ,.+-<>[].

Усі допоміжні підлоги повинні бути максимально наближені до основного поверху програми. Ви можете прокладати лінії проміжних поверхів якомога менше (до ширини найбільшого огороджувального циклу) або до кінця основної програми.

Ви можете написати програму або функцію, взявши введення через STDIN (або найближчу альтернативу), аргумент командного рядка або аргумент функції та вивівши результат через STDOUT (або найближчу альтернативу), значення повернення функції або параметр функції (out). Якщо ви не друкуєте результат на STDOUT, він все одно повинен бути одним рядком, розділеним новим рядком.

Це кодовий гольф, тому найкоротша відповідь (у байтах) виграє.

Випробування

Тестові приклади форматуються наступним чином: перший рядок - це програма Brainfuck (ваш вхід), потім є порожній рядок, і все до наступного порожнього рядка - очікуваний вихід у MarioLANG. У цих прикладах використовується мінімальна кількість прокладених пробілів. Крім того, ви можете прокладати кожен рядок пробілами до ширини першого рядка виводу.

>,++-.<

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

,[.,]

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

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

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

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

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

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

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


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

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

Відповіді:



1

Пітон, 707 символів

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

Напевно, багато місця для гольфу. Не працює для останнього тестового випадку.

Приклад використання:

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

Жоден рядок у висновку не містить пробіли.


6
Якщо це не працює, це не рішення (imo).
mınxomaτ
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.