BrainFlow
BrainFlow nedir?
BrainFlow, ilave işlevsellik ve karışıklık için 3 ek komutla BrainF ** k (BFk) 'nin bir uzantısıdır.
Ne komutları?
Normal BFk komutlarına ek olarak :
^ Hücredeki değere bağlı olarak # hücresine atlar. Örn: 0 hücresindeyken 4 değeri varsa, ^ bizi 4 numaralı hücreye atlar.
= Hücredeki değeri hücrenin dizinine ayarlar. Örn: 4 numaralı hücrede 0 değeri varsa, = değerimizi 4 olarak ayarlar.
& Geçerli hücredeki değeri, geçerli hücremizdeki değere bağlı olarak hücredeki değere eşit olarak ayarlar. (Bu söz etmek zor, işte bir örnek!) Örn: 33 numaralı hücredeyiz ve bu hücredeki şu anki değerimiz 7'dir ve # 33 hücresindeki şu anki değerimizi # 7 hücresindeki herhangi bir değere ayarlayacaktır.
İsteğe Bağlı Zorluklar
Aşağıdakilerden herhangi birini gerçekleştirdiğinizde, belirtilen bonus bayt sayınıza uygulanır.
Interpreter written in BrainFlow
(Örnek tarafından yorumlanabilir ve en az bir anlamlı ^ = veya &): Puan / 3
Interpreter written in BrainF**k:
Puan / 2
Doesn't contain any English letters (in either upper or lower case):
Puan - 20
Doesn't contain any of the BrainFlow / BFk commands in the interpreter itself:
Puan - 50
Misal
Örnek bir Java yorumlayıcısı:
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;
}
}
Hatta golf yakın değil ama iyi bir başlangıç noktası sağlamalıdır.
Geçerli Challenge indirimleri dikkate alındıktan sonra puanın programınızdaki bayt sayısı olduğu en düşük final puanı kazanır.
Test yapmak
Aşağıdaki BrainFlow programı stdin'den bir '+' karakterini okuduktan sonra belirtilen çıktıyı yazdırmalıdır:
<<,++++[>++++[>++++<-]<-] 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
Çıktı:
ðñðòñðòðôóòñóñôóðòõóñõðôôóòñööõôöðóöðõðùõñô÷ùõóñöóùñô÷øôøõôòöõóðòöóñ÷ðõôûôòú÷úø÷öùøöùñøðùúðûðþöûñùýøðòñ
subset
için extension
. Geri dönüşünüz için teşekkür ederiz.
++&
almak veya+++&
doğduğum ayı almak için yapabilirim. tabii ki 64. hücre varsayılan değer 0'dır