palindromic ฐานทั้งหมดของคุณเป็นของเรา


20

สร้างเลขลำดับฐานที่nเป็น Palindrome ( OEIS A126071 )

โดยเฉพาะลำดับที่ถูกกำหนดดังต่อไปนี้: ได้รับตัวเลขnแสดงมันในฐานaสำหรับa = 1,2, ..., nและนับจำนวนนิพจน์เหล่านั้นเป็น palindromic "Palindromic" เป็นที่เข้าใจกันในแง่ของการกลับหลักฐานaของการแสดงออกเป็นหน่วยอะตอม (ขอบคุณ@Martin Büttner ) เป็นตัวอย่างให้พิจารณาn= 5:

  • a=1: นิพจน์คือ11111: palindromic
  • a=2: นิพจน์คือ101: palindromic
  • a=3: นิพจน์คือ12: ไม่ใช่ palindromic
  • a=4: นิพจน์คือ11: palindromic
  • a=5: นิพจน์คือ10: ไม่ใช่ palindromic

ดังนั้นผลการมีn=5 3โปรดทราบว่า OEIS ใช้ฐาน2, ..., n+1แทน1, ..., n(ขอบคุณ@beaker ) มันเทียบเท่าเพราะการแสดงออกในฐาน1และn+1มักจะเป็น Palindromic

ค่าแรกของลำดับคือ

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

nการป้อนข้อมูลเป็นจำนวนเต็มบวก เอาต์พุตเป็นnเทอมแรกของลำดับ

โปรแกรมควรทำงานตามทฤษฎี (ให้เวลาและหน่วยความจำเพียงพอ) สำหรับnข้อ จำกัดใด ๆที่เกิดจากชนิดข้อมูลเริ่มต้นของคุณในการคำนวณภายในใด ๆ

ฟังก์ชั่นทั้งหมดที่ได้รับอนุญาต จำนวนไบต์ต่ำสุดชนะ



1
ถ้ามันมีประโยชน์กับทุกคนมันก็คุ้มค่าที่จะสังเกตว่าตัวเลข n นั้นเป็น palindromic ในฐาน n-1 เสมอ
Computronium

นี่คือA126071
ติตัส

คำตอบ:


9

Pyth, 13 ไบต์

mlf_ITjLdSdSQ

กะทัดรัดนี้เป็นส่วนใหญ่เนื่องจากการInvaluable " Iคำสั่ง 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

ถ้าTrueเป็นที่ยอมรับสำหรับการส่งออก1, msm_IjdkSdSQ(12 bytes) งาน

ลองมันนี่


2
ดูข้อเสนอแนะของ FryAmTheEggman ที่จะใช้_I#มากกว่าf_IT(ฉันไม่แน่ใจ 100% ว่าใช้งานได้ แต่ดูเหมือนว่าจะเป็น )
Jonathan Allan

7

เยลลี่ขนาด 14 ไบต์

bR‘$µ=UP€S
RÇ€

ลองออนไลน์!

รุ่นที่ไม่ใช่การแข่งขัน

ล่าม Jelly มีข้อผิดพลาดที่ทำให้การแปลงเป็นไปไม่ได้เป็นไปไม่ได้ สิ่งนี้ได้รับการแก้ไขแล้วดังนั้นโค้ดต่อไปนี้ ( 12 ไบต์ ) ก็สามารถทำงานได้สำเร็จ

bRµ=UP€S
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ไบต์

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

ใช้รีลีสปัจจุบัน (10.1.0)ซึ่งเร็วกว่าความท้าทายนี้

ลองออนไลน์ !

คำอธิบาย

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

ES6, 149 ไบต์

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

ใช้งานได้กับฐาน> 36 ด้วย


1

JavaScript (ES6), 105 95 ไบต์

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

คำอธิบาย

ใช้ตัวเลขตั้งแต่ 1 ถึง 36 (ข้อ จำกัด ของการแปลงฐานใน JavaScript) และส่งกลับอาร์เรย์ของลำดับ

ฟังก์ชั่นวนซ้ำที่ตรวจสอบ palindromes เมื่อฐานถูกส่งผ่านไปมิฉะนั้นจะส่งคืนลำดับหาก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

ทดสอบ

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>


มีวิธีที่จะเปลี่ยนสิ่งนั้นให้เป็นฟังก์ชั่นวนซ้ำหรือไม่? ฉันรู้สึกเหมือนว่าสามารถบันทึกไบต์
Mama Fun Roll

@ ՊՓԼՃՐՊՃՈԲՍԼคุณพูดถูก ขอบคุณสำหรับทิป.
user81655


1

PHP, 73 + 1 ไบต์

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

ทำงานให้กับฐานการ1 36ทำงานเป็นท่อที่มี-nRหรือลองออนไลน์


1

PHP, 92 + 1 ไบต์:

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

ใช้ได้กับทุกฐาน ทำงานเป็นท่อที่มี-nRหรือลองออนไลน์


1

Python 2, 97 ไบต์

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

โพสต์ Python แรกของฉันจริงๆแล้วรหัส Python แรกของฉัน
อาจมีความเป็นไปได้ในการเล่นกอล์ฟ

ลองออนไลน์!


1

> <>, 197 + 2 ไบต์

+2 สำหรับแฟล็ก -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 ดูเหมือนจะไม่ส่งกลับผลลัพธ์ใด ๆ สำหรับ n> 1 แต่คุณสามารถตรวจสอบได้ในhttps://fishlanguage.com ข้อมูลเข้าในช่อง "เริ่มต้นสแต็ก"



1

Python 2 , 85 ไบต์

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

ลองออนไลน์!

คาดว่าจำนวนเต็มเป็นอาร์กิวเมนต์

คำอธิบาย:

# 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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.