OFFSET
1,3
COMMENTS
No integer > 1 ending in zero will appear in the sequence.
For n >= 10 the concatenation of a(n) and A217657(a(n+1)) is a palindrome.
LINKS
Michael S. Branicky, Table of n, a(n) for n = 1..10000
FORMULA
For n >= 92, a(n) = 10*a(n-81) + 90 - 9*(a(n-81) mod 10). - David A. Corneth, Oct 04 2023
EXAMPLE
a(9) = 8 replacing the first digit of a(10) = 9 forms 8, a palindrome;
a(10) = 9 replacing the first digit of a(11) = 19 forms 99, a palindrome;
a(11) = 19 replacing the first digit of a(12) = 11 forms 191, a palindrome;
a(12) = 11 replacing the first digit of a(13) = 21 forms 111, a palindrome;
a(13) = 21 replacing the first digit of a(14) = 12 forms 212, a palindrome; etc.
MATHEMATICA
terms=75; b[0]=0;
b[n_]:=b[n]=(k=1; While[MemberQ[Array[b, n-1], k]||!PalindromeQ[FromDigits@Flatten@ReplacePart[IntegerDigits@k, 1-> IntegerDigits@b[n-1]]], k++]; k); t=0; While[Length[a=Join[Range[0, 9], Flatten@Table[FromDigits@Flatten@Insert[#, Table[9, i], -2]&/@(IntegerDigits/@Array[b, 9^2, 10]), {i, 0, t++}]]]<terms]; a[[;; terms]] (* Giorgos Kalogeropoulos, Oct 04 2023 *)
PROG
(Python)
from itertools import count, islice
def ispal(n): return (s:=str(n))==s[::-1]
def agen(): # generator of terms
an, seen = 0, set()
while True:
yield an; seen.add(an); s = str(an)
an = next(k for k in count(0) if k not in seen and ispal(s+str(k)[1:]))
print(list(islice(agen(), 80))) # Michael S. Branicky, Oct 04 2023
(Python) # faster version suitable for generating b-file
from sympy import isprime
from itertools import count, islice, product
def pals(digs):
yield from digs
for d in count(2):
for p in product(digs, repeat=d//2):
left = "".join(p)
for mid in [[""], digs][d%2]:
yield left + mid + left[::-1]
def folds(s): # generator of suffixes of palindromes starting with s
for i in range((len(s)+1)//2, len(s)+1):
for mid in [True, False]:
t = s[:i] + (s[:i-1][::-1] if mid else s[:i][::-1])
if t.startswith(s):
yield t[len(s):]
yield from ("".join(p)+s[::-1] for p in pals("0123456789"))
def agen():
s, seen = "0", {"0"}
while True:
yield int(s)
found = False
for end in folds(s):
for start in "123456789":
t = start + end
if t not in seen:
found = True; break
if found: break
s, seen = t, seen | {t}
print(list(islice(agen(), 60))) # Michael S. Branicky, Oct 04 2023
CROSSREFS
KEYWORD
base,nonn
AUTHOR
Eric Angelini, Oct 03 2023
STATUS
approved