BrainFlow解释器!


11

脑流

什么是BrainFlow?

BrainFlow是BrainF ** k(BFk)的扩展,具有3个其他命令,用于增加功能和混淆。

什么命令?

除了普通的BFk命令,我们还有:

^ 根据单元格中的值跳转到单元格#。例:如果我们在单元格0处,值为4,^将使我们跳到单元格4。

= 将单元格上的值设置为该单元格的索引。例如:如果我们在4号单元格中的值为0,则=将我们的值设置为4。

将根据当前单元格中的值将当前单元格中的值设置为等于该单元格中的值。(这很难说,所以这里有个例子!)例如:我们在单元格#33上,当前值在此单元格为7,并将当前在单元格#33上的值设置为单元格7中的任何值。

可选挑战

完成以下任何操作将对您的字节数应用指定的奖励。

Interpreter written in BrainFlow (可以由示例解释,并且至少包含一个有意义的 ^ = ): 得分/ 3

Interpreter written in BrainF**k: 分数/ 2

Doesn't contain any English letters (in either upper or lower case): 得分-20

Doesn't contain any of the BrainFlow / BFk commands in the interpreter itself: 得分-50

Java解释器示例:

import java.util.Scanner;

public class Interpreter {

    private String exp;

    private int[] values = new int[256];
    private int index = 0;

    private Scanner in;

    public Interpreter(String exp, Scanner in){
        this.exp = exp;
        this.in = in;
    }

    public void run(){
        //Reset index and values
        for(int i = 0; i < values.length; i++){
            values[i] = 0;
        }
        this.index = 0;

        System.out.println("Starting...");
        this.process(this.exp, false);
        System.out.println("\nDone.");
    }

    private void process(String str, boolean loop){
        boolean running = loop;
        do{
            for(int i = 0; i < str.length(); i++){
                switch(str.charAt(i)){
                case '>':increaseIndex();break;
                case '<':decreaseIndex();break;
                case '+':increaseValue();break;
                case '-':decreaseValue();break;
                case '[':
                    String s = str.substring(i);
                    int j = this.getClosingIndex(s);
                    if(this.values[this.index] == 0){
                        i +=j;
                        break;
                    }
                    process(s.substring(1, j), true);
                    i += j;
                    break;
                case '.':
                    int v = this.values[this.index];
                    System.out.print((char)v);
                    break;
                case ',':this.values[this.index] =  this.in.next().charAt(0);break;
                case '^':this.index = this.values[this.index];break;// Jumps to the index specified in the current cell.
                case '=':this.values[index] = this.index;break;// Sets the value at cell #x to x
                case '&':this.values[index] = this.values[this.values[index]];break;// If cell contains X, makes value of current cell equal to value in cell X
                default:
                    //Ignore others
                    break;
                }
            }
            if(this.values[this.index] == 0){
                running = false;
            }
        }while(running);
    }

    private void increaseIndex(){
        if(++this.index >= this.values.length){
            this.index = 0;
        }
    }

    private void decreaseIndex(){
        if(--this.index < 0){
            this.index = this.values.length - 1;
        }
    }

    private void increaseValue(){
        int newVal = this.values[this.index] + 1;
        if(newVal >= this.values.length){
            newVal = 0;
        }
        this.values[this.index] =  newVal;
    }

    private void decreaseValue(){
        int newVal = this.values[this.index] - 1;
        if(newVal < 0){
            newVal = this.values.length - 1;
        }
        this.values[this.index] =  newVal;
    }

    private int getClosingIndex(String str){
        int openings = 0;
        int closings = 0;
        for(int i = 0; i < str.length(); i++){
            char c = str.charAt(i);
            if(c == '['){
                openings++;
            }else if(c == ']'){
                closings++;
            }
            if(openings == closings){
                return i;
            }
        }
        return -1;
    }
}

甚至不打高尔夫球,但应该提供一个良好的起点。

最低的最终分数获胜,其中分数是考虑了适用的Challenge减少后程序中的字节数。

测试中

在从stdin读取'+'字符后,以下BrainFlow程序应打印指定的输出:

<<,++++[>++++[>++++<-]<-] Set cell #0 to a value dependent on input
>>>+[[-]&>=]+& Set every other cell to that value
[ Start loop
+^ Add one to current value and jump to that cell index
. Print the value at that cell
& Copy value from specified cell
] End loop

输出:

ðñðòñðòðôóòñóñôóðòõóñõðôôóòñööõôöðóöðõðùõñô÷ùõóñöóùñô÷øôøõôòöõóðòöóñ÷ðõôûôòú÷úø÷öùøöùñøðùúðûðþöûñùýøðòñ

请注意,&允许您本质上在下部单元格中创建变量,然后在以后引用它们。例如,如果我将年龄存储在第二个单元格中,并将我出生的月份存储在第三个单元格中,而我目前在第64个单元格中存储,则可以++&检索我的年龄或+++&检索我的出生月份。(假设当然,第64个单元格的默认值为0)
spocot

2
我认为您的意思是“超集”,而不是子集。
ɐɔıʇǝɥʇuʎs

@ɐɔıʇǝɥʇuʎs从更改subsetextension。感谢您的反馈。
spocot

用脑流书写的分数不是一个好主意-脑干是脑流的子集,因此任何脑干程序都是脑流程序。就像说一个C ++程序比C程序得分更高。好吧,我的C程序是C ++程序,等等....
pseudonym117

1
为什么用Brainfuck编写实现比用Brainflow编写实现的好处要小?由于前者较小,因此前者似乎更具挑战性。
彼得·奥尔森

Answers:


7

的Perl - 233 230 210 182 180 176 174 171字节

$/=$,;%d=qw(> $p++ < $p-- + $v[$p]++ - $v[$p]-- , $v[$p]=ord+getc . print+chr+$v[$p] [ while+$v[$p]{ ] } ^ $p=$v[$p] = $v[$p]=$p & $v[$p]=$v[$v[$p]]);eval$d{$_}for<>=~/./g

只需使用现有的我的BrainFuck解释器,将其打高尔夫球,然后添加BrainFlow函数即可。

更新:完全重组程序,以丢失28个字节。


注意,如果要给您输入300个“ +”的字符串,则最终将得到无效的值。在设置许多这些值之后/期间,您需要执行%256完整性检查。
user0721090601'9

我认为这不适用于循环([])。您不能为此一个一个地评估角色。
nutki 2014年

优点如何转换回括号?
nutki 2014年

6

让我们开始这场派对。

Ç - 408 384 393 390 380 357 352个字节(仍然小打小闹)

gcc在符合POSIX的系统上进行编译。第一个参数是包含要解释的Brainflow代码的文件的名称。添加了换行符以提高可读性。

i,p,b[9999],*k=b;unsigned char g[9999],a[30000],*d=a;main(c,v)char**v;
{read(open(v[1],0),g,9999);while(c=g[i++]){c-62||d++;c-60||d--;c-43||
(*d)++;c-45||(*d)--;c-46||putchar(*d);c==44?*d=getchar():0;c==94?d=a+*d:0;
c==61?*d=d-a:0;c==38?*d=a[*d]:0;c==93?i=*(--k):0;if(c==91)if(*d)*k++=i-1;else 
while(c=g[i++]){c==91?p++:0;if(c==93)if(p)p--;else break;}}}

还有非高尔夫版本,如果您有兴趣的话。如果您发现任何错误,请告诉我。

int i, depth, buffer[9999], *stack = buffer;
unsigned char c, program[9999], array[30000], *data = array;

main(int argc, char **argv)
{
    read(open(argv[1], 0), program, 9999);

    while(c = program[i++]){
        if (c=='>') data++;
        if (c=='<') data--;
        if (c=='+') (*data)++;
        if (c=='-') (*data)--;
        if (c=='.') putchar(*data);
        if (c==',') *data=getchar();
        if (c=='^') data=array+*data;
        if (c=='=') *data=data-array;
        if (c=='&') *data=array[*data];
        if (c==']') i=*(--stack);
        if (c=='[')
            if (*data) *stack++=i-1;
            else while (c=program[i++]) {
                    if (c=='[') depth++;
                    if (c==']') if (depth) depth--; else break;
            }
    }
}

更新:

  • 感谢您的初步反馈,这使我节省了24个字节。

  • 签名错误已修复。添加了另外9个字节。

  • 根据es1024的建议又节省了3个字节。

  • es1024的建议每多保存10个字节。

  • 只记得全局变量被初始化为0。从fread和fopen切换为read和open。保存了23个字节。

  • 不需要在程序上设置空终止符,因为缓冲区已经初始化为零。保存了5个字节。

2
我认为if()和; 可以用?:代替,并保存一些字符。
杰里·耶利米

2
可以将字符文字替换为其等效的ASCII以保存字符。
pseudonym117 2014年

1
@Orby似乎无法正确处理输入字符。它应该将它们转换为ascii表示形式并进行存储。除此之外,它还可以。
spocot

1
您可以替换main(int c,char**v){main(c,v)char**v;{并保存两个字节,也可以移至int i=0,p=0,b[9999],*k=b;该函数之外,并删除int 以保存四个字节。if (c==91)也有不必要的空间。
es1024

1
您也可以将大部分(如果不是全部)替换c==[number]?[action]:0;c-[number]||[action]。(c-[number]等于c != [number]if(p)p--;p&&p--;
es1024 2014年

6

苹果脚本 972670

尽管没有办法赢得胜利,但大多数人还是打高尔夫球。我不知道为什么我不考虑只像perl那样构造一个脚本(尽管它仍然不会赢得哈哈)。可以通过重新调整索引值的方式更好地解决这一问题,AppleScript令人沮丧地(对于这种类型的东西)是1索引语言。

只需将BrainFlow代码传递到e()。请注意,AppleScript的ASCII命令使用MacOSRoman编码,因此,尽管输出看起来会有所不同,但从其二进制表示来看是正确的。通过“,”命令传递任何高位ASCII字符时,您需要考虑到这一点。

on e(x)
set d to {"", "set b'sitem(i+1)to(b'sitem(i+1)+1)mod 256", "set b'sitem(i+1)to(b'sitem(i+1)+255)mod 256", "set i to(i+1)mod 256", "set i to(i+255)mod 256", "repeat while b'sitem(i+1)≠0", "end", "set o to o&(ASCII character b'sitem(i+1))", "display dialog \"\"default answer\"\"
set b'sitem(i+1)to ASCII number result'stext returned'stext1", "set i to b'sitem(i+1)", "set b'sitem(i+1)to i", "set b'sitem(i+1)to b'sitem(b'sitem(i+1)+1)"}
set s to "set i to 0
set b to{}
repeat 256
set b'send to 0
end
set o to  \"\"
"  
repeat with c in x'stext
set s to s&d'sitem((offset of c in "+-><[].,^=&")+1)&"
"
end
set s to s&"return o"
return run script s
end

(因为与用另一种会引起头疼的语言编写脑操/流解释器相比,与您的大脑有什么关系?

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.