Cała twoja podstawowa palindromika należy do nas


20

Wygeneruj numern sekwencji zasad, w których znajduje się palindrom ( OEIS A126071 ).

W szczególności, sekwencja jest zdefiniowana następująco: podany numer n, wyrażać je w bazie aza a = 1,2, ..., n, a ilu z tych wyrażeń są palindromiczna. „Palindromic” jest rozumiany w kategoriach odwracania podstawowych acyfr wyrażenia jako jednostek atomowych (dzięki, @Martin Büttner ). Jako przykład rozważ n= 5:

  • a=1: wyrażenie to 11111: palindromic
  • a=2: wyrażenie to 101: palindromic
  • a=3: wyrażenie jest 12: nie palindromiczne
  • a=4: wyrażenie to 11: palindromic
  • a=5: wyrażenie jest 10: nie palindromiczne

Dlatego wynik dla n=5jest 3. Zauważ, że OEIS używa baz 2, ..., n+1zamiast 1, ..., n(dzięki, @beaker ). Jest to równoważne, ponieważ wyrażenia w bazie 1i n+1zawsze są palindromiczne.

Pierwsze wartości sekwencji to

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

Dane wejściowe to dodatnia liczba całkowita n. Dane wyjściowe to pierwsze nwarunki sekwencji.

Program powinien teoretycznie działać (biorąc pod uwagę wystarczającą ilość czasu i pamięci) na wszelkie nograniczenia wynikające z domyślnego typu danych w obliczeniach wewnętrznych.

Wszystkie funkcje są dozwolone. Najniższa liczba bajtów wygrywa.



1
Jeśli jest to pomocne dla każdego, warto zauważyć, że liczba n jest również zawsze palindromiczna w podstawie n-1.
Computronium

To jest A126071
Tytus

Odpowiedzi:


9

Pyth, 13 bajtów

mlf_ITjLdSdSQ

IZwięzłość tego wynika głównie z Inieocenionego polecenia „ nvariant”.

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

Jeśli Truejest akceptowalnym wyjściem 1, msm_IjdkSdSQdziała (12 bajtów).

Wypróbuj tutaj .


2
Zobacz sugestię FryAmTheEggman do użycia _I#zamiast f_IT(nie jestem w 100% pewien, że była dostępna, ale wydaje się, że była ).
Jonathan Allan

7

Galaretka, 14 bajtów

bR‘$µ=UP€S
RÇ€

Wypróbuj online!

Wersja niekonkurująca

Tłumacz Jelly miał błąd, który uniemożliwiał konwersję na jednoargumentową. Zostało to teraz naprawione, więc poniższy kod ( 12 bajtów ) również wykonuje dane zadanie.

bRµ=UP€S
RÇ€

Wypróbuj online!

Jak to działa

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 bajtów

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

Wykorzystuje bieżącą wersję (10.1.0) , która jest wcześniejsza niż to wyzwanie.

Wypróbuj online !

Wyjaśnienie

:            % 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 bajtów

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 bajtów

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

Działa również dla baz> 36.


1

JavaScript (ES6), 105 95 bajtów

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

Wyjaśnienie

Pobiera liczbę od 1 do 36 (ograniczenie konwersji zasad w JavaScript) i zwraca tablicę sekwencji.

Funkcja rekurencyjna, która sprawdza palindromy podczas przekazywania zasady, w przeciwnym razie zwraca sekwencję, jeśli tylko nzostanie przekazana.

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>


Czy istnieje sposób, aby zmienić to w funkcję rekurencyjną? Wydaje mi się, że to może zaoszczędzić trochę bajtów.
Mama Fun Roll

@ ՊՓԼՃՐՊՃՈԲՍԼ Masz rację. Dzięki za wskazówkę.
user81655,


1

PHP, 73 + 1 bajty

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

działa dla baz 1do 36. Uruchom jako potok z -nRlub spróbuj online .


1

PHP, 92 + 1 bajty:

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

działa dla wszystkich baz. Uruchom jako potok z -nRlub spróbuj online .


1

Python 2, 97 bajtów

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

Mój pierwszy post w Pythonie, właściwie mój pierwszy kod w Pythonie
prawdopodobnie ma pewien potencjał golfowy.

Wypróbuj online!


1

> <>, 197 + 2 bajtów

+2 dla flagi -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

Wydaje się, że tio.run nie zwraca żadnych danych wyjściowych dla n> 1, ale można to sprawdzić na https://fishlanguage.com . Dane wejściowe znajdują się w polu „Początkowy stos”.



1

Python 2 , 85 bajtów

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

Wypróbuj online!

Oczekuje liczby całkowitej jako argumentu.

Wyjaśnienie:

# 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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.