Rastgele Brainfuck Derleyici


10

Joe ortalama BF geliştiriciniz. Patronundan bir çağrı aldığında havuzundaki kod değişikliklerini kontrol etmek üzere. "Joe! Yeni müşterinin makinesi bozuldu! Brainfuck yorumlayıcısı, program yürütülmeden önce tüm hücreleri rastgele değerlere ayarlar. Düzeltmek için zaman yok, kodunuz bununla uğraşmak zorunda kalacak." Joe fazla düşünmüyor ve patronu onu tekrar kestiğinde ilk milyon hücreyi sıfıra ayarlamak için bir program yazmak üzeredir - "... ve kaba kuvvet kullanmayı düşünmeyin, kod olabildiğince küçük ol. " Şimdi fakir Joe'ya yardım etmelisin!

Özellikler

  • Girdi olarak geçerli bir brainfuck kodu alacaksınız
  • Programınız daha sonra kodu, randomize bir brainfuck yorumlayıcısı üzerinde çalışacak şekilde değiştirir.
  • Bu, program yürütülmeden önce hücrelerin herhangi bir değere ayarlanabileceği anlamına gelir.
  • Yeni program, başlangıç ​​koşulları ne olursa olsun aynı davranışa sahip olmalıdır.
  • Yorumlayıcı, sarma ile birlikte maksimum hücre değerine ve sonsuz uzunlukta bir banda sahip olacaktır.

puanlama

Puanınız, bayt cinsinden derleyici boyutunun 10 katı artı test durumu boyutlarının toplamıdır . Test senaryosu optimizasyonuna karşı hafifletmek için, bir şeyden şüphelendiğimde test senaryolarını değiştirme hakkını saklıyorum ve muhtemelen bir kazanan seçmeden önce bunu yapacağım.

Test Durumları

(Bunları esolangs sayfasından ve şu web sayfasından aldım : http://www.hevanet.com/cristofd/brainfuck/ ). Ayrıca son test davası için @Sparr'a teşekkürler.

  • Selam Dünya: ++++++++[>++++[>++>+++>+++>+<<<<-]>+>+>->>+[<]<-]>>.>---.+++++++..+++.>>.<-.<.+++.------.--------.>>+.>++.
  • Ters Giriş: >,[>,]<[.<]
  • İki Kuvvet (Sonsuz Akım): >++++++++++>>+<+[[+++++[>++++++++<-]>.<++++++[>--------<-]+<<]>.>[->[ <++>-[<++>-[<++>-[<++>-[<-------->>[-]++<-[<++>-]]]]]]<[>+<-]+>>]<<]
  • 10000'in Altındaki Kareler: ++++[>+++++<-]>[<+++++>-]+<+[>[>+>+<<-]++>>[<<+>>-]>>>[-]++>[-]+>>>+[[-]++++++>>>]<<<[[<++++++++<++>>-]+<.<[>----<-]<]<<[>>>>>[>>>[-]+++++++++<[>-<-]+++++++++>[-[<->-]+[<<<]]<[>+<-]>]<<-]<<-]
  • Fibonacci Akışı: >++++++++++>+>+[[+++++[>++++++++<-]>.<++++++[>--------<-]+<<<]>.>>[[-]<[>+<-]>>[<<+>+>-]<[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>[-]>+>+<<<-[>+<-]]]]]]]]]]]+>>>]<<<]
  • ASCII Girişe kadar dizi: ,[.[>+<-]>-](Bu, girişe göre değişen hücre sayıları gerektirir)

Yorumlar uzun tartışmalar için değildir; bu sohbet sohbete taşındı .
Martin Ender

Yanıtlar:


8

sed, 46 bayt derleyici

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

Programın yazılmasından sonra çıktının da golf olması gerektiğini fark etmedim, bu yüzden kısa derleyiciye gideceğim. Ayrıca test etmek için çok fazla işti, bu yüzden doğru çalışmadığını bildiriniz :)


1
Kafam karıştı. Üçüncü satırınız boş dizenin yerini alıyor mu? Sed'de boş dize ne ile eşleşiyor? "sed: ilk RE boş olmayabilir"
Sparr

@Sparr Tamam, bunun yerine şapka ile deneyin.
feersum

3
tamam, bakalım takip edeyim ... 0 hücresini sıfırla, 1 hücresini bire ayarla. tüm <yerine << ve> ile> X> yazın. şimdi orijinal program n hücresine her eriştiğinde, yeni program 2n hücresine, çift sayılı hücrelere erişir. X, aktarılan tek hücreyi sıfırlar ve sıfır değilse, bir sonraki hücreyi (çift bir hücreyi) sıfırlar ve bir sonraki tek hücreyi 1'e ayarlar. Bu hakkım var mı?
Sparr

2
Eğer kısa bir derleyici için gidiyoruz, bu sadece 35 byte olacaktır, biliyorum Retina . ;)
Martin Ender

1
@ MartinBüttner utanmaz fiş! : P
Optimizer

2

C ++

Derleyici boyutu: 630 bayt (Zacharý sayesinde -10 bayt)
Merhaba Dünya derleme sonucu boyutu:
10000 Kare altında 10000: 319

Derleyici:

#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;}

Rasgele beyin fırtınası yorumlayıcısı:

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;
    }
}

Bazı notlar :

  • Derleyici, kullanılan bellek hücrelerini belirlemek için programı yürütür. Programınız sonsuz bir döngü ise, derleyici sonsuz döngü yapar.

Sen adını değiştirerek puanınızı azaltabilir piiiçin Pve değişen tanımı Riçin m[p<0?p%30000+30000:p]ve buna göre kendilerine yapılan tüm çağrılar / referanslar değiştirerek. Ayrıca, test senaryolarını değiştirdi. Bunu kontrol etmedim, ancak 30000sık sık kullandığınız için bir şey tanımlamak için bazı baytlar kaydedebilir .
Zacharý

1
İşe Rgeçmek ister misiniz m[p<0?p%S+S:p]?
Zacharý

Tanımındaki parantezleri kaldırmak Rbirkaç bayt kaydetmelidir.
Zacharý

1

rs , 33 bayt, Puan: 2659

Çoğunlukla sedcevabın basit bir limanı .

</<<
>/>[->[-]>[-]+<<]>
[-]>[-]+<

1
Bu dili dünden önce yayınladınız mı? Bir sorunun oluşturulmasından sonra gelen diller, cevapları göndermek için geçerli değildir.
Sparr

@Sparr Peki, ama sonra Git taahhüt geçmişimi harap ettim ve repoyu yeniden yaratmak zorunda kaldım ...
kirbyfan64sos
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.