เรือใหม่ของเธเซอุส


9

เรือของเซอุสเป็นคำถามเดิมที่จะไปสิ่งที่ชอบ:

หากเรือได้เปลี่ยนชิ้นส่วนดั้งเดิมทั้งหมดแล้วมันยังคงเป็นเรือลำเดิมหรือไม่?

สำหรับกอล์ฟนี้เราจะค่อยๆเปลี่ยน "ชิ้นส่วน" เป็น "เรือ" และดูว่าต้องใช้เวลานานเท่าใดจึงจะได้เรือใหม่ทั้งหมด

งาน

เรือประกอบด้วยอย่างน้อยสองส่วน ชิ้นส่วนจะได้รับเป็นอาร์เรย์ของจำนวนเต็มบวก (ไม่เป็นศูนย์) แสดงถึงสภาพของส่วนนั้น

ในแต่ละรอบสุ่มเลือกหนึ่งส่วนจากรายการในรูปแบบเหมือนกัน เงื่อนไขของส่วนนั้นจะลดลงหนึ่ง เมื่อสภาพของชิ้นส่วนเป็นศูนย์มันจะถูกแทนที่ด้วยชิ้นส่วนใหม่ ชิ้นส่วนใหม่เริ่มต้นด้วยค่าเงื่อนไขเดียวกับที่ทำกับต้นฉบับ

ในรอบแรกที่มีการเปลี่ยนชิ้นส่วนทั้งหมด (อย่างน้อย) หนึ่งครั้งให้หยุดและส่งออกจำนวนรอบที่ใช้

ตัวอย่างเช่น (สมมติว่าฉันเลือกชิ้นส่วนแบบสุ่มที่นี่):

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

เอาต์พุตสำหรับตัวอย่างนี้8คือเนื่องจากใช้เวลาแปดรอบเพื่อให้ชิ้นส่วนทั้งหมดถูกแทนที่ เอาต์พุตที่แน่นอนควรแตกต่างกันสำหรับการวิ่งแต่ละครั้ง

I / O

อินพุตเท่านั้นคือรายการ / อาร์เรย์ของจำนวนเต็มสำหรับเงื่อนไขชิ้นส่วน เอาต์พุตเพียงจำนวนรอบเท่านั้น คุณสามารถรับ / ให้ค่าเหล่านี้ได้หลายวิธี: STDIO, อาร์กิวเมนต์ของฟังก์ชัน / คืน, ฯลฯ

กรณีทดสอบ

เนื่องจากเอาต์พุตไม่ได้รับการแก้ไขคุณสามารถใช้สิ่งที่คุณต้องการทดสอบได้ แต่นี่เป็นสองสิ่งสำหรับวัตถุประสงค์มาตรฐาน:

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
ฉันทำบางสิ่งหายไปหรือไม่สำคัญว่าเมื่อชิ้นส่วนถึง 0 จะถูกแทนที่ด้วยชิ้นส่วนใหม่หรือไม่
xnor

@ xnor ดีไม่สำคัญที่จะได้รับคำตอบไม่ใช่ (และดูเหมือนว่าเป็นสิ่งที่ต้องทำเพื่อข้ามมัน) แต่ใจความชิ้นส่วนของเรือจำเป็นต้องเปลี่ยน: P
Geobits

คำตอบ:


4

Pyth, 12 ไบต์

f!eSXOUQQtZ1

สาธิต.

มันทำงานอย่างไร:

สิ่งนี้มีพื้นฐานมาจากตัวกรองที่ไม่มีที่สิ้นสุดของ Pyth ซึ่งทดสอบการแสดงออกด้วยการเพิ่มอินพุตจนกว่าจะส่งคืนความจริงบางอย่างจากนั้นส่งคืนอินพุตที่ทำให้สิ่งนี้เกิดขึ้น อย่างไรก็ตามนิพจน์ที่จะทดสอบจะไม่ใช้ค่าอินพุต

แต่นิพจน์จะแก้ไขรายการอินพุตโดยการลดรายการสุ่ม XOUQQtZนี่คือความสำเร็จผ่านการแสดงออก ที่นี้หมายถึงการเพิ่มขึ้นของดัชนีOUQในรายการโดยQ เป็นดัชนีแบบสุ่มในความยาวของและเป็น -1 ถูกเตรียมใช้งานในรายการอินพุตtZOUQQtZQ

หลังจากการปรับเปลี่ยนQในแบบนี้เราใช้ค่าปัจจุบันของ บริษัท ซึ่งXผลตอบแทนที่นำเข้าสูงสุดด้วย และใช้ตรรกะไม่คุ้มค่ากับeS !สิ่งนี้จะคืนค่าความจริงเป็นครั้งแรกเมื่อทุกองค์ประกอบของQถูกลดลง0หรือต่ำกว่าเป็นครั้งแรก

เพื่อให้แน่ใจว่าหมายเลขที่ส่งคืนจะเป็นจำนวนครั้งที่Qถูกแก้ไขเราจะเริ่มนับที่1ซึ่งบ่งบอกว่าครั้งแรกที่มีการโทรครั้งนี้มีการแก้ไข 1 ครั้ง เพื่อดูสิ่งที่Qดูเหมือนว่าหลังจากการทำซ้ำของรหัสแต่ละตรวจสอบรุ่นที่นี่


5

GolfScript ( 26 24 ไบต์) / CJam ( 20 18 ไบต์)

GolfScript:

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

การสาธิตออนไลน์

CJam (ความคิดเดียวกัน แต่มีการใช้งานที่แตกต่างกันเล็กน้อย):

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

การสาธิตออนไลน์

การป้อนข้อมูลที่อยู่บน stdin [2 2 3]ในรูปแบบ

นี้เป็นหนึ่งในโอกาสที่หายากเหล่านั้นที่ GolfScript ของแฉผู้ประกอบการจะเป็นประโยชน์ มันช่วยให้เราสามารถสะสมสถานะที่เรือแล่นผ่านและนับพวกมันในตอนท้าย โปรดทราบว่าอาร์เรย์ที่นับรวมถึงสถานะเริ่มต้น (อินพุต) แต่ไม่ใช่สถานะสุดท้ายที่องค์ประกอบสุดท้ายถูกลดเหลือ 0

อย่างไรก็ตามแม้ว่า CJam ไม่ได้แฉความสามารถในการสับเปลี่ยนอาร์เรย์สม่ำเสมอเพียง 2 ตัวอักษรนับเป็นจำนวนมากและช่วยให้มันออกมาด้านบน


3

Python 3, 91 71 ไบต์

บันทึก 20 (!) ไบต์ขอบคุณ @xnor

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

ฟังก์ชั่นวนซ้ำเรียกตัวเองด้วยค่าชิ้นเล็ก ๆ จนกระทั่งทุกค่าชิ้นเป็น 0 หรือลบและทุกฟังก์ชั่นส่งกลับค่าส่งคืนของเด็ก + 1 และสุดท้ายเรียกว่าหนึ่งส่งกลับ 1


คุณสามารถตรวจสอบว่ามีตัวเลขเป็นบวกด้วยmax(p)>0หรือไม่
xnor

และกวนสภาพเป็นmax(p)<1or-~f(p)ช่วยให้คุณหลีกเลี่ยงการตั้งแต่or 1 True==1
xnor

คุณมีประสิทธิภาพสามารถพร่ององค์ประกอบสุ่มด้วยp shuffle(p);p[0]-=1
xnor

@xnor ว้าวขอบคุณมาก! ทั้งหมดนี้ยอดเยี่ยมมาก!
randomra

1

Python 3, 175 ไบต์

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)

ไม่เล่นกอล์ฟได้ดีเป็นพิเศษ

ลองออนไลน์ได้ที่นี่


ความคิดเห็นทำลายตนเอง
ทิม
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.