回文逆转加法
反向加法的过程是向其反向添加数字,直到创建的数字是回文。例如,如果我们从68开始,则过程将是:
68 + 86 => 154 + 451 => 605 + 506 => 1111
如您所见,这花了3次加法才得到回文数。如果从开始89
,我们将需要24个步骤(您可以在此处查看细分)。
达到回文记录之前所采取的大多数步骤的世界纪录是261,该数字最高发生1186060307891929990
,产生的数字大于10 118。但是,有很多数字我们还无法得到回文。这些称为Lychrel数。
由于我们的工作基础是10,因此我们只能称他们为候选人,因为没有证据表明这些数字永远不会达到回文率。例如,最小的以10为底的Lychrel候选对象是196,并且已经经历了十亿多次迭代。如果回文确实存在,则比10 10 8.77大得多。作为比较,如果原子上刻有多个1 ,则假设存在,我们将需要2.26772×10 588843575个宇宙原子来写出。
你的任务
创建一个程序或函数,该程序或函数接受整数输入并返回或打印到达回文所需的步骤数。您无需与Lychrel候选者打交道(即,当您的程序被赋予Lychrel候选者时,将允许其抛出错误或永久运行)。
测试用例:
f(0) => 0
f(11) => 0
f(89) => 24
f(286) => 23
f(196196871) => 45
f(1005499526) => 109
f(1186060307891929990) => 261
规则
奖金
- 如果按格式打印每个加法步骤,则
n + rev(n) = m
可以将分数乘以0.75。总数应在步数之前打印出来。 - 如果您的代码可以检测到数字是否为Lychrel候选者,则可以将分数乘以0.85。在这种情况下,假设需要花费超过261次迭代的任何事物都是Lychrel候选者。要么不返回任何内容,要么不返回任何可能被误解为正确答案的数字(例如:任何字符串或不在0-261范围内的数字)。任何错误均不算作有效输出(例如,超过最大递归深度),因此不能在检测中使用。
- 如果您同时获得这两个奖金,请乘以0.6。
这是code-golf,因此最少的字节数获胜。
此代码段显示了在Python 3中具有两个优点的示例解决方案。
def do(n,c=0,s=''):
m = str(n)
o = m[::-1]
if c > 261:
return "Lychrel candidate"
if m == o:
print(s)
return c
else:
d = int(m)+int(o)
s+="%s + %s = %s"%(m,o,str(d))
return do(d,c+1,s)
*0.6
奖金之上的其他人呢?还是仅此而已?
10 + 01 = 11
还是10 + 1 = 11
由我们决定?
262
吗?