在名为“探路者”的桌面RPG中,有一个名为“神圣几何”的角色可以拿来完成一项壮举,它允许一个拥有它的角色通过做一些数学运算来减少他们的法术:为了使用它,该角色在特定技能中滚动一些与他们的等级相等的六边骰子,根据他们的法术等级参考一张表格来确定哪三个素数是该法术级别的“素数”,然后计算是否有可能通过对所有数字执行加法、减法、乘法和除法组合来生成一个主常量。
按拼写级别列出的素常量表如下:
+-------------+-----------------+
| Spell Level | Prime Constants |
+-------------+-----------------+
| 1st | 3, 5, 7 |
| 2nd | 11, 13, 17 |
| 3rd | 19, 23, 29 |
| 4th | 31, 37, 41 |
| 5th | 43, 47, 53 |
| 6th | 59, 61, 67 |
| 7th | 71, 73, 79 |
| 8th | 83, 89, 97 |
| 9th | 101, 103, 107 |
+-------------+-----------------+因此,例如,如果一个角色有5个技能等级,并且正在施4级法术,他们将掷出5个六面骰子,并且需要能够计算出31、37或41的值。如果他们轧制一个6,6,4,3和1,那么他们可以产生一个37的值,通过执行下列计算:(6×6) +(4-3)×1= 37,或者通过做(6+6×3) +4+1= 41产生41。因此,他们施放的法术就会成功。
对于这个编程难题,您的工作是编写一个包含两个输入参数(拼写级别和技能等级)的函数,滚动一些与技能等级参数相等的六边骰子,然后计算是否可以生成(至少)与拼写级别参数相关的一个素常量,然后输出一个布尔值。
答案的排名主要取决于算法的效率(我敢肯定,随着技能等级参数的增加,蛮力算法会很快扩展),然后根据提交的源代码的大小(以字节为单位)。
发布于 2019-07-10 22:04:50
from itertools import*
from random import*
def f(s,r):
p=[];n=1;k=1;P=1;d=choices('123456',k=r);D=permutations(d,r);O=product('+-*/',repeat=r-1)
while-~s*3>n:p+=P%k*[k];n,k,P=n+P%k,k+1,P*k*k
return any(n in{eval('int(%s)'%'%s'.join(i)%o)for i in D for o in O}for n in p[-4:-1])技术上符合挑战的规格。只返回True/False,不公开所使用的骰子卷或调用者使用的表达式。
此外,该算法忽略分组,因为我们可以不使用排序来执行相同的操作。(例如,如果指数运算是可能的操作之一,则情况就不是这样。)
指数运行时,因为它生成所有的可能性,然后检查是否至少存在一个解决方案。
https://codegolf.stackexchange.com/questions/188171
复制相似问题