Palindrom cơ sở thấp nhất


16

Cho một số n, viết một hàm tìm ra cơ sở nhỏ nhất b ≥ 2sao cho nlà một bảng màu trong cơ sở b. Ví dụ: đầu vào của28 phải trả về cơ sở 3vì đại diện thứ ba của 28 là 1001. Mặc dù 93là một palindrom ở cả cơ sở 2 và cơ sở 5, đầu ra phải là 2từ 2 <5.

Đầu vào

Một số nguyên dương n < 2^31 .

Đầu ra

Trả về cơ sở nhỏ nhất b ≥ 2sao bcho đại diện cơ sở củan là một bảng màu. Đừng giả sử bất kỳ số không hàng đầu.

Các mẫu (đầu vào => đầu ra):

11 => 10

32 => 7

59 => 4

111 => 6

Quy tắc

Mã ngắn nhất sẽ thắng.


1
Tôi nghĩ rằng cơ sở nên được hạn chế.
Ăn nhẹ

3
@Snack: Vấn đề với căn cứ cao hơn là gì? Không phụ thuộc vào sự lựa chọn của các biểu tượng, một số 1000 cơ sở sẽ là một bảng màu hoặc không.
Dennis

3
Giai thoại thú vị: n trong cơ sở n-1 luôn là 11 với n> = 2 và do đó luôn luôn có thể có một bảng màu.
Cruncher

1
@Cruncher: ncó thể là 1 và 2 không phải là bảng 1 cơ sở. Tuy nhiên, mỗi tích cực nlà một n + 1palindrom cơ sở .
Dennis

1
@Dennis Làm thế nào 2 không phải là một cơ sở 1 palindrom? Đó là 11. Hoặc II, hoặc 2 của bất kỳ biểu tượng nào bạn sử dụng. Trên thực tế tất cả các số 1 cơ sở là palindromes. Và tôi đã nói n> = 2, vì tôi không biết căn cứ 0 trên trái đất sẽ là gì.
Cruncher

Câu trả lời:


4

CJam , 19 byte / GolfScript, 23 byte

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

hoặc là

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

Dùng thử trực tuyến:

Ví dụ

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

Làm thế nào nó hoạt động

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.

Đối với GolfScript, q~is ~, _is ., bis base, Wis -1gis do.


6

GolfScript, 20 ký tự

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

Một cách tiếp cận khác với GolfScript khác với Dennis '. Nó tránh vòng lặp rõ ràng tốn kém có lợi cho toán tử find . Hãy thử trực tuyến .

~: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
Tài giỏi! Tuy nhiên, điều này không hoạt động nếu x = 1hoặc x = 2. Cả hai đều là chữ số cơ bản x + 1, palindromes cơ sở , vì vậy x))nên sửa nó.
Dennis

4

Toán học, 67 66 byte

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

Không thể thực sự cạnh tranh với GolfScript ở đây về kích thước mã, nhưng kết quả cho 2 32 về cơ bản được trả về ngay lập tức.


Đẹp. Hàm không phải được đặt tên mặc dù, phải không? Bạn chỉ có thể sử dụng một chức năng chưa được đặt tên?
numbermaniac

(Ngoài ra, có thể sử dụng PalindromeQđể kiểm tra ngược không?)
numbermaniac

4

Japt , 12 9 byte

Trừ khi tôi đã bỏ lỡ một mẹo (đã muộn!), Công cụ này sẽ hoạt động cho tất cả các số lên đến và bao gồm ít nhất 2**53-1 .

Trong thử nghiệm (được thừa nhận hạn chế và hoàn toàn ngẫu nhiên) của tôi, cho đến nay tôi đã nhận được kết quả dựa trên cơ sở (!). Không quá tồi tàn khi bạn xem xét JavaScript chỉ natively hỗ trợ căn cứ để .11601 310,515236

@ìX êê}a2

Thử nó

  • Cảm ơn ETH chỉ ra một cái gì đó mới cho tôi đã tiết kiệm được 3 byte và tăng hiệu quả đáng kể.

Giải trình

Đầu vào ngầm định của số nguyên U.

@     }a2

Bắt đầu bằng 2, trả về số đầu tiên trả về true khi được chuyển qua hàm sau, với Xsố hiện tại

ìX

Chuyển đổi Usang một mảng các Xchữ số cơ bản .

êê

Kiểm tra nếu mảng đó là một palindrom.


1) Có. Đổ lỗi cho bia cho quả bóng lên! : D 2) Đẹp; không bao giờ biết N.ì(n)có thể xử lý các căn cứ lớn hơn 36. Cảm ơn vì điều đó.
Xù xì

Vâng, bảng chữ cái cơ sở 36 không thành vấn đề N.ì(n)vì chúng tôi đang sử dụng số nguyên thô ;-)
ETHproductions

2

Con trăn 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)

Tôi không chắc định dạng đầu vào / đầu ra của câu hỏi muốn là gì. Tôi đã viết một chức năng. Mã này sử dụng một đầu vào tùy chọn bđể theo dõi cơ sở hiện tại mà nó đang thử nghiệm. Cácwhile vòng lặp chuyển đổi số thành một danh sách các chữ số trong cơ sở b.

Dòng cuối cùng trả về bnếu llà một bảng màu, và đệ quy thử tiếp theo bnếu không. Thủ thuật index-by-Boolean không hoạt động ở đây vì nó sẽ khiến cả hai tùy chọn được đánh giá bất kể Boolean và đệ quy sẽ không bao giờ chạm đáy.


1
Vì vậy, điều này sẽ không làm việc với các cơ sở cao tùy ý phải không? Nếu cơ sở thấp nhất mà một số có bảng màu giống như 10000 thì bạn sẽ bị tràn ngăn xếp?
Cruncher

@Cruncher Nó phụ thuộc vào việc thực hiện Python. Nó sẽ tràn khi chạy với CPython, nhưng không phải với Stackless Python , vốn tối ưu hóa cuộc gọi đuôi và do đó không có giới hạn đệ quy (mặc dù tôi chưa thực sự thử nghiệm nó).
xnor

2

JavaScript, 88 byte

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

Ung dung:

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 byte

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}}

Mã nguồn: http://jsfiddle.net/wR4Wf/1/

Lưu ý rằng việc thực hiện này cũng hoạt động chính xác cho các cơ sở lớn. Ví dụ, f(10014)trả về 1668 (10014 là 66 trong cơ sở 1668).


Cái này đẹp đấy. Bạn thậm chí có thể s/var b=2,c,d/b=d=2/kiếm thêm 6 byte;)
core1024

1

Bash + coreutils, 100 byte

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

Công dụng dc để làm định dạng cơ sở. Điều khó khăn là dcđịnh dạng của nó khác với n> 16.

Testcase:

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

1

J - 28 char

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

Giải thích:

  • #.inv~ - Mở rộng đối số bên trái sang cơ sở trong đối số bên phải.

  • (-.@-:|.@) - Trả về 0 nếu mở rộng là palindromic và 1 nếu không.

  • (1+]^:) - Tăng đối số đúng bởi một nếu chúng ta trả về 1, không có hành động nào khác.

  • ^:_ - Lặp lại mức tăng trên cho đến khi không có hành động.

  • &2 - Chuẩn bị đối số đúng là 2, biến đây thành hàm của một đối số.

Ví dụ:

   #.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.cho 27 byte. (Đừng muốn đăng riêng. Tôi sẽ chỉ để nó ở đây.)
Randomra

@randomra Tôi sẽ tính là 29 vì tàu cần parens để được sử dụng nội tuyến; Của tôi cứu một nhân vật bằng cách kết hợp ở cấp cao nhất.
thuật toán

Tôi nghĩ rằng điểm số của đa số là tính không có paren với bất kỳ chức năng không tên nào mặc dù luôn có một cuộc tranh luận về vấn đề này. Dù sao, tôi sẽ để nó ở đây và mọi người có thể chọn cách anh ấy / cô ấy ghi điểm. :)
Randomra

1

R, 122 95 byte

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]

Giải pháp ba năm tuổi ở 122 byte:

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]

Với một số giải thích:

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

1

Husk , 11 9 byte

ḟoS=↔`B⁰2

Cảm ơn @Zgarb vì -2!

Hãy thử trực tuyến!

Giải trình

ḟ(      )2  -- find least number ≥ 2 that satisfies:
     `B⁰    --   convert input to base (` flips arguments)
  S=↔       --   is palindrome (x == ↔x)

0

Lưu ý: Pyth mới hơn câu hỏi này, vì vậy câu trả lời này không đủ điều kiện để giành chiến thắng.

Bình thường, 10 byte

fq_jQTjQT2

Hãy thử nó ở đây.


0

Scala, 83 byte

def s(n:Int)=(for(b<-2 to n;x=Integer.toString(n,b);if(x==x.reverse))yield(b)).min



0

JavaScript 72 byte

F=(n,b=2)=>eval(`for(t=n,a=c="";t;t=t/b|0)a=t%b+a,c+=t%b`)^a?F(n,b+1):b

console.log(F(11) == 10)

console.log(F(32) == 7)

console.log(F(59) == 4)

console.log(F(111) == 6)


0

Toán học 42 byte

Một biến thể của mục nhập của Martin Ender. Làm cho việc sử dụng IntegerReverse(được cung cấp trong phiên bản 10.3) IntegerDigits.

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

0

Java 8, 103 byte

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

Giải trình:

Hãy thử nó ở đây.

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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.