BrainFlow
Apa itu BrainFlow?
BrainFlow adalah perpanjangan dari BrainF ** k (BFk) dengan 3 perintah tambahan untuk menambah fungsionalitas dan kebingungan.
Perintah apa?
Selain perintah BFk normal , kami juga memiliki:
^ Melompat ke sel # tergantung pada nilai dalam sel. Mis: Jika kita berada di sel # 0 dengan nilai 4, ^ akan melompat kita ke sel # 4.
= Menetapkan nilai pada sel ke indeks sel. Mis: Jika kita berada di sel # 4 dengan nilai 0, = akan menetapkan nilai kita menjadi 4.
& Akan menetapkan nilai pada sel saat ini sama dengan nilai pada sel berdasarkan pada nilai di sel kami saat ini. (Yang ini sulit untuk dikatakan, jadi inilah contohnya!) Mis: Kami berada di sel # 33 dan nilai kami saat ini di sel ini adalah 7, & akan menetapkan nilai kami saat ini di sel # 33 untuk nilai apa pun yang ada di sel # 7.
Tantangan Opsional
Menyelesaikan salah satu dari yang berikut ini akan menerapkan bonus yang ditentukan untuk jumlah byte Anda.
Interpreter written in BrainFlow
(Dapat ditafsirkan oleh sampel dan mengandung setidaknya satu bermakna ^ = atau &): Skor / 3
Interpreter written in BrainF**k:
Skor / 2
Doesn't contain any English letters (in either upper or lower case):
Skor - 20
Doesn't contain any of the BrainFlow / BFk commands in the interpreter itself:
Skor - 50
Contoh
Contoh penerjemah 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;
}
}
Bahkan tidak dekat dengan golf tetapi harus memberikan titik awal yang baik.
Skor final terendah menang, di mana skor adalah jumlah byte dalam program Anda setelah pengurangan Tantangan yang berlaku telah diperhitungkan.
Pengujian
Program BrainFlow berikut harus mencetak output yang ditentukan setelah membaca karakter '+' dari 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
Keluaran:
ðñðòñðòðôóòñóñôóðòõóñõðôôóòñööõôöðóöðõðùõñô÷ùõóñöóùñô÷øôøõôòöõóðòöóñ÷ðõôûôòú÷úø÷öùøöùñøðùúðûðþöûñùýøðòñ
sumber
++&
untuk mengambil umur saya atau+++&
untuk mengambil bulan di mana saya dilahirkan. (Asumsikan tentu saja sel ke-64 berada pada nilai default 0)subset
menjadiextension
. Terima kasih untuk umpan baliknya.Jawaban:
Perl -
233230210182180176174171 byte$/=$,;%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
Cukup ambil juru bahasa BrainFuck saya yang ada, pindahkan, dan tambahkan fungsi BrainFlow.
Pembaruan: Benar-benar merestrukturisasi program untuk kehilangan 28 byte.
sumber
[]
). Anda tidak dapat mengevaluasi karakter demi karakter untuk itu.Mari mulai pesta ini.
C -
408 384 393 390 380 357352 byte (masih terkikis)Kompilasi dengan
gcc
pada sistem yang mendukung POSIX. Argumen pertama adalah nama file yang berisi kode Brainflow untuk ditafsirkan. Baris baru ditambahkan untuk meningkatkan keterbacaan.Dan versi yang ungolfed jika Anda tertarik. Beri tahu saya jika Anda melihat ada bug.
Pembaruan:
Terima kasih atas umpan balik awal yang memungkinkan saya untuk mematikan 24 byte tambahan.
Masuk bug diperbaiki. Menambahkan 9 byte lagi.
Menyimpan 3 byte per saran dari es1024.
Menyimpan 10 byte lagi per saran lainnya dari es1024.
Baru ingat bahwa variabel global diinisialisasi ke 0. Beralih dari ketakutan dan membuka untuk membaca dan membuka. Disimpan 23 byte.
sumber
main(int c,char**v){
denganmain(c,v)char**v;{
dan menyimpan dua byte, serta pindahint i=0,p=0,b[9999],*k=b;
ke luar fungsi, dan jatuhkanint
untuk menyimpan empat byte.if (c==91)
juga memiliki ruang yang tidak perlu.c==[number]?[action]:0;
denganc-[number]||[action]
. (c-[number]
setara denganc != [number]
danif(p)p--;
denganp&&p--;
AppleScript
972670Sebagian besar bermain golf meskipun tidak mungkin menang.Saya tidak tahu mengapa saya tidak berpikir tentang hanya membangun skrip seperti perl yang dilakukan (meskipun masih tidak akan menang haha). Ini mungkin bisa golf lebih banyak dengan menyesuaikan kembali bagaimana nilai indeks sedikit lebih baik, AppleScript frustasi (untuk jenis barang) bahasa indeks 1.Cukup berikan kode BrainFlow ke e (). Perhatikan bahwa perintah ASCII AppleScript menggunakan pengkodean MacOSRoman, jadi sementara output akan tampak berbeda, itu benar melihat representasi binernya. Anda harus memperhitungkannya saat memasukkan karakter ASCII atas dengan perintah ",".
(karena apa dengan otak Anda lebih dari menulis penerjemah brainfuck / flow dalam bahasa lain yang terlalu banyak berhubungan dengan kepala Anda?
sumber