BrainFlow
O que é o BrainFlow?
BrainFlow é uma extensão do BrainF ** k (BFk) com 3 comandos adicionais para maior funcionalidade e confusão.
Quais comandos?
Além dos comandos normais do BFk , também temos:
^ Salta para a célula #, dependendo do valor na célula. Ex: se estivermos na célula # 0 com um valor de 4, ^ nos levará para a célula # 4.
= Define o valor na célula para o índice da célula. Ex: se estivermos na célula # 4 com o valor 0, = definirá nosso valor para 4.
& Definirá o valor na célula atual igual ao valor na célula com base no valor em nossa célula atual. (Isso é difícil de dizer, então aqui está um exemplo!) Ex: Estamos na célula # 33 e nosso valor atual nessa célula é 7, e definiremos nosso valor atual na célula # 33 para qualquer valor que esteja na célula # 7.
Desafios opcionais
A realização de uma das seguintes ações aplicará o bônus especificado à sua contagem de bytes.
Interpreter written in BrainFlow
(Pode ser interpretado pela amostra e contém pelo menos um ^ = ou & significativo): Pontuação / 3
Interpreter written in BrainF**k:
Pontuação / 2
Doesn't contain any English letters (in either upper or lower case):
Pontuação - 20
Doesn't contain any of the BrainFlow / BFk commands in the interpreter itself:
Pontuação - 50
Exemplo
Um exemplo de interpretador 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;
}
}
Nem mesmo perto do golfe, mas deve fornecer um bom ponto de partida.
A pontuação final mais baixa vence, em que pontuação é o número de bytes no seu programa após as reduções do Desafio aplicáveis terem sido levadas em consideração.
Teste
O seguinte programa BrainFlow deve imprimir a saída especificada depois de ler um caracter '+' 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
Resultado:
ðñðòñðòðôóòñóñôóðòõóñõðôôóòñööõôöðóöðõðùõñô÷ùõóñöóùñô÷øôøõôòöõóðòöóñ÷ðõôûôòú÷úø÷öùøöùñøðùúðûðþöûñùýøðòñ
fonte
++&
para recuperar minha idade ou+++&
recuperar o mês em que nasci. é claro que a célula 64 é o valor padrão 0)subset
paraextension
. Obrigado pelo feedback.Respostas:
Perl -
233230210182180176174171 bytes$/=$,;%d=qw(> $p++ < $p-- + $v[$p]++ - $v[$p]-- , $v[$p]=ord+getc . print+chr+$v[$p] [ while+$v[$p]{ ] } ^ $p=$v[$p] = $v[$p]=$p & $v[$p]=$v[$v[$p]]);eval$d{$_}for<>=~/./g
Simplesmente peguei um dos meus intérpretes do BrainFuck, joguei golfe e adicionei as funções do BrainFlow.
Atualização: reestruturou completamente o programa para perder 28 bytes.
fonte
[]
). Você não pode avaliar caractere por caractere para isso.Vamos começar esta festa.
C -
408384393 390 380 357352 bytes (ainda se desfazendo)Compile
gcc
em um sistema compatível com POSIX. O primeiro argumento é o nome de um arquivo que contém o código Brainflow a ser interpretado. Novas linhas adicionadas para melhorar a legibilidade.E a versão ungolfed se você estiver interessado. Deixe-me saber se você encontrar algum erro.
Atualizações:
Obrigado pelo feedback inicial que me permitiu extrair 24 bytes extras.
Bug de sinal corrigido. Adicionados outros 9 bytes.
Salvo outros 3 bytes de acordo com as sugestões de es1024.
Salvo outros 10 bytes por mais sugestões de es1024.
Recorde-se que as variáveis globais são inicializadas como 0. Alternadas de fread e fopen para leitura e abertura. 23 bytes salvos.
fonte
main(int c,char**v){
commain(c,v)char**v;{
e salvar dois bytes, assim como movimentoint i=0,p=0,b[9999],*k=b;
para fora da função, e soltar aint
salvar quatro bytes.if (c==91)
também tem um espaço desnecessário.c==[number]?[action]:0;
porc-[number]||[action]
. (c-[number]
é equivalente ac != [number]
eif(p)p--;
comp&&p--;
AppleScript
972670Principalmente jogado no golfe, embora nunca tenha como vencer.Não sei por que não pensei em construir um script como o perl (embora ainda não ganhe haha). Provavelmente, isso poderia ser melhor, reajustando o valor do índice um pouco melhor, o AppleScript é frustrantemente (para esse tipo de coisa) uma linguagem de índice 1.Basta passar o código BrainFlow para e (). Observe que os comandos ASCII do AppleScript usam a codificação MacOSRoman; portanto, embora a saída pareça diferente, é correto observar sua representação binária. Você precisará levar isso em consideração ao passar caracteres ASCII superiores nos comandos ",".
(porque o que mais fode com seu cérebro do que escrever um interpretador de fluxo cerebral em outro idioma que fode demais com sua cabeça?
fonte