Toute votre base palindromique nous appartient

20

Générez le numéro den séquence des bases dans lesquelles se trouve un palindrome ( OEIS A126071 ).

Plus précisément, la séquence est définie comme suit: étant donné un nombre n, exprimez-le en base apour a = 1,2, ..., n, et comptez combien de ces expressions sont palindromiques. «Palindromique» est compris en termes d'inversion des achiffres de base de l'expression en unités atomiques (merci, @Martin Büttner ). À titre d'exemple, considérons n= 5:

  • a=1: l'expression est 11111: palindromique
  • a=2: l'expression est 101: palindromique
  • a=3: l'expression est 12: non palindromique
  • a=4: l'expression est 11: palindromique
  • a=5: l'expression est 10: non palindromique

Par conséquent, le résultat pour n=5est 3. Notez que OEIS utilise des bases 2, ..., n+1au lieu de 1, ..., n(merci, @beaker ). C'est équivalent, car les expressions en base 1et n+1sont toujours palindromiques.

Les premières valeurs de la séquence sont

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

L'entrée est un entier positif n. La sortie est les premiers ntermes de la séquence.

Le programme devrait théoriquement fonctionner (avec suffisamment de temps et de mémoire) pour toutes nles limitations causées par votre type de données par défaut dans tous les calculs internes.

Toutes les fonctions sont autorisées. Le plus petit nombre d'octets gagne.

Luis Mendo
la source
En relation
Luis Mendo
1
Si cela peut être utile à quiconque, il convient de noter qu'un nombre n est également toujours palindromique dans la base n-1.
Computronium
Ceci est A126071
Titus

Réponses:

9

Pyth, 13 octets

mlf_ITjLdSdSQ

La brièveté de ceci est principalement due à la Icommande " 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

Si Trueest une sortie acceptable pour 1, msm_IjdkSdSQ(12 octets) fonctionne.

Essayez-le ici .

lirtosiast
la source
2
Voir la suggestion de FryAmTheEggman d'utiliser _I#plutôt que f_IT(je ne suis pas sûr à 100% qu'il était disponible, mais il semble l'avoir été ).
Jonathan Allan
7

Gelée, 14 octets

bR‘$µ=UP€S
RÇ€

Essayez-le en ligne!

Version non concurrente

L'interprète Jelly avait un bug qui rendait impossible la conversion en unaire. Cela a été corrigé maintenant, donc le code suivant ( 12 octets ) accomplit également la tâche à accomplir.

bRµ=UP€S
RÇ€

Essayez-le en ligne!

Comment ça fonctionne

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
la source
4

MATL , 19 20 octets

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

Utilise la version actuelle (10.1.0) , antérieure à ce défi.

Essayez-le en ligne !

Explication

:            % 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
la source
2

CJam, 20 octets

ri{)_,f{)b_W%=}1bp}/

Testez-le ici.

Martin Ender
la source
1

Haskell, 88 octets

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
la source
1

ES6, 149 octets

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

Fonctionne également pour les bases> 36.

Neil
la source
1

JavaScript (ES6), 105 95 octets

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

Explication

Prend un nombre de 1 à 36 (limitation de la conversion de base en JavaScript) et renvoie un tableau de la séquence.

Fonction récursive qui vérifie les palindromes lorsqu'une base est passée, sinon renvoie la séquence si juste nest passé.

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

Tester

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>

user81655
la source
Existe-t-il un moyen de transformer cela en une fonction récursive? Je pense que cela pourrait économiser quelques octets.
Mama Fun Roll
@ ՊՓԼՃՐՊՃՈԲՍԼ Tu as raison. Merci pour le conseil.
user81655
1

PHP, 73 + 1 octets

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

Travaux de bases 1à 36. Exécuter en tant que pipe avec -nRou l' essayer en ligne .

Titus
la source
1

PHP, 92 + 1 octets:

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

fonctionne pour toutes les bases. Exécuter en tant que pipe avec -nRou l' essayer en ligne .

Titus
la source
1

Python 2, 97 octets

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

Mon premier article sur Python, en fait mon premier code Python
a probablement un certain potentiel de golf.

Essayez-le en ligne!

Titus
la source
1

> <>, 197 + 2 octets

+2 pour le drapeau -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 ne semble pas retourner de sortie pour n> 1, mais vous pouvez le vérifier sur https://fishlanguage.com . L'entrée va dans la case "Pile initiale".

Sasha
la source
1

Japt , 10 octets

õ_õ!ìZ èêS

Essayez-le


Explication

õ              :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
Hirsute
la source
1
õ_õ hahaha nice emoji
Luis felipe De jesus Munoz
1

Python 2 , 85 octets

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

Essayez-le en ligne!

Attend un entier comme argument.

Explication:

# 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
Triggernométrie
la source