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.



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 .


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.

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


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

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.


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>


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 .


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 .


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!


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".



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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.