MarioLANG es un lenguaje de programación bidimensional donde el código fuente se asemeja a un nivel de Super Mario Bros. Además, su conjunto de instrucciones es muy similar al de Brainfuck . Esto significa que MarioLANG es esencialmente un Brainfuck 2-D donde el puntero de instrucciones se mueve como Mario. Entonces, cuando escribí mi envío de MarioLANG para el concurso de lenguaje de programación, comencé convirtiendo un Brainfuck "¡Hola, mundo!" programa para MarioLANG. Me di cuenta de que esto es posible con un proceso muy sistemático, ¡así que escribamos un compilador Brainfuck-to-MarioLANG!
Nota: La especificación MarioLANG no es del todo inequívoca, por lo que estoy asumiendo la interpretación de la implementación de Ruby .
Explicaré el proceso con el siguiente programa Brainfuck:
++[>+++++[>+++++++>++++++++++>+++>+<<<<-]<-]>>++.>+.+++++++..+++.>+++.>.
Se imprime Hello!
y una nueva línea final.
Convertir
<
y>
a(
y)
, respectivamente:++[)+++++[)+++++++)++++++++++)+++)+((((-](-]))++.)+.+++++++..+++.)+++.).
Agregue un piso para que Mario camine:
++[)+++++[)+++++++)++++++++++)+++)+((((-](-]))++.)+.+++++++..+++.)+++.). ========================================================================
Ahora el problema es que MarioLANG no tiene bucles como
[
y]
. En cambio, tenemos que usar ascensores e instrucciones direccionales para hacer que Mario realmente camine en un bucle. Primero, reemplazamos[
con>
y cambiamos el piso a"
. Y también reemplazamos]
con[!
y cambiamos el piso a=#
:++>)+++++>)+++++++)++++++++++)+++)+((((-[!(-[!))++.)+.+++++++..+++.)+++.). =="======"===============================#===#============================
El
"
y#
puede formar ascensores (comenzando desde#
, terminando en"
), por lo que ahora todo lo que necesitamos son pisos auxiliares para que Mario camine de regreso. El comienzo con!
y termina con<
:++>)+++++>)+++++++)++++++++++)+++)+((((-[!(-[!))++.)+.+++++++..+++.)+++.). =="======"===============================#===#============================ ! < #===============================" ! < #=========================================="
Tenga en cuenta que todas las líneas deben ser al menos tan largas como el bucle de cierre más grande, ya que el intérprete no puede conectar los extremos del elevador a través de líneas más cortas. Por lo tanto, rellenamos las líneas medias con espacios.
Y eso es. Tenemos un programa MarioLANG totalmente funcional y equivalente.
El reto
Dado un programa Brainfuck válido, implemente el procedimiento anterior para compilarlo en un programa MarioLANG.
Puede suponer que solo hay caracteres de comando en la entrada, es decir, no hay caracteres excepto ,.+-<>[]
.
Todo el piso auxiliar debe estar lo más cerca posible del piso principal del programa. Puede elegir rellenar las líneas de los pisos intermedios lo menos posible (hasta el ancho del bucle de cerramiento más grande) o hasta el final del programa principal.
Puede escribir un programa o función, tomando la entrada a través de STDIN (o la alternativa más cercana), argumento de línea de comando o argumento de función y generando el resultado a través de STDOUT (o la alternativa más cercana), el valor de retorno de la función o el parámetro de función (out). Si no imprime el resultado en STDOUT, aún debería ser una sola cadena separada por una nueva línea.
Este es el código de golf, por lo que gana la respuesta más corta (en bytes).
Casos de prueba
Los casos de prueba están formateados de la siguiente manera: la primera línea es el programa Brainfuck (su entrada), luego hay una línea vacía, y todo hasta la próxima línea vacía es la salida esperada en MarioLANG. Estos ejemplos usan la cantidad mínima de espacios acolchados. Alternativamente, puede rellenar cada línea con espacios al ancho de la primera línea de la salida.
>,++-.<
),++-.(
=======
,[.,]
,>.,[!
="===#
! <
#==="
>>[-]<<[->>+<<]
))>-[!((>-))+(([!
=="==#=="=======#
! < ! <
#==" #======="
++[>+++++[>+++++++>++++++++++>+++>+<<<<-]<-]>>++.>+.+++++++..+++.>+++.>.
++>)+++++>)+++++++)++++++++++)+++)+((((-[!(-[!))++.)+.+++++++..+++.)+++.).
=="======"===============================#===#============================
! <
#==============================="
! <
#=========================================="
[][[[][[]]][]][[]]
>[!>>>[!>>[![![!>[![!>>[![!
"=#"""=#""=#=#=#"=#=#""=#=#
! < ! < ! < ! < ! <
#=" #=" #=" #=" #="
! < ! <
#====" #===="
! <
#=========="
! <
#================"
>>+++++++>>++>>++++>>+++++++>>+>>++++>>+>>+++>>+>>+++++>>+>>++>>+>>++++++>>++>>++++>>+++++++>>+>>+++++>>++>>+>>+>>++++>>+++++++>>+>>+++++>>+>>+>>+>>++++>>+++++++>>+>>+++++>>++++++++++++++>>+>>+>>++++>>+++++++>>+>>+++++>>++>>+>>+>>++++>>+++++++>>+>>+++++>>+++++++++++++++++++++++++++++>>+>>+>>++++>>+++++++>>+>>+++++>>++>>+>>+>>+++++>>+>>++++++>>+>>++>>+>>++++++>>+>>++>>+>>++++++>>+>>++>>+>>++++++>>+>>++>>+>>++++++>>+>>++>>+>>++++++>>+>>++>>+>>++++++>>++>>++++>>+++++++>>+>>+++++>>+++++++>>+>>+++++>>+>>+>>+>>++++>>+>>++>>+>>++++++>>+>>+++++>>+++++++>>+>>++++>>+>>+>>++>>+++++>>+>>+++>>+>>++++>>+>>++>>+>>++++++>>+>>+++++>>+++++++++++++++++++>>++>>++>>+++>>++>>+>>++>>++++>>+++++++>>++>>+++++>>++++++++++>>+>>++>>++++>>+>>++>>+>>++++++>>++++++>>+>>+>>+++++>>+>>++++++>>++>>+++++>>+++++++>>++>>++++>>+>>++++++[<<]>>[>++++++[-<<++++++++++>>]<<++..------------------->[-<.>>+<]>[-<+>]>]<<[-[-[-[-[-[-[>++>]<+++++++++++++++++++++++++++++>]<++>]<++++++++++++++>]<+>]<++>]<<[->.<]<<]
))+++++++))++))++++))+++++++))+))++++))+))+++))+))+++++))+))++))+))++++++))++))++++))+++++++))+))+++++))++))+))+))++++))+++++++))+))+++++))+))+))+))++++))+++++++))+))+++++))++++++++++++++))+))+))++++))+++++++))+))+++++))++))+))+))++++))+++++++))+))+++++))+++++++++++++++++++++++++++++))+))+))++++))+++++++))+))+++++))++))+))+))+++++))+))++++++))+))++))+))++++++))+))++))+))++++++))+))++))+))++++++))+))++))+))++++++))+))++))+))++++++))+))++))+))++++++))++))++++))+++++++))+))+++++))+++++++))+))+++++))+))+))+))++++))+))++))+))++++++))+))+++++))+++++++))+))++++))+))+))++))+++++))+))+++))+))++++))+))++))+))++++++))+))+++++))+++++++++++++++++++))++))++))+++))++))+))++))++++))+++++++))++))+++++))++++++++++))+))++))++++))+))++))+))++++++))++++++))+))+))+++++))+))++++++))++))+++++))+++++++))++))++++))+))++++++>(([!))>)++++++>-((++++++++++))[!((++..-------------------)>-(.))+([!)>-(+)[!)[!((>->->->->->->)++)[!(+++++++++++++++++++++++++++++)[!(++)[!(++++++++++++++)[!(+)[!(++)[!((>-).([!(([!
========================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================="===#=="======="================#=========================="========#="=====#==#=="="="="="="="=====#================================#=====#=================#====#=====#=="=====#===#
! < ! < ! < ! < ! < ! <
#===" #================" #========" #=====" #=====" #====="
! < ! <
#=======================================================================" #========================================"
! <
#================================================"
! <
#===================================================================="
! <
#==========================================================================="
! <
#==================================================================================="
! <
#=================================================================================================="
fuente