随机Brainfuck编译器


10

乔是您的普通BF开发人员。当他接到老板打来的电话时,他即将把代码更改检入到存储库中。“乔!新客户的机器坏了!动脑筋的解释器在程序执行之前将所有单元设置为随机值。没有时间修复它,您的代码将不得不处理它。” Joe对此考虑不多,当老板再次打断他时,他打算编写一个程序以将前一百万个单元格设置为零-“ ...而且不要考虑使用蛮力,代码必须尽可能地小。” 现在您必须帮助可怜的乔!

技术指标

  • 您将获得一些有效的Brainfuck代码作为输入
  • 然后,您的程序将修改代码,以便它可以在随机的Brainfuck解释器上运行
  • 这意味着在程序执行之前,可以将单元格设置为任何值。
  • 无论初始条件如何,新程序都应具有完全相同的行为。
  • 解释器的最大像元值为255(带有换行符)和无限长的磁带。

计分

您的分数是编译器大小(以字节为单位)加上测试用例大小总和的10倍。最低分显然是获胜的。为了减轻测试用例的优化,如果我有任何怀疑,我保留更改测试用例的权利,并且可能会在选择获胜者之前这样做。

测试用例

(我从esolangs页面和此网页获得了这些信息:http : //www.hevanet.com/cristofd/brainfuck/)。最后还要感谢@Sparr。

  • 你好,世界: ++++++++[>++++[>++>+++>+++>+<<<<-]>+>+>->>+[<]<-]>>.>---.+++++++..+++.>>.<-.<.+++.------.--------.>>+.>++.
  • 反向输入: >,[>,]<[.<]
  • 二的幂(无限流): >++++++++++>>+<+[[+++++[>++++++++<-]>.<++++++[>--------<-]+<<]>.>[->[ <++>-[<++>-[<++>-[<++>-[<-------->>[-]++<-[<++>-]]]]]]<[>+<-]+>>]<<]
  • 10000以下的方块: ++++[>+++++<-]>[<+++++>-]+<+[>[>+>+<<-]++>>[<<+>>-]>>>[-]++>[-]+>>>+[[-]++++++>>>]<<<[[<++++++++<++>>-]+<.<[>----<-]<]<<[>>>>>[>>>[-]+++++++++<[>-<-]+++++++++>[-[<->-]+[<<<]]<[>+<-]>]<<-]<<-]
  • 斐波那契流: >++++++++++>+>+[[+++++[>++++++++<-]>.<++++++[>--------<-]+<<<]>.>>[[-]<[>+<-]>>[<<+>+>-]<[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>[-]>+>+<<<-[>+<-]]]]]]]]]]]+>>>]<<<]
  • 输入之前的ASCII序列:(,[.[>+<-]>-]这需要根据输入改变单元格编号)

评论不作进一步讨论;此对话已转移至聊天
马丁·恩德

Answers:


8

sed,46字节编译器

s/</<</g
s/>/>[->[-]>[-]+<<]>/g
s/^/[-]>[-]+</

在编写程序之前,我没有注意到输出也应该是高尔夫球,所以我将使用简短的编译器。另外,要测试的工作量太大,因此请通知它是否无法正常运行:)


1
我糊涂了。您的第三行替换空字符串?sed中的空字符串匹配什么?“ sed:第一个RE可能不会为空”
Sparr 2015年

@Sparr好吧,尝试用插入号代替。
feersum 2015年

3
好的,让我们看看是否遵循...将单元格0设置为零,将单元格1设置为1。将所有<替换为<<,并将>替换为> X>。现在,无论何时原始程序访问单元n,新程序访问单元2n,即偶数单元。X将经过的奇数单元格置零,如果不为零,则将下一个单元格(偶数单元格)置零,并将下一个奇数单元格设置为1。我有这个权利吗?
Sparr 2015年

2
您知道,如果要使用简短的编译器,则Retina中只有35个字节。;)
Martin Ender 2015年

1
@MartinBüttner无耻的插件!:P
Optimizer

2

C ++

编译器大小:630字节(感谢Zacharý-10字节)
Hello World编译结果大小:139
平方以下10000:319

编译器:

#include<string>
#include<map>
#include<stack>
#define B break
#define C case
#define S 30000
#define R m[(p<0)?(p%S)+S:p]
using s=std::string;using P=std::pair<int,int>;s a(s c){char m[S];memset(m,0,S);int p=0,i=0;P r{0,0};std::map<int,int>j;std::stack<int>t;for(int d=0;d<c.size();++d){if(c[d]==91)t.push(d);if(c[d]==93){j[d]=t.top();j[t.top()]=d;t.pop();}}while(i<c.size()){switch(c[i]){C'>':++p;B;C'<':--p;B;C'+':++R;B;C'-':--R;B;C'[':if(!R)i=j[i];B;C']':i=j[i]-1;B;default:B;}++i;r.first=p<r.first?p:r.first;r.second=p>r.second?p:r.second;}s n;for(int i=r.first;i<r.second;++i){n+="[-]>";}n+="[-]"+s(r.second,60)+c;return n;}

随机脑袋翻译:

void interpret(const std::string& code) {
    char memory[30000];
    for (int i = 0; i < 30000; ++i)
        memory[i] = std::rand()%256;
    int memPtr = 0, insPtr = 0;
    std::map<int, int> jump_map;

    {
        std::stack<int> jstack;
        for (int i = 0; i < code.size(); ++i) {
            if (code[i] == '[')
                jstack.push(i);
            if (code[i] == ']') {
                jump_map[i] = jstack.top();
                jump_map[jstack.top()] = i;
                jstack.pop();
            }
        }
    }
    while (insPtr < code.size()) {
        switch (code[insPtr]) {
        case '>': ++memPtr; break;
        case '<': --memPtr; break;
        case '+': ++memory[memPtr]; break;
        case '-': --memory[memPtr]; break;
        case '.': std::cout << memory[memPtr]; break;
        case ',': std::cin >> memory[memPtr]; break;
        case ']': if (memory[memPtr] != 0) insPtr = jump_map[insPtr]; break;
        case '[': if (memory[memPtr] == 0) insPtr = jump_map[insPtr]; break;
        default:break;
        }
        ++insPtr;
    }
}

一些注意事项:

  • 编译器将执行程序以确定所使用的存储单元。如果您的程序是无限循环,则编译器将无限循环。

您可以通过更改piito 的名称P,更改Rto 的定义m[p<0?p%30000+30000:p]以及相应地修改对它们的所有调用/引用来降低得分。另外,他修改了测试用例。我没有检查过,但是30000由于您经常使用它,它可能会节省一些字节来定义要成为的东西。
扎卡里

1
会改变Rm[p<0?p%S+S:p]工作?
扎卡里

删除定义中的括号R应节省几个字节。
扎卡里

1

rs,33个字节,得分:2659

通常只是sed答案的简单移植。

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

1
您昨天之前发布了这种语言吗?提早创建问题的语言不适用于提交答案。
Sparr 2015年

@Sparr好吧,我知道了,但是后来我破坏了我的Git提交历史,不得不重新创建了
仓库
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.