BrainFlow
BrainFlow là gì?
BrainFlow là một phần mở rộng của BrainF ** k (BFk) với 3 lệnh bổ sung để thêm chức năng và nhầm lẫn.
Lệnh nào?
Ngoài các lệnh BFk bình thường , chúng ta cũng có:
^ Nhảy tới ô # tùy thuộc vào giá trị trong ô. Ví dụ: Nếu chúng ta ở ô số 0 với giá trị là 4, ^ sẽ chuyển chúng ta đến ô số 4.
= Đặt giá trị tại ô thành chỉ mục của ô. Ví dụ: Nếu chúng tôi ở ô số 4 có giá trị 0, = sẽ đặt giá trị của chúng tôi thành 4.
& Sẽ đặt giá trị tại ô hiện tại bằng với giá trị tại ô dựa trên giá trị trong ô hiện tại của chúng tôi. .
Thử thách không bắt buộc
Hoàn thành bất kỳ điều nào sau đây sẽ áp dụng phần thưởng được chỉ định cho số byte của bạn.
Interpreter written in BrainFlow
(Có thể được giải thích bởi mẫu và chứa ít nhất một ý nghĩa ^ = hoặc &): Điểm / 3
Interpreter written in BrainF**k:
Điểm / 2
Doesn't contain any English letters (in either upper or lower case):
Điểm - 20
Doesn't contain any of the BrainFlow / BFk commands in the interpreter itself:
Điểm - 50
Thí dụ
Một trình thông dịch Java mẫu:
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;
}
}
Thậm chí không gần với golf nhưng nên cung cấp một điểm khởi đầu tốt.
Điểm số cuối cùng thấp nhất sẽ thắng, trong đó điểm là số byte trong chương trình của bạn sau khi đã giảm các Thử thách áp dụng.
Kiểm tra
Chương trình BrainFlow sau đây sẽ in đầu ra được chỉ định sau khi đọc char '+' từ 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
Đầu ra:
ðñðòñðòðôóòñóñôóðòõóñõðôôóòñööõôöðóöðõðùõñô÷ùõóñöóùñô÷øôøõôòöõóðòöóñ÷ðõôûôòú÷úø÷öùøöùñøðùúðûðþöûñùýøðòñ
subset
đến extension
. Cảm ơn vì bạn đã phản hồi.
++&
để lấy lại tuổi của mình hoặc+++&
lấy lại tháng tôi sinh ra. (Giả sử tất nhiên ô thứ 64 có giá trị mặc định là 0)