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


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.
КОМПЬЮТРОНИУМ

Это 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

Haskell, 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

@ ՊՓԼՃՐՊՃՈԲՍԼ Ты прав. Спасибо за чаевые.
user81655




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.