BrainFlow 통역사!


11

BrainFlow

BrainFlow 란 무엇입니까?

BrainFlow는 BrainF ** k (BFk)의 확장 기능으로 추가 기능 및 혼동을위한 3 개의 추가 명령이 있습니다.

어떤 명령?

일반적인 BFk 명령 외에도 다음과 같은 기능 이 있습니다.

^ 셀의 값에 따라 셀 #으로 이동합니다. 예 : 값이 4 인 셀 # 0에 있으면 ^는 셀 # 4로 이동합니다.

= 셀의 값을 셀의 인덱스로 설정합니다. 예 : 값이 0 인 셀 # 4에 있으면 =는 값을 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;
    }
}

골프에 가깝지 않지만 좋은 출발점을 제공해야합니다.

적용 가능한 챌린지 감소가 고려 된 후 프로그램의 점수가 바이트 수인 최저 최종 점수가 승리합니다.

테스팅

다음 BrainFlow 프로그램은 stdin에서 '+'문자를 읽은 후 지정된 출력을 인쇄해야합니다.

<<,++++[>++++[>++++<-]<-] 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

산출:

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

&를 사용하면 기본적으로 하위 셀에 변수를 만든 다음 나중에 참조 할 수 있습니다. 예를 들어, 나이를 2 번째 셀에 저장하고 3 번째 셀에서 태어난 달을 현재 64 번째 셀에있는 경우 ++&나이 +++&를 검색 하거나 내가 태어난 달을 검색 할 수 있습니다 . 물론 64 번째 셀의 기본값은 0입니다)
spocot

2
나는 당신이 서브셋이 아니라 '슈퍼 셋'을 의미한다고 생각합니다.
ɐɔıʇǝɥʇuʎs

@ ɐɔıʇǝɥʇuʎs에서 subset로 변경 되었습니다 extension. 조언 감사합니다.
spocot

brainflow로 작성된 점수는 나쁜 생각입니다. brainfuck은 brainflow의 하위 집합이므로 모든 brainfuck 프로그램은 brainflow 프로그램입니다. C ++ 프로그램이 C 프로그램보다 점수가 높다고 말하는 것과 같습니다. 좋아, 내 C 프로그램은 C ++ 프로그램이다. soo ....
pseudonym117

1
Brainfuck에서 구현을 작성하는 것이 Brainflow에서 구현을 작성하는 것보다 더 작은 이점이있는 이유는 무엇입니까? 언어가 더 작기 때문에 전자가 더 어려울 것 같습니다.
피터 올슨

답변:


7

펄 - 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 "+"의 문자열이 제공되면 유효하지 않은 값으로 끝납니다. 이러한 값 중 많은 값을 설정 한 후에 / %% 온 전성 검사를 수행해야합니다.
user0721090601

루프 ( []) 에서는 작동하지 않는다고 생각합니다 . 이를 위해 문자별로 평가할 수 없습니다.
nutki December

플러스는 어떻게 괄호로 다시 변환됩니까?
nutki December

6

이 파티를 시작합시다.

C - 408 384 393 390 380 357 352 바이트 (정지 거리 치핑)

gccPOSIX 호환 시스템에서 컴파일하십시오 . 첫 번째 인수는 해석 할 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;}}}

그리고 관심이 없다면 ungolfed 버전입니다. 버그가 있으면 알려주세요.

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에서 읽기 및 열기로 전환되었습니다. 23 바이트를 절약했습니다.

  • 버퍼가 이미 0으로 초기화되었으므로 프로그램에서 null 종료자를 설정할 필요가 없습니다. 5 바이트를 절약했습니다.

2
나는 if ()과; ? :로 대체하고 일부 문자를 저장할 수 있습니다.
Jerry Jeremiah

2
문자 리터럴은 ASCII 문자로 대체되어 문자를 저장할 수 있습니다.
pseudonym117

1
@Orby 입력 문자를 올바르게 처리하지 않는 것 같습니다. 그것들을 아스키 표현으로 변환하여 저장해야합니다. 그 외에는 작동합니다.
spocot

1
당신은 대체 할 수 main(int c,char**v){와 함께 main(c,v)char**v;{두 개의 바이트뿐만 아니라 이동 저장 int i=0,p=0,b[9999],*k=b;기능을 외부로하고, 드롭 int 4 바이트를 저장합니다. if (c==91)불필요한 공간도 있습니다.
es1024

1
당신은 또한하지 않을 경우 모든의 대부분을 대체 할 수 c==[number]?[action]:0;c-[number]||[action]. ( c-[number]에 해당 c != [number]if(p)p--;p&&p--;
es1024

6

AppleScript로 972 (670)

이길 수있는 방법은 없지만 대부분 골프를 쳤다. 왜 내가 Perl과 같은 스크립트를 작성하는 것에 대해 생각하지 않았는지 모르겠습니다 (여전히 하하를 얻지 못합니다). 이것은 인덱스 값이 조금 더 나은 방법으로 재조정하여 더 많은 골치가 될 수 있습니다.

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

(머리가 너무 많은 다른 언어로 brainfuck / flow 인터프리터를 작성하는 것보다 뇌에서 무엇을 좋아합니까?

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.