Tàu mới của Theseus


9

The Ship of Theseus là một câu hỏi cũ có nội dung như sau:

Nếu một con tàu đã thay thế tất cả các bộ phận ban đầu của nó, nó vẫn là cùng một con tàu chứ?

Đối với môn đánh gôn này, chúng tôi sẽ từ từ thay thế "các bộ phận" trên một "con tàu" và xem phải mất bao lâu để có được một con tàu hoàn toàn mới.

Bài tập

Một con tàu bao gồm ít nhất hai phần. Các phần được đưa ra dưới dạng một mảng các số nguyên dương (khác không), đại diện cho điều kiện của phần đó.

Trên mỗi chu kỳ, chọn ngẫu nhiên một phần từ danh sách theo kiểu đồng phục. Điều kiện của phần đó sẽ được giảm đi một. Khi điều kiện của một phần bằng không, nó được thay thế bằng một phần mới. Phần mới bắt đầu với cùng một giá trị điều kiện như ban đầu đã làm.

Trong chu kỳ đầu tiên, nơi tất cả các bộ phận đã được thay thế (ít nhất) một lần, hãy dừng và xuất số chu kỳ đã thực hiện.

Ví dụ: giả sử tôi chọn các bộ phận ngẫu nhiên ở đây):

2 2 3  <- starting part conditions (input)
2 1 3  <- second part reduced
2 1 2  ...
2 1 1 
2 2 1  <- second part reduced to zero, replaced
1 2 1 
1 2 3  <- third part replaced
1 1 3 
2 1 3  <- first part replaced

Đầu ra cho ví dụ này sẽ là 8, vì phải mất tám chu kỳ cho tất cả các bộ phận được thay thế. Đầu ra chính xác sẽ khác nhau cho mỗi lần chạy.

Tôi / O

Đầu vào duy nhất là danh sách / mảng số nguyên cho điều kiện một phần. Đầu ra duy nhất là một số chu kỳ. Bạn có thể nhận / đưa ra các giá trị này theo bất kỳ cách thông thường nào: STDIO, đối số / trả về hàm, v.v.

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

Vì đầu ra không cố định, bạn có thể sử dụng bất cứ thứ gì bạn muốn kiểm tra, nhưng đây là một vài mục đích tiêu chuẩn hóa:

1 2 3 4

617 734 248 546 780 809 917 168 130 418

19384 74801 37917 81706 67361 50163 22708 78574 39406 4051 78099 7260 2241 45333 92463 45166 68932 54318 17365 36432 71329 4258 22026 23615 44939 74894 19257 49875 39764 62550 23750 4731 54121 8386 45639 54604 77456 58661 34476 49875 35689 5311 19954 80976 9299 59229 95748 42368 13721 49790

1
Tôi có thiếu thứ gì không, hay không quan trọng là khi một phần về 0, nó được thay thế bằng một phần mới?
xnor

@xnor Vâng, không có vấn đề gì để có câu trả lời, không (và dường như đó là điều cần làm để bỏ qua nó). Nhưng theo chủ đề , các bộ phận của con tàu cần thay thế: P
Geobits

Câu trả lời:


4

Bình thường, 12 byte

f!eSXOUQQtZ1

Trình diễn.

Làm thế nào nó hoạt động:

Điều này dựa trên bộ lọc vô hạn của Pyth, kiểm tra biểu thức tăng đầu vào cho đến khi trả về giá trị trung thực, sau đó trả về đầu vào khiến điều này xảy ra. Tuy nhiên, biểu thức sẽ được kiểm tra sẽ không sử dụng giá trị đầu vào.

Thay vào đó, biểu thức sẽ sửa đổi danh sách đầu vào bằng cách giảm một mục ngẫu nhiên. Điều này được thực hiện thông qua các biểu thức XOUQQtZ. Điều này có nghĩa là tăng chỉ số OUQtrong danh sách Qbằng cách tZ. OUQlà một chỉ số ngẫu nhiên theo chiều dài QtZlà -1. Qđược khởi tạo vào danh sách đầu vào.

Sau khi sửa đổi Qtheo cách này, chúng tôi lấy giá trị hiện tại của nó, Xtrả về, lấy mục nhập tối đa của nó eSvà lấy logic không phải của giá trị đó với !. Điều này trả về một giá trị trung thực lần đầu tiên khi mọi yếu tố Qđã được giảm xuống 0hoặc thấp hơn lần đầu tiên.

Để đảm bảo rằng số được trả về sẽ chính xác là số lần Qđã được sửa đổi, chúng tôi sẽ bắt đầu đếm vào lúc đó 1, cho biết lần đầu tiên được gọi, đã có 1 lần sửa đổi. Để xem giao Qdiện sau mỗi lần lặp mã, hãy xem phiên bản tại đây .


5

GolfScript ( 26 24 byte) / CJam ( 20 18 byte)

GolfScript:

~{$)*}{.,rand{(+}*((+}/,

Bản demo trực tuyến

CJam (cùng ý tưởng nhưng thực hiện hơi khác nhau):

q~{_mr((+_$)*}g;],

Bản demo trực tuyến

Đầu vào là trên stdin trong mẫu [2 2 3].

Đây là một trong những dịp hiếm hoi mà toán tử mở rộng của GolfScript hữu ích. Nó cho phép chúng ta tích lũy các trạng thái mà con tàu đi qua, và sau đó đếm chúng ở cuối. Lưu ý rằng mảng được tính bao gồm trạng thái ban đầu (đầu vào) nhưng không phải là trạng thái cuối cùng trong đó phần tử cuối cùng đã được giảm xuống 0.

Tuy nhiên, mặc dù CJam không phát hiện ra khả năng xáo trộn một mảng đồng đều chỉ với 2 ký tự được tính rất nhiều và cho phép nó xuất hiện trên đầu trang.


3

Python 3, 91 71 byte

20 (!) Byte được lưu nhờ @xnor.

from random import*
def f(p):shuffle(p);p[0]-=1;return max(p)<1or-~f(p)

Hàm đệ quy tự gọi mình với các giá trị mảnh nhỏ hơn cho đến khi tất cả các giá trị mảnh là 0 hoặc âm và mọi hàm trả về giá trị trả về của con + 1 và cuối cùng được gọi là 1 trả về 1.


Bạn có thể kiểm tra sự hiện diện của một số dương với max(p)>0.
xnor

Và phủ nhận điều kiện như max(p)<1or-~f(p)cho phép bạn tránh or 1, kể từ đó True==1.
xnor

Bạn có thể giảm một cách hiệu quả một yếu tố ngẫu nhiên pvới shuffle(p);p[0]-=1.
xnor

@xnor Wow, cảm ơn! Đây là tất cả tuyệt vời!
Randomra

1

Python 3, 175 byte

import random
p,t=input().split(),0;f,r=[int(i)for i in p],[0]*len(p)
while 0 in r:
 f[random.randint(0,len(f)-1)]-=1;t+=1
 for x in range(len(f)):
  r[x]=int(f[x]<1)
print(t)

Không đặc biệt chơi golf .

Dùng thử trực tuyến tại đây


Bình luận tự hủy
Tim
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.