MarioLANG是一种二维编程语言,其源代码类似于超级Mario Bros.级别。此外,其指令集与Brainfuck的指令集非常相似。这意味着MarioLANG本质上是2D Brainfuck,指令指针像Mario一样移动。因此,当我为编程语言测验编写我的MarioLANG提交内容时,我首先将Brainfuck转换为“ Hello,World!”。程序到MarioLANG。我注意到,通过非常系统的过程可以做到这一点,因此让我们编写一个Brainfuck-to-MarioLANG编译器!
注意: MarioLANG规范并不是完全明确的,因此我假设是Ruby实现的解释。
我将通过以下Brainfuck程序来解释该过程:
++[>+++++[>+++++++>++++++++++>+++>+<<<<-]<-]>>++.>+.+++++++..+++.>+++.>.
它打印Hello!
并在尾随换行符。
分别将
<
和转换>
为(
和)
:++[)+++++[)+++++++)++++++++++)+++)+((((-](-]))++.)+.+++++++..+++.)+++.).
添加地板让Mario继续前进:
++[)+++++[)+++++++)++++++++++)+++)+((((-](-]))++.)+.+++++++..+++.)+++.). ========================================================================
现在的问题是MarioLANG没有像
[
和这样的循环]
。取而代之的是,我们必须使用电梯和指示性指令使Mario真正走成一圈。首先,我们将替换[
为>
并将地板更改为"
。我们还替换]
为[!
并将地板更改为=#
:++>)+++++>)+++++++)++++++++++)+++)+((((-[!(-[!))++.)+.+++++++..+++.)+++.). =="======"===============================#===#============================
该
"
和#
可以形成电梯(从开始#
,在结束"
),所以现在我们需要的是辅助地板马里奥走回来的。开始于!
和结束于<
:++>)+++++>)+++++++)++++++++++)+++)+((((-[!(-[!))++.)+.+++++++..+++.)+++.). =="======"===============================#===#============================ ! < #===============================" ! < #=========================================="
请注意,所有管线的长度必须至少与最大封闭回路的长度相同,因为解释器无法跨较短的管线连接电梯末端。因此,我们用空格填充中间线。
就是这样。我们有一个功能齐全的等效MarioLANG程序。
挑战
给定有效的Brainfuck程序,请执行上述过程以将其编译为MarioLANG程序。
您可以假设输入中仅包含命令字符,即除之外没有其他字符,.+-<>[]
。
所有辅助地板必须尽可能靠近主程序地板。您可以选择尽可能少地填充中间楼层的行(最大封闭循环的宽度),也可以填充到主程序的末尾。
您可以编写程序或函数,通过STDIN(或最接近的替代方案),命令行参数或函数自变量获取输入,并通过STDOUT(或最接近的替代方案),函数返回值或函数(out)参数输出结果。如果您不将结果打印到STDOUT,则它仍然应该是一个用换行符分隔的字符串。
这是代码高尔夫球,因此最短的答案(以字节为单位)获胜。
测试用例
测试用例的格式如下:第一行是Brainfuck程序(您的输入),然后有一个空行,直到下一个空行的所有内容都是MarioLANG中的预期输出。这些示例使用最少的填充空间。或者,您可以在每行之间填充空格,使其与输出的第一行的宽度相等。
>,++-.<
),++-.(
=======
,[.,]
,>.,[!
="===#
! <
#==="
>>[-]<<[->>+<<]
))>-[!((>-))+(([!
=="==#=="=======#
! < ! <
#==" #======="
++[>+++++[>+++++++>++++++++++>+++>+<<<<-]<-]>>++.>+.+++++++..+++.>+++.>.
++>)+++++>)+++++++)++++++++++)+++)+((((-[!(-[!))++.)+.+++++++..+++.)+++.).
=="======"===============================#===#============================
! <
#==============================="
! <
#=========================================="
[][[[][[]]][]][[]]
>[!>>>[!>>[![![!>[![!>>[![!
"=#"""=#""=#=#=#"=#=#""=#=#
! < ! < ! < ! < ! <
#=" #=" #=" #=" #="
! < ! <
#====" #===="
! <
#=========="
! <
#================"
>>+++++++>>++>>++++>>+++++++>>+>>++++>>+>>+++>>+>>+++++>>+>>++>>+>>++++++>>++>>++++>>+++++++>>+>>+++++>>++>>+>>+>>++++>>+++++++>>+>>+++++>>+>>+>>+>>++++>>+++++++>>+>>+++++>>++++++++++++++>>+>>+>>++++>>+++++++>>+>>+++++>>++>>+>>+>>++++>>+++++++>>+>>+++++>>+++++++++++++++++++++++++++++>>+>>+>>++++>>+++++++>>+>>+++++>>++>>+>>+>>+++++>>+>>++++++>>+>>++>>+>>++++++>>+>>++>>+>>++++++>>+>>++>>+>>++++++>>+>>++>>+>>++++++>>+>>++>>+>>++++++>>+>>++>>+>>++++++>>++>>++++>>+++++++>>+>>+++++>>+++++++>>+>>+++++>>+>>+>>+>>++++>>+>>++>>+>>++++++>>+>>+++++>>+++++++>>+>>++++>>+>>+>>++>>+++++>>+>>+++>>+>>++++>>+>>++>>+>>++++++>>+>>+++++>>+++++++++++++++++++>>++>>++>>+++>>++>>+>>++>>++++>>+++++++>>++>>+++++>>++++++++++>>+>>++>>++++>>+>>++>>+>>++++++>>++++++>>+>>+>>+++++>>+>>++++++>>++>>+++++>>+++++++>>++>>++++>>+>>++++++[<<]>>[>++++++[-<<++++++++++>>]<<++..------------------->[-<.>>+<]>[-<+>]>]<<[-[-[-[-[-[-[>++>]<+++++++++++++++++++++++++++++>]<++>]<++++++++++++++>]<+>]<++>]<<[->.<]<<]
))+++++++))++))++++))+++++++))+))++++))+))+++))+))+++++))+))++))+))++++++))++))++++))+++++++))+))+++++))++))+))+))++++))+++++++))+))+++++))+))+))+))++++))+++++++))+))+++++))++++++++++++++))+))+))++++))+++++++))+))+++++))++))+))+))++++))+++++++))+))+++++))+++++++++++++++++++++++++++++))+))+))++++))+++++++))+))+++++))++))+))+))+++++))+))++++++))+))++))+))++++++))+))++))+))++++++))+))++))+))++++++))+))++))+))++++++))+))++))+))++++++))+))++))+))++++++))++))++++))+++++++))+))+++++))+++++++))+))+++++))+))+))+))++++))+))++))+))++++++))+))+++++))+++++++))+))++++))+))+))++))+++++))+))+++))+))++++))+))++))+))++++++))+))+++++))+++++++++++++++++++))++))++))+++))++))+))++))++++))+++++++))++))+++++))++++++++++))+))++))++++))+))++))+))++++++))++++++))+))+))+++++))+))++++++))++))+++++))+++++++))++))++++))+))++++++>(([!))>)++++++>-((++++++++++))[!((++..-------------------)>-(.))+([!)>-(+)[!)[!((>->->->->->->)++)[!(+++++++++++++++++++++++++++++)[!(++)[!(++++++++++++++)[!(+)[!(++)[!((>-).([!(([!
========================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================="===#=="======="================#=========================="========#="=====#==#=="="="="="="="=====#================================#=====#=================#====#=====#=="=====#===#
! < ! < ! < ! < ! < ! <
#===" #================" #========" #=====" #=====" #====="
! < ! <
#=======================================================================" #========================================"
! <
#================================================"
! <
#===================================================================="
! <
#==========================================================================="
! <
#==================================================================================="
! <
#=================================================================================================="