Всі ваші базові паліндромні належать нам


20

Створіть порядковий номер підстав, в яких nзнаходиться паліндром ( OEIS A126071) ).

В Зокрема, послідовність визначається наступним чином : дана число n, висловити її в базі aдля a = 1,2, ..., n, і підрахувати , скільки з цих виразів паліндромний. "Паліндромний" розуміється з точки зору повернення базових aцифр виразу у вигляді атомних одиниць (спасибі, @Martin Büttner ). Як приклад розглянемо n= 5:

  • a=1: вираз 11111: паліндромний
  • a=2: вираз 101: паліндромний
  • a=3: вираз 12: не паліндромний
  • a=4: вираз 11: паліндромний
  • a=5: вираз 10: не паліндромний

Тому результат n=5є 3. Зауважте, що OEIS використовує бази 2, ..., n+1замість 1, ..., n(спасибі, @beaker ). Це рівнозначно, оскільки вирази в основі 1і n+1завжди паліндромні.

Перші значення послідовності є

 1, 1, 2, 2, 3, 2, 3, 3, 3, 4, 2, 3, 3, 3, 4, 4, 4, 4, 2, 4, 5, ...

Вхідне значення - додатне ціле число n. Вихід першийn члени послідовності.

Програма теоретично повинна працювати (надаючи достатньо часу та пам'яті) для будь-яких nобмежень, спричинених типом даних за замовчуванням у будь-яких внутрішніх обчисленнях.

Усі дозволені функції Найменша кількість виграних байтів.



1
Якщо це комусь корисно, варто відзначити, що число n також завжди є паліндромним у базі n-1.
Computronium

Це A126071
Тіт

Відповіді:


9

Pyth, 13 байт

mlf_ITjLdSdSQ

Стислість цього здебільшого пояснюється Iнеоціненною командою " Invariant".

msf_ITjLdSdSQ       implicit: Q=input
m         d         map lambda d over
           SQ       Inclusive range 1 to Q
      jLdSd         Convert d to all the bases between 1 and d
  f                  filter lambda T:
   _IT                 is invariant under reverse
 l                  number that are invariant under reverse

Якщо Trueприйнятний вихід для 1,msm_IjdkSdSQ (12 байт) працює.

Спробуйте тут .


2
Дивіться пропозицію FryAmTheEggman,_I# а не використовувати f_IT(я не на 100% впевнений, що він був доступний, але, здається, був ).
Джонатан Аллан

7

Желе, 14 байт

bR‘$µ=UP€S
RÇ€

Спробуйте в Інтернеті!

Неконкурентна версія

У перекладача Jelly була помилка, яка зробила перетворення на одинарне неможливим. Це було виправлено зараз, тому наступний код ( 12 байтів ) також виконує завдання, яке існує.

bRµ=UP€S
RÇ€

Спробуйте в Інтернеті!

Як це працює

bR‘$µ=UP€S  Helper link. Argument: z

 R‘$        Apply range and increment, i.e., map z to [2, ..., z + 1].
            In the non-competing version R simply maps z to [1, ... z].
b           Convert z to each of the bases to the right.
    µ       Begin a new, monadic chain. Argument: base conversions
     =U     Compare the digits of each base with the reversed digits.
            = has depth 0, so [1,2,3]=[1,3,3] yields [1,0,1].
       P€   Take the product of the innermost arrays.
         S  Sum all resulting Booleans.


RÇ€         Main link. Argument: n

R           Yield [1, ..., n].
 ǀ         Apply the helper link to each.

4

MATL , 19 20 байт

:"0@XK:Q"K@:YAtP=A+

Використовується поточний випуск (10.1.0) , що є раніше, ніж цей виклик.

Спробуйте в Інтернеті !

Пояснення

:            % vector [1,2,...,N], where "N" is implicit input
"            % for each number in that vector
  0          % push 0
  @          % push number 1,2,...N corresponding to current iteration, say "n" 
  XK         % copy n to clipboard
  :Q         % vector [2,3,...,n+1]
  "          % for each number "m" in that vector
    K        % push n
    @:       % vector [1,2,...,m]
    YA       % express n in base m with symbols 1,2,...,m
    tP       % duplicate and permute
    =A       % 1 if all entries are equal (palindrome), 0 otherwise
    +        % add that number
             % implicitly close the two loops and display stack contents


1

Хаскелл, 88 байт

a!b|a<b=[a]|1>0=mod a b:(div a b)!b
f n=[1+sum[1|x<-[2..y],y!x==reverse(y!x)]|y<-[1..n]]

1

ES6, 149 байт

n=>[...Array(n)].map((_,i)=>[...Array(i)].reduce((c,_,j)=>c+(''+(a=q(i+1,j+2,[]))==''+a.reverse()),1),q=(n,b,d)=>n<b?[n,...d]:q(n/b|0,b,[n%b,...d]))

Працює і для баз> 36.


1

JavaScript (ES6), 105 95 байт

f=(n,b)=>b?b<2?1:f(n,b-1)+([...s=n.toString(b)].reverse().join``==s):n<2?[1]:[...f(n-1),f(n,n)]

Пояснення

Бере число від 1 до 36 (обмеження перетворення бази в JavaScript) і повертає масив послідовності.

Рекурсивна функція, яка перевіряє паліндроми при передачі бази, інакше повертає послідовність, якщо просто nпередано.

f=(n,b)=>

  // Base palindrome checking
  b?
    b<3?1:                 // return 1 for base-1, since toString(2)
    f(n,b-1)+(             // return the sum of all lower bases and check  this
      [...s=n.toString(b)] // s = n in base b
      .reverse().join``==s // add 1 if it is a palindrome
    )

  // Sequence generation
  :
    n<2?[1]:               // return 1 for the first value of the sequence
    [...f(n-1),f(n,n)]     // return the value for n after the previous values

Тест

var solution = f=(n,b)=>b?b<2?1:f(n,b-1)+([...s=n.toString(b)].reverse().join``==s):n<2?[1]:[...f(n-1),f(n,n)]
<input type="number" oninput="result.textContent=solution(+this.value)" />
<pre id="result"></pre>


Чи є спосіб перетворити це на рекурсивну функцію? Я відчуваю, що це могло б зберегти кілька байт.
Mama Fun Roll

@ ՊՓԼՃՐՊՃՈԲՍԼ Ти маєш рацію. Дякую за пораду.
користувач81655




1

Python 2, 97 байт

c=1;n=int(input())
for b in range(2,n):
	a=[];z=n
	while z:a+=[z%b];z//=b
	c+=a[::-1]==a
print c

Мій перший пост Python, власне, перший мій код Python
мабуть, має певний потенціал для гольфу.

Спробуйте в Інтернеті!


1

> <>, 197 + 2 байти

+2 для прапора -v

:1+0v    ;n\
1\  \$:@2(?/
:<~$/?)}:{:*}}@:{{
\   \~0${:}
>$:@1(?\::4[:&r&r]:$&@@&%:&@&$@-$,5[1+{]$~{{:@}}$@,$
~~1 \  \
?\~0>$:@2(?\$1-:@3+[}]4[}1-]=
 \  /@@r/!?/
r@+1/)0:<
  /?/$-1$~<
~$/       \-1

tio.run, схоже, не повертає жодного результату для n> 1, але ви можете перевірити це на https://fishlanguage.com . Введення йде у вікні "Початковий стек".



1

Python 2 , 85 байт

def f(a):b,c=2,0;exec'd,m=[],a\nwhile m:d+=[m%b];m/=b\nc+=d[::-1]==d;b+=1;'*a;print c

Спробуйте в Інтернеті!

Очікує ціле число в якості аргументу.

Пояснення:

# named function
def f(a):
    # initialize variable to track base (b) and to track palindromes (c)
    b,c=2,0
        # construct code
        '
        # initialize variable to store remainders (m) and to track divisor (d)
        m,d=[],a
        # while d is not zero,
        # add the current remainder to the array
        # and divide d by the base and assign the result back to d
        while d:m+=[m%b];d/=b
        # False == 0 and True == 1, so add 1 to total if m == reversed(m)
        c+=m[::-1]==m;
        # increment base
        # terminate with ; so that next statement can be executed separately
        b+=1;
        '
    # execute constructed statement (a) times
    exec'....................................................'*a
    # print result
    print c
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.