パリンドローム逆転加算
反転加算のプロセスでは、作成された数字が回文になるまで、その逆に数字が追加されます。たとえば、68から始める場合、プロセスは次のようになります。
68 + 86 => 154 + 451 => 605 + 506 => 1111
ご覧のとおり、これには回文数を得るために3つの追加が必要でした。で開始する場合は89
、24の手順が必要になります(詳細はこちらで確認できます)。
回文に到達する前にとられたほとんどのステップの世界記録は261であり、これ1186060307891929990
は10 118よりも大きい数を生み出します。しかし、パリンドロームを取得することができなかった数がかなりありました。これらはLychrel番号と呼ばれます。
私たちはベース10で作業しているので、これらの数字が回文に決して到達しないという証拠が存在しないため、実際には候補と呼ぶことができるだけです。たとえば、10を基数とする最小のLychrel候補は196であり、10億回をはるかに超える反復を経験しています。回文が存在する場合、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
ますか?