BrainFlow
Che cos'è BrainFlow?
BrainFlow è un'estensione di BrainF ** k (BFk) con 3 comandi aggiuntivi per maggiore funzionalità e confusione.
Quali comandi?
Oltre ai normali comandi BFk , abbiamo anche:
^ Passa alla cella # in base al valore nella cella. Es .: Se siamo nella cella # 0 con un valore di 4, ^ ci salterà alla cella # 4.
= Imposta il valore nella cella sull'indice della cella. Esempio: se siamo nella cella n. 4 con un valore pari a 0, = imposterà il nostro valore su 4.
& Imposta il valore nella cella corrente uguale al valore nella cella in base al valore nella nostra cella corrente. (Questo è difficile da pronunciare, quindi ecco un esempio!) Es: Siamo nella cella # 33 e il nostro valore corrente in questa cella è 7, e imposteremo il nostro valore corrente nella cella # 33 su qualunque valore sia nella cella # 7.
Sfide opzionali
Compiere uno dei seguenti applica il bonus specificato al conteggio dei byte.
Interpreter written in BrainFlow
(Può essere interpretato dal campione e contiene almeno un significativo ^ = o &): Punteggio / 3
Interpreter written in BrainF**k:
Punteggio / 2
Doesn't contain any English letters (in either upper or lower case):
Punteggio - 20
Doesn't contain any of the BrainFlow / BFk commands in the interpreter itself:
Punteggio - 50
Esempio
Un esempio di interprete 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;
}
}
Nemmeno vicino al golf, ma dovrebbe fornire un buon punto di partenza.
Il punteggio finale più basso vince, dove il punteggio è il numero di byte nel programma dopo che sono state prese in considerazione le riduzioni della Sfida applicabili.
analisi
Il seguente programma BrainFlow dovrebbe stampare l'output specificato dopo aver letto un carattere '+' da 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
Produzione:
ðñðòñðòðôóòñóñôóðòõóñõðôôóòñööõôöðóöðõðùõñô÷ùõóñöóùñô÷øôøõôòöõóðòöóñ÷ðõôûôòú÷úø÷öùøöùñøðùúðûðþöûñùýøðòñ
subset
a extension
. Grazie per il feedback.
++&
per recuperare la mia età o+++&
per recuperare il mese in cui sono nato. (Supponendo ovviamente la 64a cella ha il valore predefinito di 0)