纯粹的邪恶:评估
a=lambda x,y:(y<0)*x or eval("a("*9**9**9+"x**.1"+",y-1)"*9**9**9)
print a(input(),9**9**9**9**9)//1
eval内的语句创建了一个长度为7 * 10 10 10 10 10 10 8.57的字符串,该字符串仅包含对lambda函数的调用,每个调用都会构造一个类似长度的字符串,并不断增加直到最终y
变为0。这与下面的Eschew方法具有相同的复杂性,但是它并不依赖于if-or-或控制逻辑,而是将巨型字符串粉碎在一起(最终结果是……可能会得到更多的堆栈?)。
最大y
我可以提供值和计算,而不的Python引发错误是2,它是已经足以降低最大浮子的输入到返回1。
长度7,625,597,484,987的字符串就是太大了:OverflowError: cannot fit 'long' into an index-sized integer
。
我该走了
Eschew Math.log
:转到(问题的)(第10个)根,得分:函数实际上与y = 1不可区分。
导入数学库会限制字节数。让我们消除它,并用log(x)
大致等效的东西替换该函数:x**.1
并且它花费大约相同数量的字符,但是不需要导入。这两个函数都具有相对于输入的亚线性输出,但是x 0.1的增长甚至更慢。但是,我们并不十分在乎,我们只关心它相对于大量数字具有相同的基本增长模式,同时消耗相当数量的字符(例如x**.9
,相同数量的字符,但是增长更快,因此是可以表现出完全相同增长的一些价值)。
现在,如何处理16个字符。如何...扩展我们的lambda函数以具有Ackermann序列属性?大量的答案启发了该解决方案。
a=lambda x,y,z:(z<0)*x or y and a(x**.1,z**z,z-1)or a(x**.1,y-1,z)
print a(input(),9,9**9**9**99)//1
在z**z
此部分使我从任何地方运行该功能关闭,以进行理智的投入y
和z
最大价值,我可以使用9个和3为此,我回到1.0的价值,即使是最大的浮法Python支持(注:虽然1.0在数值上大于6.77538853089e-05,递归级别的增加将使该函数的输出接近1,而保持大于1,而先前的函数将值向0移近而又保持大于0,因此该函数的递归均匀导致操作太多,以至于浮点数会丢失所有有效位。
重新配置原始的lambda调用以使其递归值为0和2 ...
>>>1.7976931348623157e+308
1.0000000071
如果比较“从0开始偏移”而不是“从1开始偏移”,则此函数返回7.1e-9
,它肯定小于6.7e-05
。
实际程序的基本递归(z值)深10 10 10 10 1.97级,一旦y耗尽,它就会用10 10 10 10 10 1.97复位(这就是为什么初始值9足够的原因),所以我不知道甚至不知道如何正确计算发生的递归总数:我已经达到数学知识的极限。同样,我不知道将**n
幂运算之一从初始输入移到辅助输入z**z
是否会提高递归次数(同上)。
让我们走得更慢,递归更多
import math
a=lambda x,y:(y<0)*x or a(a(a(math.log(x+1),y-1),y-1),y-1)
print a(input(),9**9**9e9)//1
n//1
-保存2个字节以上 int(n)
import math
,math.
节省1个字节from math import*
a(...)
总共节省8个字节 m(m,...)
(y>0)*x
节省了字节以上y>0and x
9**9**99
增加大约4和增加递归深度字节计数2.8 * 10^x
,其中x
是旧深度(:10或深度尺寸接近一个古戈尔普勒克斯10 94)。
9**9**9e9
将字节数增加5,并将递归深度增加...疯狂的数量。现在递归深度为10 10 10 9.93,作为参考,googolplex为10 10 10 2。
- lambda声明通过一个额外的步骤
m(m(...))
来增加递归:a(a(a(...)))
花费7个字节
新的输出值(递归深度为9时):
>>>1.7976931348623157e+308
6.77538853089e-05
递归深度已经膨胀到这个结果在字面上毫无意义的地步,除了与使用相同输入值的早期结果相比:
- 原来叫
log
25次
- 第一次改进称为81次
- 在实际的程序会调用它1e99 2或约10 10 2.3倍
- 这个版本叫它729次
- 的实际程序会称之为(9 9 99)3或略小于10 10 95倍)。
Lambda盗梦空间,得分:???
我听说你喜欢lambda,所以...
from math import*
a=lambda m,x,y:y<0and x or m(m,m(m,log(x+1),y-1),y-1)
print int(a(a,input(),1e99))
我什至不能运行它,即使只有99层递归,我也会堆栈溢出。
返回下面的旧方法(将转换跳过为整数):
>>>1.7976931348623157e+308
0.0909072713593
新方法返回,仅使用9层入侵(而不是其中的全部googol):
>>>1.7976931348623157e+308
0.00196323936205
我认为这与Ackerman序列具有相似的复杂性,只是很小而不是很大。
还要感谢ETHproduction节省了3字节的空间,但我没有意识到可以将其删除。
旧答案:
函数log(i + 1)的整数截断使用lambda的lambda 迭代20 25次(Python)。
可以通过引入第二个lambda并将其堆叠来压缩PyRulez的答案:
from math import *
x=lambda i:log(i+1)
y=lambda i:x(x(x(x(x(i)))))
print int(y(y(y(y(y(input()))))))
使用了99100个字符。
这将在原始12上产生20 25 的迭代。此外,通过使用int()
来节省2个字符,而不是使用floor()
它来允许额外的x()
堆栈。如果可以删除lambda之后的空格(目前无法检查),则y()
可以添加第5个空格。可能!
如果有一种方法可以from math
使用完全限定的名称来跳过导入(例如x=lambda i: math.log(i+1))
),那么这将节省更多的字符并允许另外一堆字符,x()
但我不知道Python是否支持此类(我怀疑不是)。做完了!
这本质上是XCKD大量博客文章中使用的技巧,但是声明lambda的开销排除了第三个堆栈:
from math import *
x=lambda i:log(i+1)
y=lambda i:x(x(x(i)))
z=lambda i:y(y(y(i)))
print int(z(z(z(input()))))
这是3个lambda超过计算的2个lambda的堆栈高度时可能的最小递归(将任何lambda减小为两个调用,将堆栈高度降低到18个,低于2-lambda版本的堆栈高度),但不幸的是需要110个字符。