BrainFlow
BrainFlow 란 무엇입니까?
BrainFlow는 BrainF ** k (BFk)의 확장 기능으로 추가 기능 및 혼동을위한 3 개의 추가 명령이 있습니다.
어떤 명령?
일반적인 BFk 명령 외에도 다음과 같은 기능 이 있습니다.
^ 셀의 값에 따라 셀 #으로 이동합니다. 예 : 값이 4 인 셀 # 0에 있으면 ^는 셀 # 4로 이동합니다.
= 셀의 값을 셀의 인덱스로 설정합니다. 예 : 값이 0 인 셀 # 4에 있으면 =는 값을 4로 설정합니다.
& 현재 셀의 값을 현재 셀의 값을 기준으로 셀의 값과 동일하게 설정합니다. 예 : 우리는 셀 # 33에 있고이 셀의 현재 값은 7이며 셀 # 33의 현재 값을 셀 # 7에있는 값으로 설정합니다.
선택적 도전
다음 중 하나를 수행하면 지정된 보너스가 바이트 수에 적용됩니다.
Interpreter written in BrainFlow
(샘플로 해석 할 수 있으며 의미있는 ^ = 또는 &) : 3 점
Interpreter written in BrainF**k:
점수 / 2
Doesn't contain any English letters (in either upper or lower case):
점수-20
Doesn't contain any of the BrainFlow / BFk commands in the interpreter itself:
점수-50
예
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;
}
}
골프에 가깝지 않지만 좋은 출발점을 제공해야합니다.
적용 가능한 챌린지 감소가 고려 된 후 프로그램의 점수가 바이트 수인 최저 최종 점수가 승리합니다.
테스팅
다음 BrainFlow 프로그램은 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
산출:
ðñðòñðòðôóòñóñôóðòõóñõðôôóòñööõôöðóöðõðùõñô÷ùõóñöóùñô÷øôøõôòöõóðòöóñ÷ðõôûôòú÷úø÷öùøöùñøðùúðûðþöûñùýøðòñ
subset
로 변경 되었습니다 extension
. 조언 감사합니다.
++&
나이+++&
를 검색 하거나 내가 태어난 달을 검색 할 수 있습니다 . 물론 64 번째 셀의 기본값은 0입니다)