有两行数字,第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]

10-06 05:51