Rời khỏi Thằn lằn!


8

Giả sử chúng ta định nghĩa một chương trình đơn giản lấy một mảng L gồm các số tự nhiên có độ dài N và thực hiện như sau:

i=0                 #start at the first element in the source array
P=[]                #make an empty array
while L[i]!=0:      #and while the value at the current position is not 0
    P.append(L[i])  #add the value at the current position to the end of the output array
    i=(i+L[i])%N    #move that many spaces forward in the source array, wrapping if needed
return P            #return the output array

Mỗi chương trình như vậy sẽ chạy mãi mãi hoặc cuối cùng sẽ chấm dứt, tạo ra một danh sách các số nguyên dương. Công việc của bạn là, đưa ra một danh sách P gồm các số nguyên dương, tạo ra một danh sách ngắn nhất, L, các số tự nhiên chấm dứt và tạo P khi cắm vào chương trình trước đó.

Một danh sách như vậy luôn tồn tại, vì người ta chỉ có thể thêm các P[i]-1số 0 sau mỗi P[i]danh sách, sau đó một số 0 cuối cùng và nó sẽ tạo ra danh sách ban đầu. Ví dụ, đưa ra [5,5], một giải pháp là [5,0,0,0,0,5,0,0,0,0,0]. Tuy nhiên, [5,0,5]ngắn hơn nhiều, vì vậy giải pháp tự động không phải là giải pháp hợp lệ cho chương trình của bạn.

[5,6]->[5,6,0,0]  
[5,7]->[5,0,0,0,0,7,0,0]
[5,6,7]->[5,6,0,7]
[5,6,8]->[5,0,8,0,0,6,0,0,0]
[1,2,3,4]->[1,2,0,3,0,0,4,0]
[1,2,1,2]->[1,2,0,1,2,0,0]
[1,3,5,7]->[1,3,0,0,5,0,0,0,0,7]
[1,3,5,4]->[1,3,4,0,5,0,0]

Đầu vào là danh sách các số nguyên dương (ở một số định dạng bạn có thể chỉ định) và đầu ra phải ở cùng định dạng. Danh sách và kích thước số nguyên có thể lên tới 2 ^ 16. Đây là mã golf, vì vậy chương trình ngắn nhất trong byte thắng!


5
Bạn có chắc chắn rằng việc xử lý danh sách tùy ý lên tới 65536 phần tử trong 10 phút là khả thi? Bạn có một triển khai tham khảo mà đạt được nó?
Peter Taylor

2
Chỉ là một FYI, hộp cát có hiệu quả hơn khi được sử dụng lâu hơn 3 giờ: PI hiểu rằng nó có thể hấp dẫn để đăng ngay lập tức, nhưng tôi nghĩ nhận xét của Peter cho thấy câu hỏi này có thể được hưởng lợi như thế nào khi chạy lâu hơn ở đó.
FryAmTheEggman

Câu trả lời:


5

Python 3, 109 102 100 95 93 byte

def f(L,k=1,i=0):
 P=[0]*k
 for x in L:x=P[i]=P[i]or x;i=(i+x)%k
 return P[i]and f(L,k+1)or P

Một giải pháp đệ quy. Gọi nó như thế nào f([1,2,3,4]). Xem nó vượt qua tất cả các trường hợp thử nghiệm.

Chúng tôi bắt đầu với k=1(độ dài đầu ra) và i=0(vị trí trong đầu ra) và tạo một danh sách Pksố không. Sau đó, chúng tôi lặp đi lặp lại dọc theo các yếu tố xcủa L, cập nhật P[i]thành P[i]or x(để P[i]giữ giá trị của nó nếu nó khác không) và iđến (i+P[i])%k. Sau đó, chúng tôi kiểm tra xem giá trị cuối cùng P[i]bằng không, tăng dần knếu không và trả về P.

Nếu tại bất kỳ điểm nào của thuật toán P[i]đã khác 0, nó sẽ đi vào một vòng lặp đi vòng quanh một số giá trị khác 0 Pvà kết thúc ở giá trị khác 0; sau đó chúng tôi tái diễn.

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.