Tüm baz palindromik bize ait


20

Palindrom olan bazlarınn sıra numarasını ( OEIS A126071 ) oluşturun.

Özellikle, dizi aşağıdaki gibi tanımlanır: bir numara verilir n, tabanında bunu ifade aiçin a = 1,2, ..., nve bu ifadelerin birçok palindromic nasıl saymak. "Palindromik" aifadenin taban basamaklarını atomik birimler olarak tersine çevirme anlamında anlaşılmaktadır (teşekkürler, @Martin Büttner ). Örnek olarak n= 5şunları göz önünde bulundurun :

  • a=1: ifade 11111: palindromik
  • a=2: ifade 101: palindromik
  • a=3: ifade 12: palindromik değil
  • a=4: ifade 11: palindromik
  • a=5: ifade 10: palindromik değil

Bu nedenle sonuç n=5şudur 3. OEIS2, ..., n+1 yerine taban kullandığını unutmayın 1, ..., n(teşekkürler, @ kabı ). Eşdeğerdir, çünkü tabanlardaki ifadeler 1ve n+1her zaman palindromiktir.

Dizinin ilk değerleri

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

Girdi pozitif bir tamsayıdır n. Çıktı, ndizinin ilk terimleridir.

Program n, herhangi bir dahili hesaplamada varsayılan veri türünüzün neden olduğu sınırlamalar için teorik olarak çalışmalıdır (yeterli zaman ve bellek verilir) .

Tüm işlevlere izin verilir. En az bayt kazanır.



1
Herkes için yararlıysa, n sayısının da n-1 tabanındaki her zaman palindromik olduğunu belirtmek gerekir.
Computronium

Yanıtlar:


9

Pyth, 13 bayt

mlf_ITjLdSdSQ

Bunun kısalığı çoğunlukla Ideğerli " Invariant" komutundan kaynaklanmaktadır.

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

İçin Truekabul edilebilir bir çıktı ise 1, msm_IjdkSdSQ(12 bayt) çalışır.

Burada deneyin .


2
FryAmTheEggman_I# yerine kullanmak için önerisine bakın f_IT(% 100 kullanılabilir olduğundan emin değilim, ama öyle görünüyor ).
Jonathan Allan

7

Jöle, 14 bayt

bR‘$µ=UP€S
RÇ€

Çevrimiçi deneyin!

Rakip olmayan sürüm

Jelly tercümanı, birliğe dönüşmeyi imkansız hale getiren bir hataya sahipti. Bu şimdi düzeltildi, bu nedenle aşağıdaki kod ( 12 bayt ) da eldeki görevi yerine getiriyor.

bRµ=UP€S
RÇ€

Çevrimiçi deneyin!

Nasıl çalışır

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 bayt

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

Bu sınamadan önceki geçerli sürümü (10.1.0) kullanır .

Çevrimiçi deneyin !

açıklama

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

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 bayt

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

Bazlar> 36 için de çalışır.


1

JavaScript (ES6), 105 95 bayt

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

açıklama

1'den 36'ya kadar bir sayı alır (JavaScript'te temel dönüşüm sınırlaması) ve dizinin bir dizisini döndürür.

Bir baz geçtiğinde palindromları kontrol eden özyinelemeli fonksiyon, sadece geçilirse sekansı döndürür n.

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

Ölçek

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>


Bunu yinelemeli bir işleve dönüştürmenin bir yolu var mı? Bunun biraz bayt kurtarabileceğini hissediyorum.
Mama Fun Roll

@ Right Haklısın. Bahşiş için teşekkürler.
user81655


1

PHP, 73 + 1 bayt

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

üsleri 1için çalışır 36. Pipo ile çalıştırın -nRveya çevrimiçi deneyin .


1

PHP, 92 + 1 bayt:

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

tüm üsler için çalışır. Pipo ile çalıştırın -nRveya çevrimiçi deneyin .


1

Python 2, 97 bayt

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

İlk Python yayınım, aslında ilk Python kodum
muhtemelen bazı golf potansiyeline sahip.

Çevrimiçi deneyin!


1

> <>, 197 + 2 Bayt

-V bayrağı için +2

: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, n> 1 için herhangi bir çıktı döndürmüyor gibi görünüyor, ancak https://fishlanguage.com adresinden doğrulayabilirsiniz . Giriş "Başlangıç ​​yığını" kutusuna gider.



1

Python 2 , 85 bayt

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

Çevrimiçi deneyin!

Bağımsız değişken olarak bir tamsayıyı bekler.

Açıklama:

# 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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.