Golf một phiên dịch màu tím
Màu tím là một esolang được thiết kế với hai mục đích chính:
- Để giảm thiểu Aubergine , vì không có đủ các ngôn ngữ một hướng dẫn tự sửa đổi xung quanh.
- Phải thừa nhận khả năng phiên dịch golf nhỏ đáng sợ . Vượt qua đầu tiên của tôi tại một trình thông dịch Python 2 đầy đủ tính năng hợp lý chỉ có 702 byte và tôi chắc chắn một người chơi gôn có kinh nghiệm hơn có thể cạo khá nhiều từ đó.
Mục tiêu của bạn là viết một thông dịch viên cho ngôn ngữ này.
Thông tin về màu tím:
Một chương trình màu tím là một chuỗi các ký tự được đặt vào một mảng bộ nhớ có thể định địa chỉ vô hạn sao cho ký tự đầu tiên của chương trình được đặt ở địa chỉ 0. Phần còn lại của mảng (cả trước và sau khi chương trình Purple được lưu trữ) được khởi tạo thành không.
Có ba thanh ghi màu Tím, được gọi là a và b và i , mỗi thanh ghi có thể chứa một số nguyên đã ký và được khởi tạo thành không. i cũng là con trỏ lệnh và luôn trỏ đến lệnh Purple hiện đang thực thi.
Mỗi chu kỳ, trình thông dịch sẽ đọc một chuỗi gồm ba ký tự liền kề bắt đầu từ vị trí bộ nhớ được chỉ định bởi con trỏ lệnh và cố gắng thực hiện chuỗi này dưới dạng lệnh Purple. Sau đó, con trỏ lệnh luôn được tăng thêm 3.
Về mặt cú pháp, lệnh Purple bao gồm ba ký tự (hoặc mã hóa chúng) liên tiếp, như " xyz ".
Ký tự đầu tiên x có thể là một trong các ký tự sau:
abABio
Những biểu tượng này có ý nghĩa như sau:
a - Place the result in register a.
b - Place the result in register b.
A - Place the result in the location in memory referred to by register a.
B - Place the result in the location in memory referred to by register b.
i - Set the instruction pointer to the result.
o - Output the result to stdout.
Hai byte y và z khác có thể là bất kỳ thứ nào sau đây:
abABio1
Mỗi biểu tượng này có ý nghĩa như sau:
a - Return the contents of register a.
b - Return the contents of register b.
A - Return the contents of the memory array at the address stored in register a.
B - Return the contents of the memory array at the address stored in register b.
i - Return the contents of register i (the instruction pointer).
o - Return the value of a single character read from stdin.
1 - Return the literal numeric value 1.
Sau khi tìm nạp hướng dẫn, trình thông dịch Purple sẽ đánh giá y và sau đó z , trừ kết quả của z khỏi kết quả của y và sau đó thực hiện hành động được chỉ định bởi x về sự khác biệt.
Nếu chuỗi ba ký tự (hoặc mã hóa) không phải là một lệnh Purple hợp lệ, trình thông dịch sẽ dừng ngay lập tức mà không đưa ra bất kỳ lỗi nào.
Thông dịch viên của bạn phải:
- Hãy là một chương trình hoàn chỉnh, không phải là một chức năng.
- Không bao giờ xuất ra stderr, trừ khi EOF được đọc .
- Hành xử giống hệt với việc thực hiện tham chiếu trên tất cả các đầu vào được hình thành tốt không liên quan đến số lượng rất lớn, bao gồm các chương trình thử nghiệm được đưa ra dưới đây. (Chà, giống hệt với thời gian - nó có thể chạy chậm hơn, nhưng không quá nhiều!)
Bạn có thể cung cấp chương trình cho trình thông dịch dưới bất kỳ hình thức nào bạn muốn: đọc nó từ một tệp, nhúng nó vào chương trình dưới dạng một chuỗi hoặc đọc nó từ stdin.
Các trường hợp thử nghiệm:
Chương trình
ooo
khi chạy với đầu vào
z!
nên nhường
Y
Chương trình
bbboobiii
khi chạy với đầu vào
It's a cat program.
(hoặc bất kỳ đầu vào nào khác) sẽ mang lại
It's a cat program.
(hoặc bất cứ thứ gì nó nhận được) và sau đó bắt đầu lại và làm lại điều tương tự .
Chương trình
Aoab11bi1bABoAaiba
khi chạy với đầu vào
0
nên nhường
0
và sau đó dừng lại, nhưng khi chạy với đầu vào
1
nên tiếp tục xuất ra
1
mãi mãi.
Chương trình
b1bbb1oAbabaa1ab1Ab1Bi1b
nên nhường
b1bbb1oAbabaa1ab1Ab1Bi1b
Chương trình
aA1aa1bb1oAbbi1bb1bbAb1Bi1b Purple is the awesomest! Why haven't you tried it yet?
!dlroW ,olleG
nên nhường
Hello, World!
Ghi điểm:
Đây là môn đánh gôn , vì vậy nguồn ngắn nhất tính bằng byte, có khả năng được sửa đổi bởi phần thưởng sau, sẽ thắng.
Tặng kem:
- -10% nếu trình thông dịch của bạn đọc tên tệp từ stdin hoặc từ đối số dòng lệnh và tải chương trình từ tệp.
uint32
cho các ký tự và MAXINT cho ints