Python最少线挑战(HOTPO/Collatz)

Python最少线挑战(HOTPO/Collatz),python,Python,另一种称为半或三加一(HOTPO)的方法,以任意正整数n开始 如果n是偶数,则将其除以2。如果n为奇数,则将其乘以3并加1。这个猜想是,不管你从什么数字开始,它总是会达到1 挑战在于编写一个程序,输出n的所有值以及所采取的步骤数。例如,当n=3时,输出应为: 3 10 5 16 8 4 2 1 Finished. 7 steps required. 我的最佳尝试需要6行代码: x = [3] while x[-1] != 1: if x[-1] % 2 == 1: x.append(3

另一种称为半或三加一(HOTPO)的方法,以任意正整数n开始

如果n是偶数,则将其除以2。如果n为奇数,则将其乘以3并加1。这个猜想是,不管你从什么数字开始,它总是会达到1

挑战在于编写一个程序,输出n的所有值以及所采取的步骤数。例如,当n=3时,输出应为:

3
10
5
16
8
4
2
1
Finished. 7 steps required.
我的最佳尝试需要6行代码:

x = [3]
while x[-1] != 1:
    if x[-1] % 2 == 1: x.append(3*x[-1]+1)
    x.append(x[-1]/2)
for num in x: print num
print "Finished. " + str(len(x)-1) + " steps needed."

对于任何合理大小的n,生成此输出所需的最小行数是多少?我的代码可以进一步减少吗?

利用lambda函数进行一些改进:

x=[3]
while x[-1] != 1:
    x.append((lambda n: n%2==0 and n/2 or 3*n+1)(x[-1]))
    print(x[-1])
print "Finished. " + str(len(x)-1) + " steps needed."
我只是把更多的代码放在一行中,现在只有一个循环而不是两个,打印和计算可以在同一个循环中完成

或者,因为它用于最少的行数,所以您可以使用两个单线循环,并将其分为三行:

x=[3]
while x[-1]!=1: x=(lambda y: y+[(lambda n: n%2==0 and n/2 or 3*n+1)(x[-1])])(x)
print("\n".join([str(y) for y in x])+"\nFinished. {} steps required.".format(len(x)-1))

最后一句话要感谢Pythonista:)

我不认为缩短长度本身就是一个目标。这两个目标应该是:高效和可读。这个问题可能更适合codegolf.stackexchange.com这里有一个指向python中collatz golf解决方案的链接:谢谢@OmniptentEntity,我将在下次做一个记录!令人惊叹的!我甚至没想到。然而,正如前面提到的@Omnipotentity一样,codegolf上有一个单线解决方案: