นักแปลระดมสมอง!


11

BrainFlow

BrainFlow คืออะไร

BrainFlow เป็นส่วนเสริมของ BrainF ** k (BFk) พร้อม 3 คำสั่งเพิ่มเติมสำหรับการใช้งานและความสับสนที่เพิ่มขึ้น

คำสั่งอะไร

นอกจากคำสั่ง BFkปกติแล้วเรายังมี:

^ ข้ามไปยังเซลล์ # ขึ้นอยู่กับค่าในเซลล์ เช่นถ้าเราอยู่ที่เซลล์ # 0 ด้วยค่า 4 ^ จะข้ามเราไปที่เซลล์ # 4

= ตั้งค่าที่เซลล์เป็นดัชนีของเซลล์ เช่นถ้าเราอยู่ที่เซลล์ # 4 ด้วยค่า 0, = จะตั้งค่าเป็น 4

& จะตั้งค่าที่เซลล์ปัจจุบันเท่ากับค่าที่เซลล์ตามค่าในเซลล์ปัจจุบันของเรา (นี่ยากที่จะพูดดังนั้นนี่เป็นตัวอย่าง!) Ex: เราอยู่ที่เซลล์ # 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 ต่อไปนี้ควรพิมพ์เอาต์พุตที่ระบุหลังจากอ่าน '+' char จาก 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
ฉันคิดว่าคุณหมายถึง 'superset' ไม่ใช่ส่วนย่อย
Augıʇǝɥʇuʎs

@ ɐɔıʇǝɥʇuʎsเปลี่ยนจากการsubset extensionขอบคุณสำหรับความคิดเห็น.
spocot

คะแนนสำหรับการเขียนใน brainflow เป็นความคิดที่ไม่ดี - brainfuck เป็นส่วนหนึ่งของ brainflow ดังนั้นโปรแกรม brainfuck ใด ๆ จึงเป็นโปรแกรม brainflow มันเหมือนกับว่าโปรแกรม c ++ จะได้คะแนนดีกว่าโปรแกรม C ตกลงโปรแกรม C ของฉันคือโปรแกรม C ++, soo ....
pseudonym117

1
ทำไมการเขียนการนำไปใช้ใน Brainfuck มีประโยชน์น้อยกว่าการเขียนหนึ่งใน Brainflow ดูเหมือนว่าอดีตจะมีความท้าทายมากกว่าเนื่องจากเป็นภาษาที่เล็กกว่า
Peter Olson

คำตอบ:


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 "+" s คุณจะต้องจบด้วยค่าที่ไม่ถูกต้อง คุณต้องทำการตรวจสอบสติ 256% หลังจาก / ในขณะที่ตั้งค่าเหล่านั้นจำนวนมาก
user0721090601

ฉันคิดว่านี่ใช้ไม่ได้กับลูป ( []) คุณไม่สามารถแยกแยะตัวละครทีละตัวสำหรับสิ่งนั้น
nutki

เครื่องหมายบวกจะถูกแปลกลับไปเป็นวงเล็บได้อย่างไร?
nutki

6

เริ่มปาร์ตี้กันเถอะ.

C - 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 ไบต์

  • บันทึกอีก 3 ไบต์ตามคำแนะนำของ es1024

  • บันทึกอีก 10 ไบต์ต่อข้อเสนอแนะเพิ่มเติมจาก es1024

  • เพิ่งจำได้ว่าตัวแปรทั่วโลกเริ่มต้นเป็น 0 เปลี่ยนจาก fread และ fopen เพื่ออ่านและเปิด บันทึก 23 ไบต์

  • ไม่จำเป็นต้องตั้งค่า null terminator ในโปรแกรมเนื่องจากบัฟเฟอร์ถูกเตรียมใช้งานเป็นศูนย์แล้ว บันทึก 5 ไบต์

2
ฉันคิดว่า if () และ; อาจถูกแทนที่ด้วย?: และบันทึกอักขระบางตัว
Jerry Jeremiah

2
ตัวอักษรตัวละครสามารถถูกแทนที่ด้วย ASCII เทียบเท่าเพื่อบันทึกตัวละคร
นามแฝง

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

6

AppleScript 972 670

ตีกอล์ฟส่วนใหญ่แม้ว่าจะไม่มีทางชนะ ฉันไม่รู้ว่าทำไมฉันไม่คิดเพียงสร้างสคริปต์เหมือนที่ perl ทำ (แม้ว่ามันจะยังไม่ชนะฮ่าฮ่า) นี่อาจเป็นเรื่องที่น่าสนใจมากขึ้นโดยการปรับใหม่ว่าดัชนีมีค่าอย่างไรดีขึ้น AppleScript น่าผิดหวัง (สำหรับเนื้อหาประเภทนี้) เป็นภาษาดัชนี 1

เพียงส่งรหัส BrainFlow ไปที่ e () โปรดทราบว่าคำสั่ง ASCII ของ AppleScript ใช้การเข้ารหัส 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

(เพราะสิ่งที่ f *** s ในสมองของคุณมากกว่าการเขียนล่าม brainfuck / flow ในภาษาอื่นที่ f *** s กับหัวของคุณมากเกินไป?

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.