昨晚在茶馆发了个猜猜乐: http://www.mcbbs.net/thread-594475-1-1.html
问题是这样的: execute @e ~ ~ ~ ... summon ArmorStand,这个指令在初始实体不同数目的时候出来的结果是什么,并要求给出原理
由于没人成功猜出来,所以我今天就来开估啦~
其实这条问题是很容易的,不过你需要明白execute及选择器的运作
execute的运作就是先选择一堆实体,然后由选择了的实体去执行命令
选择器在选择好了实体之后就不会改变(比如execute @e ~ ~ ~ summon ArmorStand,初始实体数为2,那就只会执行2次),所以第一个execute的数目是不会无限增加下去的
不过,后面嵌套的那些execute会根据执行时存在的实体去选择,所以那个执行次数会变大的很快(因此就不是2^嵌套数那么多个实体)
下面举个例子
(初始实体数为2)
复制代码
所以实体数会是8
然后execute @e ~ ~ ~ execute @e ~ ~ ~ execute @e ~ ~ ~ summon Armorstand,这条命令,初始实体数为2,执行完的数量会是多少呢?
其实能够透过以上的方法去计算出来的,然而人手算就挺麻烦,mc算的话就卡,所以我写了个脚本(python的)
复制代码
count就是实体数,depth就是execute的数量-1(就是需要嵌套的execute数量)
好了,可能昨天有很多人尝(zuo)试(si)去计算execute @e ~ ~ ~ execute @e ~ ~ ~ execute @e ~ ~ ~ execute @e ~ ~ ~ summon Armorstand,然后发现即使初始实体数为2,那个最后出来的实体数会大得惊人(还没算完就卡死了),为什么会如此呢?
从以上那个想法来看,我们可以把execute(2,3)简化为execute(execute(2,2),2)。(最外层的执行第一次可以省略,第二次就是把第一次的count拿过来当初始数值)
问题来了,execute(2,2)的输出是2048,所以execute(2,3)=execute(2048,2)
2048次貌似不多对吧,问题在于这还有嵌套...嵌套下去就是2048*(天文数字)的循环次数...
而这个数就是execute(2048,1)的数目:66185228434044942951864067458396061614989522267577311297802947435570493724401440549267868490798926773634494383968047143923956857140205406402740536087446083831052036848232439995904404992798007514718326043410570379830870463780085260619444417205199197123751210704970352727833755425876102776028267313405809429548880554782040765277562828362884238325465448520348307574943345990309941642666926723379729598185834735054732500415409883868361423159913770812218772711901772249553153402287759789517121744336755350465901655205184917370974202405586941211065395540765567663193297173367254230313612244182941999500402388195450053080383488
也就是说,execute(2048,2)里面循环执行的第二次,里面就需要执行66185228434044942951864067458396061614989522267577311297802947435570493724401440549267868490798926773634494383968047143923956857140205406402740536087446083831052036848232439995904404992798007514718326043410570379830870463780085260619444417205199197123751210704970352727833755425876102776028267313405809429548880554782040765277562828362884238325465448520348307574943345990309941642666926723379729598185834735054732500415409883868361423159913770812218772711901772249553153402287759789517121744336755350465901655205184917370974202405586941211065395540765567663193297173367254230313612244182941999500402388195450053080383488次循环...问题在于这个数字还会指数式的上涨,会上涨2047次...而且只是这循环我估计我的电脑也很难计算出来了...我选择狗带
因此,我们可以放弃计算最后那个给dalao的题目了(有数学dalao的话或许可以试试,起码我不会)
我们也能看到execute选择器挺特别的执行方式,也是挺一颗赛艇的
//最重要的是,我们得到了以很短的指令生成大量实体的方法(误)
来自群组: Command Block Logic
问题是这样的: execute @e ~ ~ ~ ... summon ArmorStand,这个指令在初始实体不同数目的时候出来的结果是什么,并要求给出原理
由于没人成功猜出来,所以我今天就来开估啦~
其实这条问题是很容易的,不过你需要明白execute及选择器的运作
execute的运作就是先选择一堆实体,然后由选择了的实体去执行命令
选择器在选择好了实体之后就不会改变(比如execute @e ~ ~ ~ summon ArmorStand,初始实体数为2,那就只会执行2次),所以第一个execute的数目是不会无限增加下去的
不过,后面嵌套的那些execute会根据执行时存在的实体去选择,所以那个执行次数会变大的很快(因此就不是2^嵌套数那么多个实体)
下面举个例子
(初始实体数为2)
- execute @e ~ ~ ~ execute @e ~ ~ ~ summon Armorstand
- execute @e ~ ~ ~
- [当前实体数为2]
- execute @e ~ ~ ~
- [当前实体数为2]
- summon Armorstand
- summon Armorstand
- execute @e ~ ~ ~
- [当前实体数为4]
- summon Armorstand
- summon Armorstand
- summon Armorstand
- summon Armorstand
所以实体数会是8
然后execute @e ~ ~ ~ execute @e ~ ~ ~ execute @e ~ ~ ~ summon Armorstand,这条命令,初始实体数为2,执行完的数量会是多少呢?
其实能够透过以上的方法去计算出来的,然而人手算就挺麻烦,mc算的话就卡,所以我写了个脚本(python的)
- def execute(count, depth):
- if (depth > 0):
- for i in range(count):
- count = execute(count, depth-1)
- return count
- else:
- return count * 2
count就是实体数,depth就是execute的数量-1(就是需要嵌套的execute数量)
好了,可能昨天有很多人尝(zuo)试(si)去计算execute @e ~ ~ ~ execute @e ~ ~ ~ execute @e ~ ~ ~ execute @e ~ ~ ~ summon Armorstand,然后发现即使初始实体数为2,那个最后出来的实体数会大得惊人(还没算完就卡死了),为什么会如此呢?
从以上那个想法来看,我们可以把execute(2,3)简化为execute(execute(2,2),2)。(最外层的执行第一次可以省略,第二次就是把第一次的count拿过来当初始数值)
问题来了,execute(2,2)的输出是2048,所以execute(2,3)=execute(2048,2)
2048次貌似不多对吧,问题在于这还有嵌套...嵌套下去就是2048*(天文数字)的循环次数...
而这个数就是execute(2048,1)的数目:66185228434044942951864067458396061614989522267577311297802947435570493724401440549267868490798926773634494383968047143923956857140205406402740536087446083831052036848232439995904404992798007514718326043410570379830870463780085260619444417205199197123751210704970352727833755425876102776028267313405809429548880554782040765277562828362884238325465448520348307574943345990309941642666926723379729598185834735054732500415409883868361423159913770812218772711901772249553153402287759789517121744336755350465901655205184917370974202405586941211065395540765567663193297173367254230313612244182941999500402388195450053080383488
也就是说,execute(2048,2)里面循环执行的第二次,里面就需要执行66185228434044942951864067458396061614989522267577311297802947435570493724401440549267868490798926773634494383968047143923956857140205406402740536087446083831052036848232439995904404992798007514718326043410570379830870463780085260619444417205199197123751210704970352727833755425876102776028267313405809429548880554782040765277562828362884238325465448520348307574943345990309941642666926723379729598185834735054732500415409883868361423159913770812218772711901772249553153402287759789517121744336755350465901655205184917370974202405586941211065395540765567663193297173367254230313612244182941999500402388195450053080383488次循环...问题在于这个数字还会指数式的上涨,会上涨2047次...而且只是这循环我估计我的电脑也很难计算出来了...我选择狗带
因此,我们可以放弃计算最后那个给dalao的题目了(有数学dalao的话或许可以试试,起码我不会)
我们也能看到execute选择器挺特别的执行方式,也是挺一颗赛艇的
//最重要的是,我们得到了以很短的指令生成大量实体的方法(误)
来自群组: Command Block Logic
几何倍数增长的魔性盔甲架(滑稽
说白的了就是2的n次方?= =||
然而我至今都没有去实验
后面一堆数字。
生动形象的告诉了我们这些不是一般人能看的懂的。
生动形象的告诉了我们这些不是一般人能看的懂的。
FHC红石 发表于 2016-6-23 20:07
这个故事告诉我们,学好数学很重要
说白的了就是2的n次方?= =||
然而我至今都没有去实验 ...
对,因为execute @e summon就是把实体数*2而已,问题只是是2的多少次方而已23333
看来那个次方数还是蛮大的
用TNT把,保证你够爽
的确是一个很简单的问题来着……(卡死电脑必备233)
卡死电脑新技能get√
要不是有上限的话我早就算出来了= =
再嵌套10~20次会怎样...
再配合循环性命令方块会怎样...
算了java虚拟机都不一定活的了
要不是有上限的话我早就算出来了= =
再嵌套10~20次会怎样...
再配合循环性命令方块会怎样...
算了java虚拟机都不一定活的了
cx62d 发表于 2016-6-24 23:15
卡死电脑新技能get√
要不是有上限的话我早就算出来了= =
再嵌套10~20次会怎样...
那个算不出来吧,那循环次数简直了...
卧槽有毒。。
这东西真他妈猜得出来才怪了=,=
这东西真他妈猜得出来才怪了=,=
pca006132 发表于 2016-6-24 23:27
那个算不出来吧,那循环次数简直了...
你忘了c语言的有上限啦!
于是unsigned为0,没有那个unsigned为一坨负数√
最后我能说什么呢= =
cx62d 发表于 2016-6-24 23:47
你忘了c语言的有上限啦!
于是unsigned为0,没有那个unsigned为一坨负数√
没bigint吗
exe让mc崩溃的最快方法 = = (手动滑稽)
感想楼主分享
本帖最后由 MODlover 于 2016-7-23 14:59 编辑
execute @e ~ ~ ~ execute @e ~ ~ ~ execute @e ~ ~ ~ execute @e ~ ~ ~ execute @e ~ ~ ~ execute @e ~ ~ ~ execute @e ~ ~ ~ execute @e ~ ~ ~ execute @e ~ ~ ~ execute @e ~ ~ ~ execute @e ~ ~ ~ execute @e ~ ~ ~ execute @e ~ ~ ~ execute @e ~ ~ ~ execute @e ~ ~ ~ execute @e ~ ~ ~ execute @e ~ ~ ~ summon Armorstand
放进CB里面执行
保证电脑卡爆要是我找到了能在服务器无权限执行指令的BUG,我一定会执行一次这个指令23333
execute @e ~ ~ ~ execute @e ~ ~ ~ execute @e ~ ~ ~ execute @e ~ ~ ~ execute @e ~ ~ ~ execute @e ~ ~ ~ execute @e ~ ~ ~ execute @e ~ ~ ~ execute @e ~ ~ ~ execute @e ~ ~ ~ execute @e ~ ~ ~ execute @e ~ ~ ~ execute @e ~ ~ ~ execute @e ~ ~ ~ execute @e ~ ~ ~ execute @e ~ ~ ~ execute @e ~ ~ ~ summon Armorstand
放进CB里面执行
保证电脑卡爆要是我找到了能在服务器无权限执行指令的BUG,我一定会执行一次这个指令23333
实际上不就是2的几次方么……我在制作计算电路的时候和写WinAPI常量的时候太常用到了=-=
不过还是支持
不过还是支持
langyo 发表于 2016-7-24 00:37
实际上不就是2的几次方么……我在制作计算电路的时候和写WinAPI常量的时候太常用到了=-=
不过还是支持 ...
这数字我尝试算出来的时候我电脑卡死了(我用的python,然而我相信如果是用c的话我电脑直接蓝屏了),这是2的几次方?这就算是次方数也已经是天文数字了好不好?而且我倒是想看看什么电路和WinAPI什么时候要那么大的数值了,还要经常用到
pca006132 发表于 2016-7-24 00:44
这数字我尝试算出来的时候我电脑卡死了(我用的python,然而我相信如果是用c的话我电脑直接蓝屏了),这是2 ...
先普及一下小知识:
内存地址等等均由二进制表示(虽然通常在写的时候为了不闪瞎人眼用十六进制给人看)
计算机运算中,通常所能运算的最大位数取决于其规定的系统位数,比如早期的8位、16位,分别就能运算28和216的数
WindowsAPI里,有很大一部分参数是靠常量来给一些特定选项的,比如MessageBox的YESNO,OK,OKCANCEL这些常量,实际上就是这个lang类型的4字节数每一位都看着加,有重复的就位与运算
天文数字?是,你算出来之后的确是天文数字,但是它能压缩成一个2n也没多少人吐槽,因为没有人关心它具体算出来之后数字是多少
我刚刚再看了你的猜谜贴,在只有一个armorstand和一个玩家的情况下,execute的实际次数是2exe指令个数+1-1,应该没错
毕竟家用电脑不适合作科学运算嘛……你算的时候卡死很正常,因为几年前我算的时候我的蓝屏了=-=……
还有什么吐槽尽管来
langyo 发表于 2016-7-24 00:58
先普及一下小知识:
内存地址等等均由二进制表示(虽然通常在写的时候为了不闪瞎人眼用十六进制给人看)
...
你说在WinAPI经常用到,然而哪儿需要用上那么大的常数呢?难道你所谓的经常用上是泛指一切2^n的数值吗?那我也是佩服了,这也是宽得很。如果你觉得那数字是那么简单2^4-1的话我也不用玩了,你能仔细看看那代码吗?
pca006132 发表于 2016-7-24 01:11
你说在WinAPI经常用到,然而哪儿需要用上那么大的常数呢?难道你所谓的经常用上是泛指一切2^n的数值吗? ...
我等会再算一次;但是,如果刚开始的实体个数不定呢?如果在中途突然又kill部分实体呢?后面该怎么算?公式怎么写?这纯粹就是2的n次方吗?
WinAPI每个提供常量的参数都是long类型,然后是4字节32位,也就是说我这个只有最大能用到232
虽然这也算是在互相交流,但是听你的语气不对啊,感觉很不和善,像要吃了我似得=-=
langyo 发表于 2016-7-24 01:11
我等会再算一次;但是,如果刚开始的实体个数不定呢?如果在中途突然又kill部分实体呢?后面该怎么算?公 ...
我优化后专门算4execute3初始实体,那数字要算2048步,第一步数字写出来已经超过long的限制太多了,之后还是次方的上去,所以不可能是那么小。然后我可以肯定的告诉你这是2的n次方*初始实体数,因为execute summon本身就是*2的运算。至于中途kill实体嘛...你别逗我好不好这是一条命令,你怎么中途kill?我的语气不好那是因为我觉得你的语气就是看不起这数字
pca006132 发表于 2016-7-24 01:23
我优化后专门算4execute3初始实体,那数字要算2048步,第一步数字写出来已经超过long的限制太多了,之后 ...
你认为我看不起这些数字?
那你告诉我,我哪句话说过我看不起这些数字了?
当然,execute summon的确是将实体数量x2,这个我能肯定;其它的我不都说了我等下去算=-=你急啥
pca006132 发表于 2016-7-24 00:44
这数字我尝试算出来的时候我电脑卡死了(我用的python,然而我相信如果是用c的话我电脑直接蓝屏了),这是2 ...
自己写套基于字符串的运算函数就可以算了
awpak78 发表于 2016-7-24 12:18
自己写套基于字符串的运算函数就可以算了
好吧,我彻底放弃,就算有gmplib可变精度库,运算量也比CPU速度高了好几个数量级……循环到死的节奏。
LZ是好人!!!
你那代码要怎么加载。。。
lrf8643 发表于 2017-1-19 16:00
@pca006132
我是不是搞错了什么东西。。。
encoding问题么...
感觉没有啥用,但是膜拜
本帖最后由 ruhuasiyu 于 2017-11-26 20:51 编辑
f_a(n)=f_{a-1}^n(n)
f_2(n)=2^n n, f_2(n)=8
f_3(n)=f_2(f_2(...(f_2(n))...)),f_3(n)=2^11=2048
f_4(n)=f_2(f_2(...(f_2(2-48)) 共嵌套2048次,所以大概和 2↑↑2048相当
所以a个execute n个实体的话应该和 2↑↑...↑↑n相当,一共a-1个箭头
a↑↑b表示b个a形成的指数塔
a↑↑↑b=a↑↑(a↑↑b)
a↑↑↑↑b=a↑↑↑(a↑↑↑b)
以此类推
f_a(n)=f_{a-1}^n(n)
f_2(n)=2^n n, f_2(n)=8
f_3(n)=f_2(f_2(...(f_2(n))...)),f_3(n)=2^11=2048
f_4(n)=f_2(f_2(...(f_2(2-48)) 共嵌套2048次,所以大概和 2↑↑2048相当
所以a个execute n个实体的话应该和 2↑↑...↑↑n相当,一共a-1个箭头
a↑↑b表示b个a形成的指数塔
a↑↑↑b=a↑↑(a↑↑b)
a↑↑↑↑b=a↑↑↑(a↑↑↑b)
以此类推
233333333333333333333
翻老帖,会被禁言么?
(x,1)的答案应该是2的x次方乘以x,
(x,2)的答案应该是(2的x次方乘以x,1)
所以那个题的答案应该是2的(2059+2的2059次方)的次方
(x,1)的答案应该是2的x次方乘以x,
(x,2)的答案应该是(2的x次方乘以x,1)
所以那个题的答案应该是2的(2059+2的2059次方)的次方
我刚刚在oeis.org上面搜索了一下。发现了这个数列(初始实体为2)a054874
兄弟加油期待好作品啊
呃呃呃呃呃呃有毒
兄弟加油期待好作品啊
兄弟加油期待好作品啊
兄弟加油期待好作品啊
兄弟加油期待好作品啊兄弟加油期待好作品啊
来挖坟了,我算出了最终结果,文本大小1.21m
ChenMoToMore 发表于 2020-3-19 18:18
来挖坟了,我算出了最终结果,文本大小1.21m
我q2232030028
这是……什么级别的fast-growing…
一旦递归起来速度就开始奇妙了
一旦递归起来速度就开始奇妙了
