BrainFlow
Was ist BrainFlow?
BrainFlow ist eine Erweiterung von BrainF ** k (BFk) mit 3 zusätzlichen Befehlen für zusätzliche Funktionalität und Verwirrung.
Welche Befehle?
Zusätzlich zu den normalen BFk-Befehlen haben wir auch:
^ Springt abhängig vom Wert in der Zelle zur Zelle #. Beispiel: Wenn wir uns in Zelle 0 mit einem Wert von 4 befinden, springt uns ^ zu Zelle 4.
= Setzt den Wert in der Zelle auf den Index der Zelle. Beispiel: Wenn wir uns in Zelle 4 mit dem Wert 0 befinden, setzt = unseren Wert auf 4.
& Setzt den Wert in der aktuellen Zelle gleich dem Wert in der Zelle basierend auf dem Wert in unserer aktuellen Zelle. (Dies ist schwer zu sagen, daher hier ein Beispiel!) Beispiel: Wir befinden uns in Zelle Nr. 33 und unser aktueller Wert in dieser Zelle ist 7 und setzen unseren aktuellen Wert in Zelle Nr. 33 auf den Wert in Zelle Nr. 7.
Optionale Herausforderungen
Wenn Sie eine der folgenden Aufgaben ausführen, wird der angegebene Bonus auf Ihre Byteanzahl angewendet.
Interpreter written in BrainFlow (Kann von der Stichprobe interpretiert werden und enthält mindestens ein aussagekräftiges ^ = oder &): Punktzahl / 3
Interpreter written in BrainF**k: Punktzahl / 2
Doesn't contain any English letters (in either upper or lower case): Punktzahl - 20
Doesn't contain any of the BrainFlow / BFk commands in the interpreter itself: Punktzahl - 50
Beispiel
Ein Beispiel für einen Java-Interpreter:
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;
}
}
Nicht einmal in der Nähe von Golf, sollte aber einen guten Ausgangspunkt bieten.
Die niedrigste Endpunktzahl gewinnt, wobei die Punktzahl die Anzahl der Bytes in Ihrem Programm ist, nachdem die entsprechenden Herausforderungsreduzierungen berücksichtigt wurden.
Testen
Das folgende BrainFlow-Programm sollte die angegebene Ausgabe drucken, nachdem ein '+' - Zeichen von stdin gelesen wurde:
<<,++++[>++++[>++++<-]<-] 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
Ausgabe:
ðñðòñðòðôóòñóñôóðòõóñõðôôóòñööõôöðóöðõðùõñô÷ùõóñöóùñô÷øôøõôòöõóðòöóñ÷ðõôûôòú÷úø÷öùøöùñøðùúðûðþöûñùýøðòñ
subsetzu extension. Danke für die Rückmeldung.
++&mein Alter+++&abrufen oder den Monat abrufen, in dem ich geboren wurde Natürlich hat die 64. Zelle den Standardwert 0)