us修斯的新船


9

These修斯是一个古老的问题,类似于:

如果一艘船的所有原始零件都已更换,那它还是同一艘船吗?

对于本次高尔夫,我们将逐步替换“船”上的“零件”,并查看获得一艘新船需要多长时间。

任务

一艘船至少由两部分组成。零件以正(非零)整数数组的形式给出,代表零件的状况。

在每个循环中,以统一的方式从列表中随机选择一个零件。该零件的状况将减少一。当零件的条件达到零时,将其替换为新零件。新零件以与原始零件相同的条件值开始。

在第一个周期中,所有部件(至少)被更换了一次(至少),停止并输出所花费的周期数。

例如(假设我在这里随机选择零件):

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,因为更换所有零件花费了八个周期。每次运行的确切输出应有所不同。

输入输出

唯一的输入是零件条件的整数列表/数组。唯一的输出是多个周期。您可以通过任何常用方式获取/提供这些值: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 2015年

@xnor嗯,得到答案并不重要,没有(而且跳过它似乎是要做的事情)。但从主题
上讲

Answers:


4

Pyth,12个字节

f!eSXOUQQtZ1

示范。

怎么运行的:

这基于Pyth的无限过滤器,该过滤器使用增加的输入来测试表达式,直到它返回真实值,然后返回导致这种情况发生的输入。但是,将要测试的表达式将不使用输入值。

相反,该表达式将通过减少随机条目来修改输入列表。这是通过表达式完成的XOUQQtZ。这意味着增加索引OUQ列表中QtZOUQ是长度为的随机索引QtZ为-1。Q被初始化为输入列表。

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字节

@xnor节省了20(!)个字节。

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 2015年

可以有效地减小的随机元素pshuffle(p);p[0]-=1
xnor 2015年

@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)

打高尔夫球不是特别好

在这里在线尝试


自我毁灭性评论
蒂姆
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.