Trình biên dịch ngẫu nhiên Brainfuck


10

Joe là nhà phát triển BF trung bình của bạn. Anh ta chuẩn bị kiểm tra các thay đổi mã của mình vào kho lưu trữ của họ khi anh ta nhận được một cuộc gọi từ ông chủ của mình. "Joe! Máy của máy khách mới bị hỏng! Trình thông dịch brainfuck đặt tất cả các ô thành giá trị ngẫu nhiên trước khi thực hiện chương trình. Không có thời gian để sửa nó, mã của bạn sẽ phải xử lý nó." Joe không nghĩ nhiều về điều đó và chuẩn bị viết một chương trình để đặt một triệu ô đầu tiên về 0, khi ông chủ của anh ta ngắt lời anh ta một lần nữa - "... và đừng nghĩ về việc sử dụng vũ lực, mã phải càng nhỏ càng tốt. " Bây giờ bạn phải giúp Joe tội nghiệp!

Thông số kỹ thuật

  • Bạn sẽ nhận được một số mã brainfuck hợp lệ làm đầu vào
  • Chương trình của bạn sau đó sẽ sửa đổi mã để nó hoạt động trên trình thông dịch Brainfuck ngẫu nhiên
  • Điều này có nghĩa là trước khi thực hiện chương trình, các ô có thể được đặt thành bất kỳ giá trị nào.
  • Chương trình mới phải có hành vi giống hệt nhau bất kể điều kiện ban đầu.
  • Trình thông dịch sẽ có giá trị ô tối đa là 255 với gói và băng dài vô hạn.

Chấm điểm

Điểm của bạn gấp 10 lần kích thước trình biên dịch tính bằng byte cộng với tổng kích thước của trường hợp kiểm tra . Điểm thấp nhất rõ ràng là chiến thắng. Để giảm thiểu tối ưu hóa trường hợp thử nghiệm, tôi bảo lưu quyền thay đổi các trường hợp thử nghiệm xung quanh nếu tôi nghi ngờ bất cứ điều gì và có thể sẽ làm như vậy trước khi chọn người chiến thắng.

Các trường hợp thử nghiệm

(Tôi đã nhận được những thứ này từ trang esolangs và trang web này: http://www.hevanet.com/cristofd/brainfuck/ ). Cũng cảm ơn @Sparr cho trường hợp thử nghiệm cuối cùng.

  • Chào thế giới: ++++++++[>++++[>++>+++>+++>+<<<<-]>+>+>->>+[<]<-]>>.>---.+++++++..+++.>>.<-.<.+++.------.--------.>>+.>++.
  • Nhập ngược: >,[>,]<[.<]
  • Quyền hạn của hai (Dòng vô hạn): >++++++++++>>+<+[[+++++[>++++++++<-]>.<++++++[>--------<-]+<<]>.>[->[ <++>-[<++>-[<++>-[<++>-[<-------->>[-]++<-[<++>-]]]]]]<[>+<-]+>>]<<]
  • Hình vuông dưới 10000: ++++[>+++++<-]>[<+++++>-]+<+[>[>+>+<<-]++>>[<<+>>-]>>>[-]++>[-]+>>>+[[-]++++++>>>]<<<[[<++++++++<++>>-]+<.<[>----<-]<]<<[>>>>>[>>>[-]+++++++++<[>-<-]+++++++++>[-[<->-]+[<<<]]<[>+<-]>]<<-]<<-]
  • Luồng Fibre: >++++++++++>+>+[[+++++[>++++++++<-]>.<++++++[>--------<-]+<<<]>.>>[[-]<[>+<-]>>[<<+>+>-]<[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>[-]>+>+<<<-[>+<-]]]]]]]]]]]+>>>]<<<]
  • Trình tự ASCII cho đến đầu vào: ,[.[>+<-]>-](Cái này yêu cầu số lượng ô khác nhau dựa trên đầu vào)

Bình luận không dành cho thảo luận mở rộng; cuộc trò chuyện này đã được chuyển sang trò chuyện .
Martin Ender

Câu trả lời:


8

sed, trình biên dịch 46 byte

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

Tôi đã không nhận thấy rằng đầu ra cũng được cho là golf cho đến sau khi viết chương trình, vì vậy tôi sẽ chọn trình biên dịch ngắn. Ngoài ra, nó là quá nhiều công việc để kiểm tra, vì vậy xin vui lòng thông báo nếu nó không hoạt động chính xác :)


1
Tôi bối rối. Dòng thứ ba của bạn thay thế chuỗi trống? Chuỗi trống phù hợp với cái gì? "sed: RE đầu tiên có thể không trống"
Sparr

@Sparr Được rồi, thay vào đó hãy thử với dấu mũ.
frageum

3
ok, hãy xem tôi có theo ... không ô 0, đặt ô 1 thành một. thay thế tất cả <bằng << và> bằng> X>. bây giờ bất cứ khi nào chương trình gốc truy cập vào ô n, chương trình mới truy cập vào ô 2n, các ô được đánh số chẵn. X làm thay đổi ô lẻ được truyền qua và nếu nó không bằng 0 thì nó sẽ lấy ô tiếp theo (một ô chẵn) và đặt ô lẻ tiếp theo thành 1. tôi có đúng không?
Sparr

2
Bạn biết đấy, nếu bạn đang dùng một trình biên dịch ngắn, thì đây sẽ chỉ là 35 byte trong Retina . ;)
Martin Ender

1
@ MartinBüttner cắm không biết xấu hổ! : P
Trình tối ưu hóa

2

C ++

Kích thước trình biên dịch: 630 byte (-10 byte nhờ Zacharý)
Hello World kích thước kết quả biên dịch: 139
Square dưới 10000: 319

Trình biên dịch:

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

Trình thông dịch Brainfuck ngẫu nhiên:

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

Một số lưu ý:

  • Trình biên dịch sẽ thực thi chương trình để xác định các ô nhớ được sử dụng. Nếu chương trình của bạn là một vòng lặp vô hạn, trình biên dịch sẽ lặp vô hạn.

Bạn có thể rút ngắn tỉ số của bạn bằng cách thay đổi tên của piiđể P, và thay đổi định nghĩa của Rđể m[p<0?p%30000+30000:p], và sửa đổi tất cả các cuộc gọi / tham chiếu đến chúng cho phù hợp. Ngoài ra, ông đã sửa đổi các trường hợp thử nghiệm. Tôi đã không kiểm tra điều này, nhưng nó có thể lưu một số byte để xác định một cái gì đó 30000, vì bạn thường xuyên sử dụng nó.
Zacharý

1
Sẽ thay đổi Rđể m[p<0?p%S+S:p]làm việc?
Zacharý

Xóa các dấu ngoặc trong định nghĩa Rsẽ tiết kiệm một vài byte.
Zacharý

1

rs , 33 byte, Điểm: 2659

Chủ yếu chỉ là một cổng đơn giản của sedcâu trả lời.

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

1
Bạn đã xuất bản ngôn ngữ này trước ngày hôm qua? Các ngôn ngữ trì hoãn việc tạo câu hỏi không hợp lệ để gửi câu trả lời.
Sparr

@Sparr Vâng, tôi đã có, nhưng sau đó tôi đã phá hỏng lịch sử cam kết Git của mình và phải tạo lại repo ...
kirbyfan64sos
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.