Tutta la tua base palindromica appartiene a noi


20

Generare il numero nprogressivo di basi in cui è un palindromo ( OEIS A126071 ).

In particolare, la sequenza è definita come segue: dato un numero n, esprimilo in base aper a = 1,2, ..., ne conta quante di quelle espressioni sono palindromiche. "Palindromico" è inteso in termini di inversione delle acifre di base dell'espressione come unità atomiche (grazie, @Martin Büttner ). Ad esempio, considera n= 5:

  • a=1: l'espressione è 11111: palindromica
  • a=2: l'espressione è 101: palindromica
  • a=3: l'espressione è 12: non palindromica
  • a=4: l'espressione è 11: palindromica
  • a=5: l'espressione è 10: non palindromica

Pertanto il risultato n=5è 3. Si noti che OEIS utilizza le basi 2, ..., n+1anziché 1, ..., n(grazie, @beaker ). È equivalente, perché le espressioni in base 1e n+1sono sempre palindromiche.

I primi valori della sequenza sono

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

L'input è un numero intero positivo n . L'output è i primi ntermini della sequenza.

Il programma dovrebbe teoricamente funzionare (dato abbastanza tempo e memoria) per qualsiasi n limitazioni causate dal tipo di dati predefinito in qualsiasi calcolo interno.

Sono ammesse tutte le funzioni. Vince il numero più basso di byte.



1
Se è utile a qualcuno, vale la pena notare che un numero n è anche sempre palindromico nella base n-1.
Computronio

Questo è A126071
Tito

Risposte:


9

Pyth, 13 byte

mlf_ITjLdSdSQ

La brevità di ciò è dovuta principalmente al prezioso 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

Se Trueè un output accettabile per 1, msm_IjdkSdSQ(12 byte) funziona.

Provalo qui .


2
Vedi il suggerimento di FryAmTheEggman da usare _I#piuttosto che f_IT(non sono sicuro al 100% che fosse disponibile, ma sembra che lo sia stato ).
Jonathan Allan,

7

Gelatina, 14 byte

bR‘$µ=UP€S
RÇ€

Provalo online!

Versione non competitiva

L'interprete Jelly aveva un bug che rendeva impossibile la conversione in unario. Questo problema è stato risolto ora, quindi anche il seguente codice ( 12 byte ) esegue l'attività a portata di mano.

bRµ=UP€S
RÇ€

Provalo online!

Come funziona

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 byte

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

Utilizza la versione corrente (10.1.0) , precedente a questa sfida.

Provalo online !

Spiegazione

:            % 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 byte

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 byte

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

Funziona anche con basi> 36.


1

JavaScript (ES6), 105 95 byte

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

Spiegazione

Prende un numero compreso tra 1 e 36 (il limite della conversione di base in JavaScript) e restituisce un array della sequenza.

Funzione ricorsiva che verifica la presenza di palindromi quando viene passata una base, altrimenti restituisce la sequenza se nviene appena passata.

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

Test

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>


C'è un modo per trasformarlo in una funzione ricorsiva? Sento che potrebbe salvare alcuni byte.
Mama Fun Roll

@ ՊՓԼՃՐՊՃՈԲՍԼ Hai ragione. Grazie per il consiglio.
user81655


1

PHP, 73 + 1 byte

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

funziona per basi 1a 36. Esegui come pipe -nRo provalo online .


1

PHP, 92 + 1 byte:

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

funziona per tutte le basi. Esegui come pipe -nRo provalo online .


1

Python 2, 97 byte

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

Il mio primo post su Python, in realtà il mio primo codice Python
probabilmente ha qualche potenziale di golf.

Provalo online!


1

> <>, 197 + 2 byte

+2 per -v flag

: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 non sembra restituire alcun output per n> 1, ma è possibile verificarlo su https://fishlanguage.com . L'input va nella casella "Stack iniziale".



1

Python 2 , 85 byte

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

Provalo online!

Si aspetta un numero intero come argomento.

Spiegazione:

# 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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.