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
เอาท์พุท:
ðñðòñðòðôóòñóñôóðòõóñõðôôóòñööõôöðóöðõðùõñô÷ùõóñöóùñô÷øôøõôòöõóðòöóñ÷ðõôûôòú÷úø÷öùøöùñøðùúðûðþöûñùýøðòñ
subset
extension
ขอบคุณสำหรับความคิดเห็น.
++&
เพื่อดึงอายุของฉันหรือ+++&
เรียกเดือนที่ฉันเกิดมา (สมมติว่า แน่นอนเซลล์ที่ 64 นั้นเป็นค่าเริ่มต้นที่ 0)