给出了2个brainfuck代码片段A和B,输出与运行B相同行为的brainfuck代码C,并输入As结果。请注意,C必须适用于任何与以下假设相匹配的输入,就好像它是给A的一样。
你可以假设:
+-[]<>,.中的字符例如(EOF=0)
A = ,[..,]
B = ,[...,]
C = ,[......,]
A = >,[>,]<[.<]
B = ,[...,]
C = >>>>,[[-<+<+<+>>>]>>>,]<<<<[.<]
A = >,[>,]<[.<]
B = ,[...,]
C = >,[>,]<[...<]
A = ,.
B = ,.
C = ,>,[,]<.
A = ,.
B = ,.
C = ,.是有效的测试
每种语言中最短的代码获胜。Brainfuck的获奖者将被录取。
发布于 2018-07-20 10:00:49
-<+++++<+<+++++<-[+++++++[<++++++++>-]<--->>]<<--<--<+..<<<<,[[<+>>+<-]----[>-<-
---]>[+[++[++++++++++++++[++[[-]<]<<<[>-->>>-.>>>.<<<.>.>.<<.+>>--..>.<..<.>.>..
<++.<.>..>.<..<.>--.>>.<<.>.<..<.>.>.<.<.>++.<<.>.>.>.<.<.>..>.<..<.>>>.<<--.++<
<<]>>>>[<]<]>[<<<<[>]>[+>>>>>.>.<<<.>.<.>>>.<.[.<.>>>]<++[<<.<.>>.<<--.<<.>.>.++
>>>-]<<<<.>.>>.<.<<<.>>..>>.<<<.>--.>.<++...<<.>>--..>>.<.<..<.>.>>.<<++...>.<..
<.>>>.<<--...++<<[.>]<<<--.<<.>>++.<.>>>.<<--.++<<<]]<]>[<<<.>>]<]>[>>.>.<<<.>.>
>>.[<]]<]>[>>.>.<..<.>>>.[<]<<<+>->>]<<.[-]>,]格式化:
-<+++++<+<+++++<-[+++++++[<++++++++>-]<--->>]
<<--<--<+..<<<<
,
[
[<+> >+<-]
----[>-<----]>
[
not question mark
+
[
not greater than
++
[
not less than
++++++++++++++
[
not period
++
[
not comma
[-]<
]
<<<
[
comma B
>-->>> -.>>>.<<<.>.>.<<.+>>--..>.<..<.>.>..<++.<.>..>.<..<.>--.>>.<<
.>.<..<.>.>.<.<.>++.<<.>.>.>.<.<.>..>.<..<.>>>.<<--.++<<<
]
>>>>[<]<
]
>
[
period
<<<<
[
B
>
]
>
[
A
+>>> >>.>.<<<.>.<.>>>.<.[.<.>>>]<++[<<.<.>>.<<--.<<.>.>.++>>>-]<<<<.
>.>>.<.<<<.>>..>>.<<<.>--.>.<++...<<.>>--..>>.<.<..<.>.>>.<<++...>.<
..<.>>>.<<--...++<<[.>]<<<--.<<.>>++.<.>>>.<<--.++<<<
]
]
<
]
>
[
less than
<<<.>>
]
<
]
>
[
greater than
>>.>.<<<.>.>>>.[<]
]
<
]
>
[
question mark
>>.>.<..<.>>>.[<]
<<<+>->>
]
<<.[-]>,
]对于A,B和C: EOF = 0,开始时离开的单元格不允许,8位封装单元.
期望A,?,B。
(这个答案可以与brainfuck解释器兼容,该解释器不允许以一个字节为代价,通过音译y/<>/></并在>前面加上一个字节来左转。)
其基本思想是使用一系列的字符串替换来模拟A和B的磁带使用两个单元节点,特别注意替换A中的.和B中的,,从而使中间数据流保持在模拟磁带左侧的一个单元格中。字符串替换方案是:
>>>替换为>[-]+>,<替换为<<.替换为>[-]-[>>]+[[>+<-]<[>+<-]<]>+[->>+]<[>>>-<<+[<<]<+>>>[>>]+<<<-]>[+<->]+</>[>>]+>,替换为,[,]>,<<[<<]<[[>]>>[>>]<+<[<<]<[<]>-]>[>]>>[>>]+<*发布于 2018-07-19 10:31:30
++++++++++++++++[->+++>+++>++++>++++>++++++>++++++<<<<<<]>----->--->---->-->----->--->+<<<.....<<.>>....<<.>>.<<..>...>>>>[>+>,->[-]++++[-<-------->]+<[>>]>[<<-<-<<<..>.<.....>>.<<<.....>>.<<<<.>>..>>.<<<.>>>>.<<<...>>>.<<.<<<..>>>>.<<<..>>.....<<<..>>>>>.<<<<<.>>>>.<<<.>.....<<.>>>>>.<<<<.>>..>>>>>>>>]<<<-------------[>>]>[<<-<<<<..<<.>..>>.<<<.>.<<.>>>....<<<.>>>>.<<<.>.....<<.>>>>>.<<<<<.>>>>.<<<..>>.....<<<..>>>>>.<<<<..>..<<.>>>..<<<.>>>>.<<<.>.....<<.>>>>>.<<<<.>.<<..>>>>.<<<..>>.....<<<..>>>>>.<<<<..>..>>>.<<<.>>.<<<.>>.<<<.>>.>>>.<<....<<<.>>>>.<<<.>.....<<.>>>>>.<<<<<.>>>>.<<<..>>.....<<<..>>>>>.<<.....<<.>>>.<<<.>.....<<.>>>>>.<<<<.>.<<..>>>>.<<<..>>.....<<<..>>>>>.<<<<.>..>>>>>>>>>]<<<--------------[>>]>[<<-<<<<<...>>.<<<<.>>>>>.<<<<.>..>>>>>>>>>]<<<--[>>]>[<<-<<<<.......>.<<<<.>>>>>.<<<<.>..>>>>>>>>>]<<<<[+++++++[->++++++++<]>--.<]<]>>,[<+>>++++[-<--------->]+<+[>>]>[<<-<<<.<<<.>>>>.<<..<<.>>.>.<.....>>.<<<<<.>>>>.<<<.>.....<<.>>>>>.<<<<.>>...>.<<<.>...>>.<<.....>>>.<<....<<<.>>>>.<<<.>>.....<<<.>>>>>.<<<<.>..<<.>>>...>.<.....>>.<<<<<.>>>>.<<<.>.....<<.>>>>>.<<<<.>>...>>.<<..<<.>>>.<<.....>>>.<<....<<<.>>>>.<<<.>>.....<<<.>>>>>.<<<..>>>>>>>>>]<<<----------------[>>]>[<<-<<<<<.....>>>>>>>>>]<<<--[>>]>[<<-<<<<.....>>>>>>>>]<<<<[+++++++[->++++++++<]>--.<]>,]这就是了!构成两个brainfuck码的brainfuck码。用"!“若要分隔两个输入代码段,请执行以下操作。例如,代码片段A:>,[>,]<[.<],片段B:,[...,]。输入我的程序:>,[>,]<[.<]!,[...,]。如果没有,它就不会终止!被发现了。
这基本上与我的VBA版本相同。生成的代码与VBA版本中的代码相同(请注意,VBA post中的示例是在brainfuck代码段的最新更改之前生成的)。
这是我的源代码:
[
Tape: "+"(43) "-"(45) "<"(60) ">"(62) "["(91) "]"(93) readA(1) printInput(0) input else exitIf exitElse
]
++++ ++++ ++++ ++++ [->+++>+++>++++>++++>++++++>++++++<<<<<<]>----->--->---->-->----->--->+
<<<.....<<.>>....<<.>>.<<..>... print init routine
>>>>[ while readA
>+ set printInput = true
>, read character
->[-]++++[-<-------->] decrease input by 33 to check for "!"
+ set else flag
# A check for "!"
<[ if input not "!"
>> go to exitIf
]
>[ else
<<- set printInput = false
<- set readA = false
<<<..>.<.....>>.<<<.....>>.<<<< print routine between A and B
.>>..>>.<<<.>>>>.<<<...>>>.<<.<
<<..>>>>.<<<..>>.....<<<..>>>>>
.<<<<<.>>>>.<<<.>.....<<.>>>>>.
<<<<.>>..>>>
>>>>> go to exitElse
]
# A check for "dot"
<<<----- ----- --- decrease input by 13 (total 46) to check for dot
[ if input not dot
>> go to exitIf
]
>[ else
<<- set printInput = false
<<<<..<<.>..>>.<<<.>.<<.>>>.... print list storing routine
<<<.>>>>.<<<.>.....<<.>>>>>.<<<
<<.>>>>.<<<..>>.....<<<..>>>>>.
<<<<..>..<<.>>>..<<<.>>>>.<<<.>
.....<<.>>>>>.<<<<.>.<<..>>>>.<
<<..>>.....<<<..>>>>>.<<<<..>..
>>>.<<<.>>.<<<.>>.<<<.>>.>>>.<<
....<<<.>>>>.<<<.>.....<<.>>>>>
.<<<<<.>>>>.<<<..>>.....<<<..>>
>>>.<<.....<<.>>>.<<<.>.....<<.
>>>>>.<<<<.>.<<..>>>>.<<<..>>..
...<<<..>>>>>.<<<<.>..>>>>>
>>>> go to exitElse
]
# A check for "less than"
<<<----- ----- ---- decrease input by 14 (total 60) to check for "less than"
[ if input not "less than"
>> go to exitIf
]
>[ else
<<- set printInput = false
<<<<<...>>.<<<<.>>>>>.<<<<.>..>>>>> print A move left routine
>>>> go to exitElse
]
# A check for "greater than"
<<<-- decrease input by 2 (total 62) to check for "greater than"
[ if input not "greater than"
>> go to exitIf
]
>[ else
<<- set printInput = false
<<<<.......>.<<<<.>>>>>.<<<<.>..>>>>> print A move right routine
>>>> go to exitElse
]
# print remaining character
<<<<[ if printInput
+++++++[->++++++++<]>--.< print original character
]
< go to readA
]
>>, read next character
[ while input
<+ set printInput = true
# B check for comma
>>++++[-<----- ---->]+<+ decrement input by 44 to check for comma
[ if input not comma
>> go to exitIf
]
>[ else
<<- set printInput = false
<<<.<<<.>>>>.<<..<<.>>.>.<..... print B list reading routine
>>.<<<<<.>>>>.<<<.>.....<<.>>>>
>.<<<<.>>...>.<<<.>...>>.<<....
.>>>.<<....<<<.>>>>.<<<.>>.....
<<<.>>>>>.<<<<.>..<<.>>>...>.<.
....>>.<<<<<.>>>>.<<<.>.....<<.
>>>>>.<<<<.>>...>>.<<..<<.>>>.<
<.....>>>.<<....<<<.>>>>.<<<.>>
.....<<<.>>>>>.<<<..>>>>>
>>>> go to exitElse
]
# B check for "less than"
<<<----- ----- ----- - decrease input by 16 (total 60) to check for "less than"
[ if input not "less than"
>> go to exitIf
]
>[ else
<<- set printInput = false
<<<<<.....>>>>> print B move left routine
>>>> go to exitElse
]
# B check for "greater than"
<<<-- decrease input by 2 (total 62) to check for "greater than"
[ if input not "greater than"
>> go to exitIf
]
>[ else
<<- set printInput = false
<<<<.....>>>> print B move right routine
>>>> go to exitElse
]
# print remaining character
<<<<[ if printInput
+++++++[->++++++++<]>--.< print original character
]
>, input next character
]发布于 2018-07-19 17:29:13
s > >[-]+> g
s < << g
1s \. >[-]-R+[[>+<-]<[>+<-]<]>+[->>+]<[>+>>-<L+>R+<<<-]>[<+>-]+< g
1s .* R&<R+>
2s , ,[,]>,<L[[>]R<+L[<]>-]>[>]R+< g
s L <[<<]< g
s R >>[>>] g对于EOF = 0的香精,开始时留下的单元格不允许使用8位的包装单元.
期望程序A在第一行,B在第二行。
这使用两个单元节点来模拟A和B的磁带,A的输出占据最左边节点左边的相邻单元格。
备选173字节解决方案:
1i>>
s > >[-]+> g
s < << g
1s \. >[-]-[>>]+[[>+<-]<[>+<-]<]>+[->>+]<[>>>-<<+[<<]<+>>>[>>]+<<<-]>[<+>-]+< g
1a>[>>]+>
2s , ,[,]>,<<[<<]<[[>]>>[>>]<+<[<<]<[<]>-]>[>]>>[>>]+< g最初,我的设计基于一个双无限磁带,它需要更多的工作才能向左移动(当数据经过前面遇到的最左边的单元格时移动)和从A到B的转换(清除数据,而不只是经过前面遇到的最右边的单元格)。
感谢西尔维斯特和多里安的技巧和想法。
https://codegolf.stackexchange.com/questions/168710
复制相似问题