MarioLANG é uma linguagem de programação bidimensional em que o código fonte se assemelha a um nível de Super Mario Bros. Além disso, seu conjunto de instruções é muito semelhante ao de Brainfuck . Isso significa que MarioLANG é essencialmente um Brainfuck 2-D, onde o ponteiro de instruções se move como Mario. Então, quando escrevi minha submissão ao MarioLANG para o Quiz da linguagem de programação, comecei convertendo um Brainfuck "Olá, mundo!" programa para MarioLANG. Percebi que isso é possível com um processo muito sistemático, então vamos escrever um compilador Brainfuck-to-MarioLANG!
Nota: A especificação MarioLANG não é totalmente inequívoca, portanto, estou assumindo a interpretação da implementação do Ruby .
Vou explicar o processo com o seguinte programa Brainfuck:
++[>+++++[>+++++++>++++++++++>+++>+<<<<-]<-]>>++.>+.+++++++..+++.>+++.>.
Imprime Hello!
e uma nova linha à direita.
Converta
<
e>
para(
e)
, respectivamente:++[)+++++[)+++++++)++++++++++)+++)+((((-](-]))++.)+.+++++++..+++.)+++.).
Adicione um andar para Mario andar:
++[)+++++[)+++++++)++++++++++)+++)+((((-](-]))++.)+.+++++++..+++.)+++.). ========================================================================
Agora a questão é que o MarioLANG não possui loops como
[
e]
. Em vez disso, precisamos usar elevadores e instruções direcionais para fazer Mario realmente andar em círculos. Primeiro, substituímos[
por>
e alteramos o piso para"
. E nós também substituir]
com[!
e mudar o chão para=#
:++>)+++++>)+++++++)++++++++++)+++)+((((-[!(-[!))++.)+.+++++++..+++.)+++.). =="======"===============================#===#============================
Os
"
e#
podem formar elevadores (começando em#
, terminando em"
), então agora tudo o que precisamos são pisos auxiliares para Mario voltar. O começo!
e o fim com<
:++>)+++++>)+++++++)++++++++++)+++)+((((-[!(-[!))++.)+.+++++++..+++.)+++.). =="======"===============================#===#============================ ! < #===============================" ! < #=========================================="
Observe que todas as linhas devem ter pelo menos o maior loop de fechamento, porque o intérprete não pode conectar as extremidades do elevador através de linhas mais curtas. Portanto, preenchemos as linhas do meio com espaços.
E é isso. Temos um programa MarioLANG equivalente totalmente funcional.
O desafio
Dado um programa Brainfuck válido, implemente o procedimento acima para compilá-lo em um programa MarioLANG.
Você pode assumir que existem apenas caracteres de comando na entrada, ou seja, nenhum caractere, exceto ,.+-<>[]
.
Todo o piso auxiliar deve estar o mais próximo possível do piso principal do programa. Você pode optar por preencher as linhas dos pisos intermediários o mínimo possível (até a largura do maior loop fechado) ou até o final do programa principal.
Você pode escrever um programa ou função, recebendo entrada via STDIN (ou alternativa mais próxima), argumento da linha de comando ou argumento da função e emitindo o resultado via STDOUT (ou alternativa mais próxima), valor de retorno da função ou parâmetro da função (saída). Se você não imprimir o resultado em STDOUT, ainda deverá ser uma única sequência separada por nova linha.
Isso é código de golfe, então a resposta mais curta (em bytes) vence.
Casos de teste
Os casos de teste são formatados da seguinte forma: a primeira linha é o programa Brainfuck (sua entrada), então há uma linha vazia e tudo até a próxima linha vazia ser a saída esperada no MarioLANG. Esses exemplos usam a quantidade mínima de espaços preenchidos. Como alternativa, você pode preencher cada linha com espaços na largura da primeira linha da saída.
>,++-.<
),++-.(
=======
,[.,]
,>.,[!
="===#
! <
#==="
>>[-]<<[->>+<<]
))>-[!((>-))+(([!
=="==#=="=======#
! < ! <
#==" #======="
++[>+++++[>+++++++>++++++++++>+++>+<<<<-]<-]>>++.>+.+++++++..+++.>+++.>.
++>)+++++>)+++++++)++++++++++)+++)+((((-[!(-[!))++.)+.+++++++..+++.)+++.).
=="======"===============================#===#============================
! <
#==============================="
! <
#=========================================="
[][[[][[]]][]][[]]
>[!>>>[!>>[![![!>[![!>>[![!
"=#"""=#""=#=#=#"=#=#""=#=#
! < ! < ! < ! < ! <
#=" #=" #=" #=" #="
! < ! <
#====" #===="
! <
#=========="
! <
#================"
>>+++++++>>++>>++++>>+++++++>>+>>++++>>+>>+++>>+>>+++++>>+>>++>>+>>++++++>>++>>++++>>+++++++>>+>>+++++>>++>>+>>+>>++++>>+++++++>>+>>+++++>>+>>+>>+>>++++>>+++++++>>+>>+++++>>++++++++++++++>>+>>+>>++++>>+++++++>>+>>+++++>>++>>+>>+>>++++>>+++++++>>+>>+++++>>+++++++++++++++++++++++++++++>>+>>+>>++++>>+++++++>>+>>+++++>>++>>+>>+>>+++++>>+>>++++++>>+>>++>>+>>++++++>>+>>++>>+>>++++++>>+>>++>>+>>++++++>>+>>++>>+>>++++++>>+>>++>>+>>++++++>>+>>++>>+>>++++++>>++>>++++>>+++++++>>+>>+++++>>+++++++>>+>>+++++>>+>>+>>+>>++++>>+>>++>>+>>++++++>>+>>+++++>>+++++++>>+>>++++>>+>>+>>++>>+++++>>+>>+++>>+>>++++>>+>>++>>+>>++++++>>+>>+++++>>+++++++++++++++++++>>++>>++>>+++>>++>>+>>++>>++++>>+++++++>>++>>+++++>>++++++++++>>+>>++>>++++>>+>>++>>+>>++++++>>++++++>>+>>+>>+++++>>+>>++++++>>++>>+++++>>+++++++>>++>>++++>>+>>++++++[<<]>>[>++++++[-<<++++++++++>>]<<++..------------------->[-<.>>+<]>[-<+>]>]<<[-[-[-[-[-[-[>++>]<+++++++++++++++++++++++++++++>]<++>]<++++++++++++++>]<+>]<++>]<<[->.<]<<]
))+++++++))++))++++))+++++++))+))++++))+))+++))+))+++++))+))++))+))++++++))++))++++))+++++++))+))+++++))++))+))+))++++))+++++++))+))+++++))+))+))+))++++))+++++++))+))+++++))++++++++++++++))+))+))++++))+++++++))+))+++++))++))+))+))++++))+++++++))+))+++++))+++++++++++++++++++++++++++++))+))+))++++))+++++++))+))+++++))++))+))+))+++++))+))++++++))+))++))+))++++++))+))++))+))++++++))+))++))+))++++++))+))++))+))++++++))+))++))+))++++++))+))++))+))++++++))++))++++))+++++++))+))+++++))+++++++))+))+++++))+))+))+))++++))+))++))+))++++++))+))+++++))+++++++))+))++++))+))+))++))+++++))+))+++))+))++++))+))++))+))++++++))+))+++++))+++++++++++++++++++))++))++))+++))++))+))++))++++))+++++++))++))+++++))++++++++++))+))++))++++))+))++))+))++++++))++++++))+))+))+++++))+))++++++))++))+++++))+++++++))++))++++))+))++++++>(([!))>)++++++>-((++++++++++))[!((++..-------------------)>-(.))+([!)>-(+)[!)[!((>->->->->->->)++)[!(+++++++++++++++++++++++++++++)[!(++)[!(++++++++++++++)[!(+)[!(++)[!((>-).([!(([!
========================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================="===#=="======="================#=========================="========#="=====#==#=="="="="="="="=====#================================#=====#=================#====#=====#=="=====#===#
! < ! < ! < ! < ! < ! <
#===" #================" #========" #=====" #=====" #====="
! < ! <
#=======================================================================" #========================================"
! <
#================================================"
! <
#===================================================================="
! <
#==========================================================================="
! <
#==================================================================================="
! <
#=================================================================================================="
fonte