BrainFlow
¿Qué es BrainFlow?
BrainFlow es una extensión de BrainF ** k (BFk) con 3 comandos adicionales para mayor funcionalidad y confusión.
Que comandos
Además de los comandos BFk normales , también tenemos:
^ Salta a la celda # dependiendo del valor en la celda. Ej: Si estamos en la celda # 0 con un valor de 4, ^ nos llevará a la celda # 4.
= Establece el valor en la celda al índice de la celda. Ej: Si estamos en la celda # 4 con un valor de 0, = establecerá nuestro valor en 4.
& Establecerá el valor en la celda actual igual al valor en la celda basado en el valor en nuestra celda actual. (¡Es difícil de decir, así que aquí hay un ejemplo!) Ej: Estamos en la celda # 33 y nuestro valor actual en esta celda es 7, y estableceremos nuestro valor actual en la celda # 33 a cualquier valor que esté en la celda # 7.
Desafíos opcionales
Lograr cualquiera de los siguientes aplicará la bonificación especificada a su conteo de bytes.
Interpreter written in BrainFlow
(Puede ser interpretada por la muestra y contiene al menos un ^ = o & significativo): Puntuación / 3
Interpreter written in BrainF**k:
Puntuación / 2
Doesn't contain any English letters (in either upper or lower case):
Puntuación - 20
Doesn't contain any of the BrainFlow / BFk commands in the interpreter itself:
Puntuación - 50
Ejemplo
Un ejemplo de intérprete de 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;
}
}
Ni siquiera cerca del campo de golf, pero debería proporcionar un buen punto de partida.
El puntaje final más bajo gana, donde el puntaje es el número de bytes en su programa después de que se hayan tenido en cuenta las reducciones de desafío aplicables.
Pruebas
El siguiente programa BrainFlow debería imprimir la salida especificada después de leer un '+' char de 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
Salida:
ðñðòñðòðôóòñóñôóðòõóñõðôôóòñööõôöðóöðõðùõñô÷ùõóñöóùñô÷øôøõôòöõóðòöóñ÷ðõôûôòú÷úø÷öùøöùñøðùúðûðþöûñùýøðòñ
subset
a extension
. Gracias por la respuesta.
++&
para recuperar mi edad o+++&
el mes en que nací. (Suponiendo por supuesto, la celda 64 está en el valor predeterminado de 0)