Palindrome Ters Çevirme-Ekleme
Tersine Ekleme işlemi, oluşturulan sayı bir palindrom olana kadar bir sayının tersine eklendiği yerdir. Örneğin, 68 ile başlasak süreç şöyle olur:
68 + 86 => 154 + 451 => 605 + 506 => 1111
Gördüğünüz gibi, bu palindromik bir sayıya ulaşmak için 3 ek aldı. Eğer başlasaydık89
olsaydık, 24 adıma ihtiyacımız olurdu (buradaki dökümü görebilirsiniz ).
Bir palindroma ulaşılmadan önce atılan en fazla adım için dünya rekoru 261'dir ve sayı için meydana gelir ve 1186060307891929990
10 118'den büyük bir sayı üretir . Ancak, bir palindrom alamadığımız oldukça az sayı var. Bunlara denir Lychrel numaraları .
Temel 10'da çalıştığımız için onlara sadece aday diyebiliriz, çünkü bu sayıların asla bir palindrom'a ulaşmadığına dair bir kanıt yoktur. Örneğin, en küçük baz-10 Lychrel adayı 196'dır ve bir milyardan fazla yinelemeden geçti. Palindrom varsa, 10 10 8.77'den çok daha büyüktür . Karşılaştırma olarak, atomlara birçok 1s yazıldıysa , var olduğunu varsayarak yazmak için 2.26772 × 10 588843575 atom değerinde evrene ihtiyacımız olurdu .
Senin görevin
Bir tamsayı girişi alan ve bir palindrom'a ulaşmak için gereken adım sayısını döndüren veya basan bir program veya işlev oluşturun. Lychrel adaylarıyla başa çıkmanız gerekmeyecektir (yani, bir Lychrel adayı verildiğinde programınızın bir hata atmasına veya sonsuza kadar çalışmasına izin verilir).
Test Durumları:
f(0) => 0
f(11) => 0
f(89) => 24
f(286) => 23
f(196196871) => 45
f(1005499526) => 109
f(1186060307891929990) => 261
kurallar
Bonuslar
- Biçimlendirilmiş her ekleme adımını yazdırırsanız
n + rev(n) = m
, puanınızı 0,75 ile çarpabilirsiniz . Toplamlar adım sayısından önce yazdırılmalıdır. - Kodunuz bir sayının Lychrel adayı olup olmadığını tespit edebiliyorsa puanınızı 0,85 ile çarpabilirsiniz . Bu durumda, 261'den fazla yinelemeyi gerektiren herhangi bir şeyin bir Lychrel adayı olduğunu varsaymak yeterlidir. Ya hiçbir şey döndürmeyin, ya da doğru cevapla karıştırılabilecek bir sayı olmayan herhangi bir şey (vb: herhangi bir dize ya da 0-261 aralığında olmayan bir sayı). Herhangi bir hata geçerli çıkış olarak sayılmaz (örn. Maksimum tekrarlama derinliği aşılmıştır) ve algılamada kullanılamaz.
- Her iki ikramiyeyi de tamamlarsanız, 0,6 ile çarpın .
Bu kod golf , bu yüzden en az bayt sayısı kazanır.
Bu kod snippet'i, her iki bonus ile birlikte Python 3'te örnek bir çözüm gösterir.
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
ikramiye üstünde diğerleri? Yoksa sadece bu mu?
10 + 01 = 11
yoksa 10 + 1 = 11
bize mi kalmış?
262
?