Kompiler Brainfuck Acak

10

Joe adalah pengembang BF rata-rata Anda. Dia akan memeriksa perubahan kodenya ke repositori mereka ketika dia mendapat telepon dari bosnya. "Joe! Mesin klien baru rusak! Penerjemah brainfuck mengatur semua sel ke nilai acak sebelum eksekusi program. Tidak ada waktu untuk memperbaikinya, kode Anda harus menghadapinya." Joe tidak terlalu memikirkannya, dan akan menulis sebuah program untuk mengatur juta sel pertama menjadi nol, ketika bosnya memotongnya lagi - "... dan jangan berpikir tentang menggunakan brute force, kodenya harus sekecil mungkin. " Sekarang Anda harus membantu Joe yang malang!

Spesifikasi

  • Anda akan mendapatkan beberapa kode brainfuck yang valid sebagai input
  • Program Anda kemudian akan memodifikasi kode sehingga harus bekerja pada penerjemah brainfuck acak
  • Ini berarti bahwa sebelum eksekusi program, sel-sel dapat diatur ke nilai apa pun.
  • Program baru harus memiliki perilaku yang sama persis terlepas dari kondisi awal.
  • Interpreter akan memiliki nilai sel maksimum 255 dengan pembungkus, dan pita panjang tak terbatas.

Mencetak gol

Skor Anda adalah 10 kali ukuran kompilator dalam byte plus jumlah ukuran test case . Skor terendah jelas menang. Untuk memitigasi terhadap optimalisasi kasus uji, saya berhak mengubah kasus uji sekitar jika saya mencurigai sesuatu, dan mungkin akan melakukannya sebelum memilih pemenang.

Uji Kasus

(Saya mendapatkan ini dari halaman esolangs dan halaman web ini: http://www.hevanet.com/cristofd/brainfuck/ ). Juga terima kasih kepada @Sparr untuk test case terakhir.

  • Halo Dunia: ++++++++[>++++[>++>+++>+++>+<<<<-]>+>+>->>+[<]<-]>>.>---.+++++++..+++.>>.<-.<.+++.------.--------.>>+.>++.
  • Masukan terbalik: >,[>,]<[.<]
  • Powers of Two (Infinite Stream): >++++++++++>>+<+[[+++++[>++++++++<-]>.<++++++[>--------<-]+<<]>.>[->[ <++>-[<++>-[<++>-[<++>-[<-------->>[-]++<-[<++>-]]]]]]<[>+<-]+>>]<<]
  • Kotak Di Bawah 10000: ++++[>+++++<-]>[<+++++>-]+<+[>[>+>+<<-]++>>[<<+>>-]>>>[-]++>[-]+>>>+[[-]++++++>>>]<<<[[<++++++++<++>>-]+<.<[>----<-]<]<<[>>>>>[>>>[-]+++++++++<[>-<-]+++++++++>[-[<->-]+[<<<]]<[>+<-]>]<<-]<<-]
  • Aliran Fibonacci: >++++++++++>+>+[[+++++[>++++++++<-]>.<++++++[>--------<-]+<<<]>.>>[[-]<[>+<-]>>[<<+>+>-]<[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>[-]>+>+<<<-[>+<-]]]]]]]]]]]+>>>]<<<]
  • ASCII Urutan hingga input: ,[.[>+<-]>-](Yang ini membutuhkan nomor sel yang bervariasi berdasarkan input)
Maltysen
sumber
Komentar bukan untuk diskusi panjang; percakapan ini telah dipindahkan ke obrolan .
Martin Ender

Jawaban:

8

sed, kompiler 46 byte

s/</<</g
s/>/>[->[-]>[-]+<<]>/g
s/^/[-]>[-]+</

Saya tidak melihat bahwa output juga seharusnya golf sampai setelah menulis program, jadi saya akan pergi untuk kompiler pendek. Juga itu terlalu banyak pekerjaan untuk diuji, jadi tolong beri tahu jika tidak berfungsi dengan benar :)

feersum
sumber
1
Saya bingung. Baris ketiga Anda menggantikan string kosong? Apa yang cocok dengan string kosong di sed? "sed: RE pertama mungkin tidak kosong"
Sparr
@ Parr Baiklah, coba dengan caret sebagai gantinya.
feersum
3
ok, mari kita lihat apakah saya mengikuti ... nol sel 0, atur sel 1 menjadi satu. ganti semua <dengan << dan> dengan> X>. sekarang kapan saja program asli mengakses sel dan program baru mengakses sel 2n, sel bernomor genap. X nol nol sel ganjil dilewatkan, dan jika bukan nol maka nol nol sel berikutnya (sel genap) dan menetapkan sel ganjil berikutnya ke 1. apakah saya punya hak itu?
Sparr
2
Anda tahu, jika Anda mencari kompiler pendek, ini hanya akan menjadi 35 byte di Retina . ;)
Martin Ender
1
@ MartinBüttner plug tak tahu malu! : P
Optimizer
2

C ++

Ukuran kompiler: 630 byte (-10 byte terima kasih kepada Zacharý)
Hello World mengkompilasi ukuran hasil: 139
Square di bawah 10000: 319

Kompiler:

#include<string>
#include<map>
#include<stack>
#define B break
#define C case
#define S 30000
#define R m[(p<0)?(p%S)+S:p]
using s=std::string;using P=std::pair<int,int>;s a(s c){char m[S];memset(m,0,S);int p=0,i=0;P r{0,0};std::map<int,int>j;std::stack<int>t;for(int d=0;d<c.size();++d){if(c[d]==91)t.push(d);if(c[d]==93){j[d]=t.top();j[t.top()]=d;t.pop();}}while(i<c.size()){switch(c[i]){C'>':++p;B;C'<':--p;B;C'+':++R;B;C'-':--R;B;C'[':if(!R)i=j[i];B;C']':i=j[i]-1;B;default:B;}++i;r.first=p<r.first?p:r.first;r.second=p>r.second?p:r.second;}s n;for(int i=r.first;i<r.second;++i){n+="[-]>";}n+="[-]"+s(r.second,60)+c;return n;}

Penerjemah brainfuck acak:

void interpret(const std::string& code) {
    char memory[30000];
    for (int i = 0; i < 30000; ++i)
        memory[i] = std::rand()%256;
    int memPtr = 0, insPtr = 0;
    std::map<int, int> jump_map;

    {
        std::stack<int> jstack;
        for (int i = 0; i < code.size(); ++i) {
            if (code[i] == '[')
                jstack.push(i);
            if (code[i] == ']') {
                jump_map[i] = jstack.top();
                jump_map[jstack.top()] = i;
                jstack.pop();
            }
        }
    }
    while (insPtr < code.size()) {
        switch (code[insPtr]) {
        case '>': ++memPtr; break;
        case '<': --memPtr; break;
        case '+': ++memory[memPtr]; break;
        case '-': --memory[memPtr]; break;
        case '.': std::cout << memory[memPtr]; break;
        case ',': std::cin >> memory[memPtr]; break;
        case ']': if (memory[memPtr] != 0) insPtr = jump_map[insPtr]; break;
        case '[': if (memory[memPtr] == 0) insPtr = jump_map[insPtr]; break;
        default:break;
        }
        ++insPtr;
    }
}

Beberapa catatan:

  • Compiler akan menjalankan program untuk menentukan sel memori yang digunakan. Jika program Anda adalah loop tak terbatas, kompiler akan loop tak terbatas.
HatsuPointerKun
sumber
Anda dapat mengurangi skor Anda dengan mengubah nama piimenjadi P, dan mengubah definisi Runtuk m[p<0?p%30000+30000:p], dan memodifikasi semua panggilan / referensi sesuai dengan itu. Selain itu, ia memodifikasi kasus uji. Saya belum memeriksa ini, tetapi mungkin menyimpan beberapa byte untuk mendefinisikan sesuatu menjadi 30000, karena Anda sering menggunakannya.
Zacharý
1
Apakah perubahan Rakan m[p<0?p%S+S:p]berhasil?
Zacharý
Menghapus tanda kurung dalam definisi Rharus menghemat beberapa byte.
Zacharý
1

rs , 33 byte, Nilai: 2659

Sebagian besar hanya port sedjawaban sederhana.

</<<
>/>[->[-]>[-]+<<]>
[-]>[-]+<
kirbyfan64sos
sumber
1
Apakah Anda menerbitkan bahasa ini sebelum kemarin? Bahasa yang mengeposkan pembuatan pertanyaan tidak valid untuk mengirim jawaban.
Sparr
@Sparr Yah, sudah, tapi kemudian saya hancurkan sejarah komit Git saya dan harus membuat ulang repo ...
kirbyfan64sos