Mở đầu , 69 55 54 byte
?1-(v #1)-
1 0v ^(# 0 (1+0)#)!
(#) ^#1-(0)#
Nếu một trình thông dịch tuân thủ tiêu chuẩn được sử dụng, điều này sẽ lấy đầu vào và đầu ra làm giá trị byte . Để thực sự sử dụng số thập phân trên STDIN / STDOUT, bạn cần thông dịch Python với NUMERIC_OUTPUT = True
và một tùy chọn bổ sung NUMERIC_INPUT = True
.
Giải trình
Bộ xương của chương trình là
?1-( 1 -
1 )!
Chúng tôi đọc đầu vào N
lên giọng nói đầu tiên và giảm âm lượng để có được N-1
. Chúng tôi cũng khởi tạo tiếng nói thứ hai để 1
. Sau đó, chúng tôi lặp N-1
một lần, mỗi lần lặp lại sẽ nhận giá trị tiếp theo của chuỗi trên ngăn xếp thứ hai. Cuối cùng, chúng tôi in N
số thứ.
Ý tưởng của chương trình là đặt từng phần tử của chuỗi vào hàng đợi trên giọng nói thứ ba và giảm phần đầu của hàng đợi đó trong mỗi lần lặp. Khi đạt đến đầu 0
, chúng ta tăng giá trị của chuỗi và loại bỏ nó 0
.
Bây giờ vấn đề là Prelude sử dụng ngăn xếp và không phải hàng đợi. Vì vậy, chúng ta cần thay đổi xung quanh ngăn xếp đó một chút để sử dụng nó như một hàng đợi.
v #
0v ^
(#)
Điều này sao chép giá trị hiện tại của chuỗi thành giọng nói đầu tiên (dưới dạng bản sao tạm thời), đẩy một 0
giọng nói lên giọng nói thứ hai (để đánh dấu sự kết thúc của hàng đợi). Và sau đó thực hiện một vòng lặp để dịch chuyển (và do đó đảo ngược) ngăn xếp thứ ba lên ngăn thứ hai. Sau vòng lặp, chúng tôi đặt bản sao của giá trị chuỗi hiện tại lên trên cùng của ngăn xếp thứ hai (là đuôi của hàng đợi của chúng tôi).
)
(#
^#1-
Điều này có vẻ hơi xấu, nhưng về cơ bản, đó là một vòng lặp để chuyển chồng trở lại giọng nói thứ ba. Vì âm thanh )
nằm trong cùng cột với hướng dẫn dịch chuyển, nên 0
chúng tôi đã nói giọng nói thứ hai trước đó cũng sẽ kết thúc bằng giọng nói thứ ba, vì vậy chúng tôi cần phải loại bỏ nó bằng giọng nói khác #
. Sau đó giảm đỉnh của giọng nói thứ 3, tức là đầu của hàng đợi.
Bây giờ nó có một chút khó chịu - chúng tôi muốn chạy một số mã khi giá trị đó là 0
, nhưng cấu trúc điều khiển duy nhất của Prelude (vòng lặp) chỉ đáp ứng với các giá trị khác không.
0 (1+0)#
(0)#
Lưu ý rằng đỉnh của giọng nói thứ hai là trung thực (vì chuỗi Golomb không chứa bất kỳ 0
s nào ). Vì vậy, khối lượng công việc đi vào giọng nói đó (cặp dấu ngoặc đơn sau). Chúng ta chỉ cần ngăn điều đó xảy ra nếu người đứng đầu hàng đợi 0
chưa có. Vì vậy, đầu tiên chúng ta có một "vòng lặp" trên giọng nói thứ ba sẽ đẩy một 0
giọng nói thứ hai nếu đầu của hàng đợi vẫn khác không. Chúng tôi cũng đặt một 0
giọng nói thứ ba để thoát khỏi vòng lặp ngay lập tức. Các #
trên giọng nói thứ ba sau đó hoặc là loại bỏ rằng 0
, hoặc loại bỏ người đứng đầu của hàng đợi nếu mà đã là zero. Bây giờ vòng lặp thứ hai chỉ được nhập nếu phần đầu của hàng đợi bằng 0 (và0
trên giọng nói thứ hai không bao giờ được đẩy). Trong trường hợp đó, chúng tôi tăng giá trị hiện tại của chuỗi và đẩy a 0
để thoát khỏi vòng lặp. Cuối cùng, sẽ luôn có một 0
đầu trên ngăn xếp, mà chúng ta cần loại bỏ.
Tôi đã nói với bạn rằng phủ định logic là khó chịu trong Prelude ...
n
chứ không phải2 - n % 1
. Bạn có bất kỳ lý do để mong đợi câu trả lời sẽ khác nhau đáng kể?