有两行数字,第1行是从0开始的连续数字,现在请您填写第2行,以确保第2行中的数字是第1行中出现的对应数字在第2行中出现的时间。
例如:0 1 2 3 4 5 6 7 8 9
_ _ _ _ _ _ _ _ _ _
更具体地说,我们在第1行中使用row1
,在第2行中使用row2
,我们填写row2
以确保其令人满意:row2[i] = count(row2, row1[i])
。 count(row2, row1[i])
表示row1[i]
中row2
的频率计数。
最佳答案
在1000次运行中,此解决方案必须平均运行3.608次
import random
def f(x):
l = []
for i in range(10):
l.append(x.count(i))
return l
fast = list(range(10))
while f(fast) != fast:
fast = []
slow = []
for i in range(10):
r = random.randint(0,9)
fast.append(r)
slow.append(r)
while True:
fast = f(f(fast))
slow = f(slow)
if fast == slow:
break
print(fast)
f(x)猜测x,然后返回计数。我们实质上是在寻找f(x)= x的解决方案。
我们首先从0-9中选择10个随机整数并列出。我们的目标是反复将此列表设置为与自身相等,直到找到解决方案或陷入循环。为了检查周期,我们使用了2种速度移动的“乌龟”和“头发”算法。快的速度是慢速的两倍。如果这些相等,则我们陷入一个循环,并从一个新的随机情况开始。
我经过了几次,找到n> 6的一般解决方案(在这种情况下,n = 10)。它的形式为[n-4,2,1,0 ...,0,1,0,0,0]