Palindrome ฐานต่ำสุด


16

รับจำนวนnเขียนฟังก์ชั่นที่พบฐานเล็กที่สุดb ≥ 2เช่นที่nเป็น palindrome bในฐาน ตัวอย่างเช่นอินพุตของ28ควรส่งคืนฐาน3เนื่องจากการแทนค่าแบบไตรภาคของ 28 คือ 1001 ถึงแม้ว่า93จะเป็น palindrome ทั้งในฐาน 2 และฐาน 5 แต่เอาต์พุตควรมีค่า2ตั้งแต่ 2 <5

อินพุต

n < 2^31เป็นจำนวนเต็มบวก

เอาท์พุต

ส่งคืนฐานที่เล็กที่สุดb ≥ 2ซึ่งการbแทนค่าฐานของnเป็น palindrome อย่าถือว่าศูนย์นำหน้าใด ๆ

ตัวอย่าง (input => output):

11 => 10

32 => 7

59 => 4

111 => 6

กฎระเบียบ

รหัสที่สั้นที่สุดชนะ


1
ฉันคิดว่าฐานควร จำกัด
สแน็

3
@Sack: อะไรคือปัญหาของฐานที่สูงขึ้น? เป็นอิสระจากการเลือกสัญลักษณ์ตัวเลขฐาน 1,000 จะเป็น palindrome หรือไม่ก็ได้
Dennis

3
เกร็ดเล็กเกร็ดน้อยที่น่าสนใจ: n ในฐาน n-1 อยู่เสมอ 11 สำหรับ n> = 2 ดังนั้นจึงเป็นไปได้ที่ palindrome
Cruncher

1
@ Cruncher: nสามารถเป็น 1 และ 2 ไม่ใช่ฐาน 1 palindrome อย่างไรก็ตามทุกบวกnเป็นฐานที่เป็นn + 1ของแข็ง
Dennis

1
@Dennis 2 ไม่ได้เป็น 1 ฐาน palindrome อย่างไร มันคือ 11 หรือ II หรือ 2 ของสัญลักษณ์ใด ๆ ก็ตามที่คุณใช้ จริง ๆ แล้วเลขฐาน 1 ทั้งหมดคือ palindromes และฉันพูดว่า n> = 2 เพราะฉันไม่รู้ว่าบนฐานโลก 0 จะเป็นอะไร
Cruncher

คำตอบ:


4

CJam , 19 ไบต์ / GolfScript, 23 ไบต์

q~:N;1{)_N\b_W%=!}g

หรือ

~:N;1{).N\base.-1%=!}do

ลองออนไลน์:

ตัวอย่าง

$ cjam base.cjam <<< 11; echo
10
$ cjam base.cjam <<< 111; echo
6
$ golfscript base.gs <<< 11
10
$ golfscript base.gs <<< 111
6

มันทำงานอย่างไร

q~:N;   # Read the entire input, interpret it and save the result in “N”.
1       # Push 1 (“b”).
{       #
  )     # Increment “b”.
  _N\   # Duplicate “b”, push “N” and swap.
  b     # Push the array of digits of “N” in base “b”.
  _W%   # Duplicate the array and reverse it.
  =!    # Compare the arrays.
}g      # If they're not equal, repeat the loop.

สำหรับ GolfScript, q~เป็น~, _คือ., bคือbase, Wเป็น-1และเป็นgdo


6

GolfScript 20 ตัวละคร

~:x,2>{x\base.-1%=}?

แนวทางที่แตกต่างกับ GolfScript นอกเหนือจากDennis ' มันหลีกเลี่ยงการวนซ้ำอย่างชัดเจนค่าใช้จ่ายแก่ผู้ประกอบการค้นหา ลองออนไลน์

~:x        # interpret and save input to variable x
,2>        # make a candidate list 2 ... x-1 (note x-1 is the maximum possible base)
{          # {}? find the item on which the code block yields true
  x\       # push x under the item under investigation
  base     # perform a base conversion
  .-1%     # make a copy and reverse it
  =        # compare reversed copy and original array
}?         

1
ฉลาด! แต่นี้ไม่ทำงานหากหรือx = 1 x = 2ทั้งสองเป็นหลักเดียว, x + 1palindromes ฐานดังนั้นx))ควรแก้ไข
Dennis

4

Mathematica, 67 66 ไบต์

g[n_]:=For[i=1,1>0,If[(d=n~IntegerDigits~++i)==Reverse@d,Break@i]]

ไม่สามารถแข่งขันกับ GolfScript ได้ที่นี่ในแง่ของขนาดรหัส แต่ผลลัพธ์สำหรับ 2 32จะถูกส่งกลับทันที


ดี ไม่จำเป็นต้องตั้งชื่อฟังก์ชันว่าใช่ไหม คุณสามารถใช้ฟังก์ชั่นที่ไม่มีชื่อได้หรือไม่?
numbermaniac

(นอกจากนี้เป็นไปได้หรือไม่ที่จะใช้PalindromeQสำหรับการตรวจสอบย้อนกลับ?)
numbermaniac

4

Japt , 12 9 ไบต์

ถ้าฉันได้พลาดเคล็ดลับ (ที่จะสาย!) 2**53-1นี้ควรจะทำงานสำหรับตัวเลขทั้งหมดและรวมถึงอย่างน้อย

ในการทดสอบของฉัน (ถูก จำกัด และสุ่มทั้งหมด) ฉันได้รับผลลัพธ์จนถึงฐาน(!) แล้ว ไม่มากเกินไปโทรมเมื่อคุณพิจารณา JavaScript เพียง natively สนับสนุนฐานการ11601 310,515236

@ìX êê}a2

ลองมัน

  • ขอบคุณETH ที่ชี้ให้เห็นสิ่งใหม่สำหรับฉันที่ช่วยประหยัด 3 ไบต์และเพิ่มประสิทธิภาพอย่างมาก

คำอธิบาย

Uการป้อนข้อมูลโดยนัยของจำนวนเต็ม

@     }a2

เริ่มต้นด้วย2ส่งคืนหมายเลขแรกที่ส่งกลับค่าจริงเมื่อส่งผ่านฟังก์ชันต่อไปนี้โดยXเป็นหมายเลขปัจจุบัน

ìX

แปลงUเป็นอาเรย์ของXตัวเลขฐาน

êê

ทดสอบว่าอาร์เรย์นั้นเป็น palindrome หรือไม่


1) ใช่ โทษเบียร์สำหรับลูกนั้น! : D 2) ดี; ไม่เคยรู้ว่าสามารถจัดการกับฐานที่สูงกว่าN.ì(n) 36ขอบคุณสำหรับสิ่งนั้น
Shaggy

ใช่ตัวอักษรฐาน 36 ไม่สำคัญN.ì(n)เพราะเราใช้จำนวนเต็มดิบ ;-)
ETHproductions

2

Python 2 (83)

def f(n,b=2):
 l=[];m=n
 while m:l+=[m%b];m//=b
 return l==l[::-1]and b or f(n,b+1)

ฉันไม่แน่ใจว่าคำถามต้องการรูปแบบอินพุต / เอาต์พุต ฉันเขียนฟังก์ชั่น รหัสใช้อินพุตที่เป็นตัวเลือกbเพื่อติดตามฐานปัจจุบันที่กำลังทดสอบ whileloops bแปลงหมายเลขที่รายชื่อของตัวเลขในฐาน

บรรทัดสุดท้ายจะส่งคืนbถ้าlเป็นพาลินโดรมและลองทำสิ่งต่อไปbนี้ซ้ำ ๆ เคล็ดลับการทำดัชนีโดยใช้บูลีนไม่ทำงานที่นี่เพราะจะทำให้ทั้งสองตัวเลือกได้รับการประเมินโดยไม่คำนึงถึงบูลีนและการเรียกซ้ำจะไม่สิ้นสุดลง


1
ดังนั้นสิ่งนี้จะไม่ทำงานกับฐานสูงโดยพลการใช่ไหม หากฐานที่ต่ำที่สุดที่ตัวเลขมี palindrome มีค่าเท่ากับ 10,000 คุณจะได้รับสแต็คล้นหรือไม่
Cruncher

@ Cruncher มันขึ้นอยู่กับการใช้งานของ Python มันจะล้นเมื่อทำงานกับ CPython แต่ไม่ใช่กับStackless Pythonซึ่งเป็นการเพิ่มประสิทธิภาพการโทรหางและดังนั้นจึงไม่มีการ จำกัด การเรียกซ้ำ (แม้ว่าฉันจะไม่ได้ทดสอบจริง ๆ )
xnor

2

JavaScript, 88 ไบต์

f=function(n){for(a=b='+1';a^a.split('').reverse().join('');a=n.toString(++b));return+b}

Ungolfed:

f = function(n) {
    for(a = b = '+1'; // This is not palindrome, but equals 1 so we have at least one iteration
        a ^ a.split('').reverse().join(''); // test a is palindrome
        a = n.toString(++b));
    return+b
}

1

Javascript, 105 ไบต์

function f(n){for(var b=2,c,d;d=[];++b){for(c=n;c;c=c/b^0)d.push(c%b);if(d.join()==d.reverse())return b}}

JSFiddle: http://jsfiddle.net/wR4Wf/1/

โปรดทราบว่าการใช้งานนี้ยังทำงานอย่างถูกต้องสำหรับฐานขนาดใหญ่ ตัวอย่างเช่นf(10014)ส่งคืน 1668 (10014 คือ 66 ในฐาน 1668)


นี่เป็นสิ่งที่ดี คุณสามารถs/var b=2,c,d/b=d=2/เพิ่ม 6 ไบต์ได้อีก);
core1024

1

Bash + coreutils 100 ไบต์

for((b=1;b++<=$1;)){
p=`dc<<<${b}o$1p`
c=tac
((b<17))&&c=rev
[ "$p" = "`$c<<<$p`" ]&&echo $b&&exit
}

ใช้dcเพื่อจัดรูปแบบพื้นฐาน สิ่งที่ยุ่งยากคือdcรูปแบบของมันแตกต่างกันสำหรับ n> 16

Testcases:

$ ./lowestbasepalindrome.sh 11
10
$ ./lowestbasepalindrome.sh 32
7
$ ./lowestbasepalindrome.sh 59
4
$ ./lowestbasepalindrome.sh 111
6
$ 

1

J - 28 ตัวอักษร

#.inv~(-.@-:|.@)(1+]^:)^:_&2

อธิบาย:

  • #.inv~ - ขยายอาร์กิวเมนต์ซ้ายไปที่ฐานในอาร์กิวเมนต์ขวา

  • (-.@-:|.@) - ส่งคืน 0 ถ้าการขยายตัวเป็น Palindromic และ 1 เป็นอย่างอื่น

  • (1+]^:) - เพิ่มอาร์กิวเมนต์ที่ถูกต้องทีละหนึ่งถ้าเราส่งคืน 1 มิฉะนั้นจะไม่ดำเนินการใด ๆ

  • ^:_ - ทำซ้ำการเพิ่มขึ้นข้างต้นจนกว่าจะไม่มีการดำเนินการใด ๆ

  • &2 - เตรียมอาร์กิวเมนต์ที่ถูกต้องเป็น 2 ทำให้นี่เป็นฟังก์ชันของอาร์กิวเมนต์หนึ่งตัว

ตัวอย่าง:

   #.inv~(-.@-:|.@)(1+]^:)^:_&2 (28)
3
   #.inv~(-.@-:|.@)(1+]^:)^:_&2 every 93 11 32 59 111  NB. perform on every item
2 10 7 4 6
   #.inv~(-.@-:|.@)(1+]^:)^:_&2 every 1234 2345 3456 4567 5678 6789
22 16 11 21 31 92

2+1 i.~[#.inv"*(-:|.@)~2+i.สำหรับ 27 ไบต์ (ไม่ต้องการโพสต์แยกกันฉันจะทิ้งไว้ที่นี่)
randomra

@randomra ฉันจะนับว่าเป็น 29 เพราะรถไฟจำเป็นต้องมี parens เพื่อใช้แบบอินไลน์ Mine บันทึกตัวละครโดยมีการเชื่อมต่อที่ระดับบนสุด
algorithmshark

ฉันคิดว่าคะแนนส่วนใหญ่ของการให้คะแนนคือการนับที่น้อยกว่าด้วยฟังก์ชันที่ไม่มีชื่อใด ๆ แม้ว่าจะมีข้อโต้แย้งเกี่ยวกับเรื่องนี้อยู่เสมอ อย่างไรก็ตามฉันจะออกจากที่นี่และทุกคนสามารถเลือกได้ว่าเขา / เธอให้คะแนน :)
randomra

1

R, 122 95 ไบต์

function(n)(2:n)[sapply(2:n,function(x){r={};while(n){r=c(n%%x,r);n=n%/%x};all(r==rev(r))})][1]

โซลูชันสามปีที่ 122 ไบต์:

f=function(n)(2:n)[sapply(sapply(2:n,function(x){r=NULL;while(n){r=c(n%%x,r);n=n%/%x};r}),function(x)all(x==rev(x)))][1]

ด้วยคำอธิบายบางอย่าง:

f=function(n)(2:n)[sapply(
                    sapply(2:n,function(x){ #Return the decomposition of n in bases 2 to n
                                 r=NULL
                                 while(n){
                                     r=c(n%%x,r)
                                     n=n%/%x}
                                     r
                                     }
                           ),
                    function(x)all(x==rev(x))) #Check if palindrome
                   ][1] #Return the first (i. e. smallest) for which it is







0

Mathematica 42 ไบต์

รูปแบบของรายการของ Martin Ender ทำให้การใช้งานIntegerReverse(ทำมีอยู่ในรุ่น 10.3) IntegerDigitsซึ่งจะทำยังไงกับ

(i=2;While[#~IntegerReverse~i !=#,i++];i)&

0

Java 8, 103 ไบต์

n->{int b=1,l;for(String s;!(s=n.toString(n,++b)).equals(new StringBuffer(s).reverse()+""););return b;}

คำอธิบาย:

ลองที่นี่

n->{                          // Method with integer as both parameter and return-type
  int b=1,                    //  Base-integer, starting at 1
      l;                      //  Length temp integer
  for(String s;               //  Temp String
      !(s=n.toString(n,++b))  //   Set the String to `n` in base `b+1`
                              //   (by first increase `b` by 1 using `++b`)
       .equals(new StringBuffer(s).reverse()+"");
                              //   And continue looping as long as it's not a palindrome
  );                          //  End of loop
  return b;                   //  Return the resulting base integer
}                             // End of method
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.