首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >随机Brainfuck编译器

随机Brainfuck编译器
EN

Code Golf用户
提问于 2015-04-24 22:11:34
回答 3查看 818关注 0票数 11

乔是你的普通BF开发人员。当他接到老板的电话时,他正准备在他们的存储库中签入代码更改。“乔!新客户端的机器坏了!brainfuck解释器在程序执行前将所有单元格设置为随机值。没有时间修复它,您的代码将不得不处理它。”乔并不怎么想,他正准备编写一个程序,把第一个100万个细胞设置为零,这时他的老板又打断了他的话--“.不要考虑使用暴力,代码必须尽可能小。”现在你必须帮助可怜的乔!

Specifications

  • 您将得到一些有效的brainfuck代码作为输入。
  • 然后,您的程序将修改代码,以便它能够在随机的brainfuck解释器上工作。
  • 这意味着在执行程序之前,可以将单元格设置为任意值。
  • 无论初始条件如何,新程序都应该有完全相同的行为。
  • 解释器的最大单元格值为255,加上包装,还有一个无限长的磁带.

评分

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

测试用例

(我从艾索朗格网页和这个网页:http://www.hevanet.com/cristofd/brainfuck/获得了这些信息。)还感谢@Sparr提供最后一个测试用例。

  • 你好世界:++++++++[>++++[>++>+++>+++>+<<<<-]>+>+>->>+[<]<-]>>.>---.+++++++..+++.>>.<-.<.+++.------.--------.>>+.>++.
  • 反向输入:>,[>,]<[.<]
  • 二次幂(无限流):>++++++++++>>+<+[[+++++[>++++++++<-]>.<++++++[>--------<-]+<<]>.>[->[ <++>-[<++>-[<++>-[<++>-[<-------->>[-]++<-[<++>-]]]]]]<[>+<-]+>>]<<]
  • 10000正方形:++++[>+++++<-]>[<+++++>-]+<+[>[>+>+<<-]++>>[<<+>>-]>>>[-]++>[-]+>>>+[[-]++++++>>>]<<<[[<++++++++<++>>-]+<.<[>----<-]<]<<[>>>>>[>>>[-]+++++++++<[>-<-]+++++++++>[-[<->-]+[<<<]]<[>+<-]>]<<-]<<-]
  • Fibonacci流:>++++++++++>+>+[[+++++[>++++++++<-]>.<++++++[>--------<-]+<<<]>.>>[[-]<[>+<-]>>[<<+>+>-]<[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>[-]>+>+<<<-[>+<-]]]]]]]]]]]+>>>]<<<]
  • 直到输入的ASCII序列:,[.[>+<-]>-] (这个序列需要根据输入改变单元号)
EN

回答 3

Code Golf用户

发布于 2015-04-24 23:00:56

sed,46字节编译器

代码语言:javascript
复制
s/</<</g
s/>/>[->[-]>[-]+<<]>/g
s/^/[-]>[-]+</

直到编写完程序之后,我才注意到输出也应该是高尔夫球,所以我会选择简短的编译器。而且它的测试工作量太大了,所以如果它不能正常工作,请通知:)

票数 8
EN

Code Golf用户

发布于 2017-11-08 17:47:21

C++

编译器大小: 630字节( -10字节,多亏了Zachar)

Hello编译结果大小: 139

10000 : 319正方形

编译器:

代码语言:javascript
复制
#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;}

随机脑功能解说员:

代码语言:javascript
复制
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;
    }
}

一些注意事项:

  • 编译器将执行该程序以确定所使用的内存单元格。如果您的程序是一个无限循环,编译器将无限循环。
票数 2
EN

Code Golf用户

发布于 2015-04-27 00:46:04

rs,33字节,得分: 2659

大多数情况下,sed的答案只是一个简单的端口。

代码语言:javascript
复制
</<<
>/>[->[-]>[-]+<<]>
[-]>[-]+<
票数 1
EN
页面原文内容由Code Golf提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codegolf.stackexchange.com/questions/49185

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档