BrainFlow
Qu'est-ce que BrainFlow?
BrainFlow est une extension de BrainF ** k (BFk) avec 3 commandes supplémentaires pour plus de fonctionnalité et de confusion.
Quelles commandes?
En plus des commandes BFk normales , nous avons également:
^ Passe à la cellule # en fonction de la valeur de la cellule. Ex: Si nous sommes à la cellule # 0 avec une valeur de 4, ^ nous sautera à la cellule # 4.
= Définit la valeur de la cellule à l'index de la cellule. Ex: Si nous sommes à la cellule # 4 avec une valeur de 0, = définira notre valeur à 4.
& Fixera la valeur de la cellule actuelle à la valeur de la cellule en fonction de la valeur de notre cellule actuelle. (Celui-ci est difficile à dire, alors voici un exemple!) Ex: Nous sommes à la cellule # 33 et notre valeur actuelle dans cette cellule est 7, et définirons notre valeur actuelle à la cellule # 33 à la valeur de la cellule # 7.
Défis facultatifs
Si vous effectuez l'une des opérations suivantes, le bonus spécifié sera appliqué à votre nombre d'octets.
Interpreter written in BrainFlow
(Peut être interprété par l'échantillon et contient au moins un ^ = ou & significatif): Score / 3
Interpreter written in BrainF**k:
Score / 2
Doesn't contain any English letters (in either upper or lower case):
Score - 20
Doesn't contain any of the BrainFlow / BFk commands in the interpreter itself:
Score - 50
Exemple
Un exemple d'interpréteur 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;
}
}
Pas même près du golf mais devrait fournir un bon point de départ.
Le score final le plus bas gagne, où le score est le nombre d'octets dans votre programme après que les réductions de défi applicables ont été prises en compte.
Essai
Le programme BrainFlow suivant devrait imprimer la sortie spécifiée après avoir lu un caractère '+' depuis 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
Production:
ðñðòñðòðôóòñóñôóðòõóñõðôôóòñööõôöðóöðõðùõñô÷ùõóñöóùñô÷øôøõôòöõóðòöóñ÷ðõôûôòú÷úø÷öùøöùñøðùúðûðþöûñùýøðòñ
subset
à extension
. Merci pour les commentaires.
++&
pour récupérer mon âge ou+++&
pour récupérer le mois de ma naissance. (En supposant bien sûr, la 64e cellule est à la valeur par défaut de 0)