BrainFlow
Что такое BrainFlow?
BrainFlow - это расширение BrainF ** k (BFk) с 3 дополнительными командами для дополнительной функциональности и путаницы.
Какие команды?
В дополнение к обычным командам BFk у нас также есть:
^ Переход к ячейке # в зависимости от значения в ячейке. Пример: Если мы находимся в ячейке № 0 со значением 4, ^ переместит нас в ячейку № 4.
= Устанавливает значение в ячейке в индекс ячейки. Пример: Если мы находимся в ячейке # 4 со значением 0, = установим наше значение в 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
Выход:
ðñðòñðòðôóòñóñôóðòõóñõðôôóòñööõôöðóöðõðùõñô÷ùõóñöóùñô÷øôøõôòöõóðòöóñ÷ðõôûôòú÷úø÷öùøöùñøðùúðûðþöûñùýøðòñ
источник
++&
чтобы узнать свой возраст или+++&
месяц, в котором я родился. конечно, 64-я ячейка имеет значение по умолчанию 0)subset
наextension
. Спасибо за ответ.Ответы:
Perl -
233230210182180176174171 байт$/=$,;%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
Просто взял мой существующий интерпретатор BrainFuck, поиграл в гольф и добавил функции BrainFlow.
Обновление: полностью реструктурирована программа, чтобы потерять 28 байт.
источник
[]
). Вы не можете оценить символ за символом для этого.Давайте начнем эту вечеринку.
C -
408 384 393 390 380 357352 байта (все еще отщепляется)Компилировать с
gcc
системой, совместимой с POSIX. Первый аргумент - это имя файла, содержащего код Brainflow для интерпретации. Добавлены новые строки для улучшения читабельности.И версия без присмотра, если вам интересно. Дайте мне знать, если увидите какие-либо ошибки.
Обновления:
Спасибо за первоначальный отзыв, который позволил мне сбросить лишние 24 байта.
Ошибка со знаком исправлена. Добавлены еще 9 байтов.
Сохранено еще 3 байта на предложения es1024.
Сохранено еще 10 байтов на дополнительные предложения от es1024.
Только что вспомнил, что глобальные переменные инициализируются на 0. Переключены с fread и fopen на чтение и открытие. Сохранено 23 байта.
источник
main(int c,char**v){
сmain(c,v)char**v;{
и сохранить два байта, а также двигатьсяint i=0,p=0,b[9999],*k=b;
к внешней функции, и опускать ,int
чтобы сохранить четыре байта.if (c==91)
также имеет ненужное место.c==[number]?[action]:0;
сc-[number]||[action]
. (c-[number]
эквивалентноc != [number]
иif(p)p--;
сp&&p--;
AppleScript
972670В основном в гольфе, хотя он никогда не победит.Я не знаю, почему я не думал просто о создании скрипта, как это делал perl (хотя он все равно не победит, хаха). Вероятно, это можно было бы сделать лучше, перенастроив то, как значения индекса немного лучше, AppleScript разочаровывает (для такого рода вещей) язык с 1 индексом.Просто передайте код BrainFlow в e (). Обратите внимание, что в ASCII-командах AppleScript используется кодировка MacOSRoman, поэтому, несмотря на то, что вывод будет выглядеть по-разному, он корректен, если смотреть на его двоичное представление. Вы должны будете принять это во внимание при передаче любых верхних символов ASCII, хотя в командах ",".
(потому что, что черт побери, с твоим мозгом больше, чем написание интерпретатора мозгового удара / потока на другом языке, который чересчур сильно болит?
источник