Toda tu base palindrómica nos pertenece

20

Genere el número den secuencia de bases en el que se encuentra un palíndromo ( OEIS A126071 ).

Específicamente, la secuencia se define de la siguiente manera: dado un número n, expresarlo en base apara a = 1,2, ..., ny contar cuántas de esas expresiones son palindrómicas. "Palindrómico" se entiende en términos de invertir los adígitos de base de la expresión como unidades atómicas (gracias, @Martin Büttner ). Como ejemplo, considere n= 5:

  • a=1: la expresión es 11111: palindrómica
  • a=2: la expresión es 101: palindrómica
  • a=3: la expresión es 12: no palindrómica
  • a=4: la expresión es 11: palindrómica
  • a=5: la expresión es 10: no palindrómica

Por lo tanto, el resultado para n=5es 3. Tenga en cuenta que OEIS usa bases en 2, ..., n+1lugar de 1, ..., n(gracias, @beaker ). Es equivalente, porque las expresiones en base 1y n+1siempre son palindrómicas.

Los primeros valores de la secuencia son

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

La entrada es un entero positivo n. La salida es los primeros ntérminos de la secuencia.

El programa debería funcionar teóricamente (con suficiente tiempo y memoria) para nlas limitaciones causadas por su tipo de datos predeterminado en cualquier cálculo interno.

Todas las funciones permitidas. El menor número de bytes gana.

Luis Mendo
fuente
Relacionado
Luis Mendo
1
Si es útil para alguien, vale la pena señalar que un número n también es siempre palindrómico en la base n-1.
Computronium
Esto es A126071
Tito el

Respuestas:

9

Pyth, 13 bytes

mlf_ITjLdSdSQ

La brevedad de esto se debe principalmente al valioso comando I" Invariante".

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

Si Truees una salida aceptable para 1, msm_IjdkSdSQ(12 bytes) funciona.

Pruébalo aquí .

lirtosiast
fuente
2
Vea la sugerencia de FryAmTheEggman de usar en _I#lugar de f_IT(no estoy 100% seguro de que estuviera disponible, pero parece que lo ha estado ).
Jonathan Allan
7

Jalea, 14 bytes

bR‘$µ=UP€S
RÇ€

Pruébalo en línea!

Versión no competitiva

El intérprete de Jelly tenía un error que hacía imposible la conversión a unario. Esto se ha solucionado ahora, por lo que el siguiente código ( 12 bytes ) también realiza la tarea en cuestión.

bRµ=UP€S
RÇ€

Pruébalo en línea!

Cómo funciona

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.
Dennis
fuente
4

MATL , 19 20 bytes

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

Utiliza la versión actual (10.1.0) , que es anterior a este desafío.

Pruébalo en línea !

Explicación

:            % 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
Luis Mendo
fuente
1

Haskell, 88 bytes

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]]
Damien
fuente
1

ES6, 149 bytes

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]))

Funciona para bases> 36 también.

Neil
fuente
1

JavaScript (ES6), 105 95 bytes

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)]

Explicación

Toma un número del 1 al 36 (la limitación de la conversión de base en JavaScript) y devuelve una matriz de la secuencia.

Función recursiva que busca palíndromos cuando se pasa una base, de lo contrario, devuelve la secuencia si solo nse pasa.

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

Prueba

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>

usuario81655
fuente
¿Hay alguna manera de convertir eso en una función recursiva? Siento que eso podría ahorrar algunos bytes.
Mama Fun Roll
@ ՊՓԼՃՐՊՃՈԲՍԼ Tienes razón. Gracias por el consejo.
user81655
1

PHP, 73 + 1 bytes

while(++$i<$argn)$c+=strrev($n=base_convert($argn,10,$i+1))==$n;echo$c+1;

trabaja para bases 1a 36. Ejecutar como tubería -nRo probarlo en línea .

Titus
fuente
1

PHP, 92 + 1 bytes:

for($b=$c=1;$b++<$n=$argn;$c+=$a==array_reverse($a))for($a=[];~~$n;$n/=$b)$a[]=$n%$b;echo$c;

Funciona para todas las bases. Ejecutar como tubería -nRo probarlo en línea .

Titus
fuente
1

Python 2, 97 bytes

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

Mi primera publicación de Python, en realidad mi primer código de Python
probablemente tenga algún potencial de golf.

Pruébalo en línea!

Titus
fuente
1

> <>, 197 + 2 bytes

+2 para la bandera -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 no parece devolver ningún resultado para n> 1, pero puede verificarlo en https://fishlanguage.com . La entrada va en el cuadro "Pila inicial".

Sasha
fuente
1

Japt , 10 bytes

õ_õ!ìZ èêS

Intentalo


Explicación

õ              :Range [1,input]
 _             :Map each Z
  õ            :  Range [1,Z] (let's call each X)
   !ìZ         :   Convert Z to a base X digit array
       è       :  Count
        êS     :   Palindromes
Lanudo
fuente
1
õ_õ jajaja bonito emoji
Luis felipe De jesus Munoz
1

Python 2 , 85 bytes

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

Pruébalo en línea!

Espera un entero como argumento.

Explicación:

# 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
Triggernometry
fuente