Đây là Thử thách hàng tuần # 2. Chủ đề: Dịch
Viết chương trình hoặc hàm lấy mã nguồn cho chương trình trong Prelude và xuất mã cho chương trình tương đương trong Befunge-93 . Để chương trình tương đương, đối với bất kỳ đầu vào cụ thể nào, sẽ tạo ra cùng một đầu ra như chương trình Prelude và tạm dừng khi và chỉ khi chương trình Prelude tạm dừng.
Ngôn ngữ nhập: Mở đầu
Trình thông dịch Python:
Một chương trình Prelude bao gồm một số "tiếng nói" thực hiện các hướng dẫn đồng thời. Các hướng dẫn cho mỗi giọng nói là trên một dòng riêng biệt. Mỗi giọng nói có một ngăn xếp riêng, được khởi tạo với số lượng không giới hạn. Thực thi bắt đầu ở cột ngoài cùng bên trái và tiến một cột sang phải mỗi dấu, trừ khi bị ảnh hưởng bởi )
hoặc (
chỉ dẫn. Chương trình chấm dứt khi đạt đến cột cuối cùng.
Thông số mở đầu cho thử thách này:
Digits 0-9 Push onto the stack a number from 0 to 9. Only single-digit
numeric literals can be used.
^ Push onto the stack the top value of the stack of the above
voice.
v Push onto the stack the top value of the stack of the below
voice.
# Remove the top value from the stack.
+ Pop the top two integers from the stack and push their sum.
- Pop the top two integers from the stack, subtract the topmost
from the second, and push the result.
( If the top of the stack is 0, jump to the column after the
matching `)` after the current column executes.
) If the top of the stack is not 0, jump to the column after
the matching `(` after the current column executes.
? Read an integer from STDIN.
! Pop one value from the stack and print it to STDOUT as an
integer.
<space> No-op
Ghi chú
v
và^
hành động theo chu kỳ, do đó,v
giọng nói ở phía dưới sẽ sao chép thành phần ngăn xếp của giọng nói^
trên và giọng nói trên cùng sẽ sao chép từ giọng nói phía dưới. Hệ quả: Cả haiv
và^
nhân đôi đỉnh của ngăn xếp trong một chương trình thoại đơn.- A
(
và kết hợp của nó)
có thể được đặt trên các dòng khác nhau. Tuy nhiên , a)
sẽ luôn nhìn vào ngăn xếp của giọng nói nơi(
được đặt tương ứng , chứ không phải là ngăn xếp nơi)
chính nó được đặt. - Các giá trị được tạo bởi
^
vàv
hướng dẫn hoạt động trên các giá trị hiện tại trước khi hoàn thành bất kỳ hoạt động nào khác trong cùng một cột. ?
và!
hoạt động khác với đặc điểm kỹ thuật được tìm thấy trên esolangs.org, vì vậy hãy chắc chắn kiểm tra với trình thông dịch sửa đổi một chút được cung cấp trong bài đăng này.
Đầu vào được đảm bảo có:
- Khớp ngoặc đơn
- Không quá một dấu ngoặc đơn trong một cột
- Cùng số lượng ký tự trên mỗi dòng
- Ít nhất một dòng
- Không có cột có nhiều hơn một lệnh I / O (
!
hoặc?
) - Một ký tự cho ăn theo hướng dẫn cho mỗi giọng nói
- Không có nhân vật nào khác ngoài những nhân vật được đề cập ở trên
Ngôn ngữ đầu ra: Befunge-93
Befunge là ngôn ngữ dựa trên ngăn xếp có bộ đếm chương trình (PC; con trỏ đến lệnh hiện tại) di chuyển tự do trên lưới hai chiều. Nó bắt đầu ở góc trên cùng bên trái, di chuyển sang bên phải. Sân chơi có hình xuyến, tức là chuyển động của PC bao quanh cả hai cạnh. Befunge cũng có một ngăn xếp được khởi tạo với số lượng vô hạn. Befunge có các hoạt động sau:
Bạn có thể giả sử các đặc điểm sau của trình biên dịch / trình thông dịch Befunge-93:
- Số nguyên là không giới hạn chính xác.
- Nó cho phép lưới có kích thước bất kỳ.
- Các tọa độ lưới (cho
g
vàp
) dựa trên 0.
Chấm điểm
Để ngăn các bài nộp đơn giản tạo ra trình thông dịch Prelude trong Befunge và mã hóa nguồn Prelude vào đó, mục tiêu sẽ là giảm thiểu kích thước của mã nguồn Befunge kết quả.
Dưới đây được cung cấp một số chương trình Prelude. Phiên dịch của bạn sẽ được chạy trên tất cả những điều này. Điểm của bạn là tổng kích thước của các chương trình Befunge, miễn là tất cả chúng đều hợp lệ.
Trình dịch của bạn không nên được tối ưu hóa cụ thể đối với các trường hợp thử nghiệm này (ví dụ: bằng các chương trình Befunge viết tay cứng cho họ). Nếu tôi nghi ngờ bất kỳ câu trả lời nào khi làm như vậy, tôi có quyền thay đổi đầu vào hoặc tạo thêm đầu vào.
Đầu vào mẫu
In n-1
xuống 0
:
?(1-^!)
Logic VÀ:
? (0)
?(0 )
1 !
Hợp lý HOẶC:
? (0)
? (0)
1 1 !
Kiểm tra tính chẵn lẻ của đầu vào (tức là modulo 2) của số không âm:
?(1-)
^ v
v1-^^-!
Bình phương đầu vào:
^
^+ !
?(1-)
In số Fibonacci thứ n , trong đó n = 0
tương ứng với 0 và n = 1
tương ứng với 1:
0 v+v!
1 ^
?(1-)
Dấu hiệu:
1) v # - !
vv (##^v^+)
?(# ^ ##
Bộ phận cho đầu vào không âm:
1 (# 1) v # - 1+)
vv (##^v^+)
? v-(0 # ^ #
?
1+ 1-!
Tất nhiên, chương trình của bạn phải thể hiện cùng một hành vi cho tất cả các trường hợp, ngay cả khi hành vi của chương trình mẫu đối với các số âm không được chỉ định.
Cuối cùng, trình dịch của bạn không nên dài một cách vô lý:
- Nó phải được chứa trong bài Stack Stack
- Nó sẽ xử lý các đầu vào mẫu dưới 10 phút trên một máy tính để bàn thông thường.
Lưu ý rằng đầu vào số cho Prelude hoặc Befunge được cung cấp dưới dạng dấu trừ tùy chọn theo sau là một hoặc nhiều chữ số thập phân, theo sau là một dòng mới. Đầu vào khác là hành vi không xác định.
Bạn có thể viết dịch giả của bạn bằng bất kỳ ngôn ngữ. Mã Befunge dịch ngắn nhất sẽ thắng.
Bảng xếp hạng
- Sp3000 : 16430 byte
1
trong một vòng lặp, vì vậy nó có thể không được đẩy. Số 0 có thể đến từ số lượng 0 vô hạn bắt đầu trên ngăn xếp.