Xác định xem một số nguyên có phải là một palindrom trong một cơ số (cơ sở) nhất định không


11

Viết chương trình đọc từ stdin hai số nguyên, mỗi dòng mới kết thúc, sau đây được gọi là "số" và "cơ số" và:

  1. In bất kỳ thông điệp cố định bạn muốn nếu số là một palindrome trong radix đó (ví dụ true, t, 1)
  2. In bất kỳ thông điệp cố định khác nhau mà bạn muốn nếu số lượng không phải là một palindrome trong radix đó (ví dụ false, f, 0, vv)
  3. Các thông điệp này phải giống nhau cho mỗi lần chạy, nhưng không có quy tắc nào về việc chúng phải là gì (bất cứ điều gì tốt nhất để chơi gôn).
  4. Bạn có thể giả sử đầu vào là hợp lệ, hai số nguyên dương. "số" sẽ không vượt quá 2147483647, "cơ số" sẽ không vượt quá 32767.
  5. Bạn không thể sử dụng các tài nguyên bên ngoài, nhưng bạn có thể sử dụng bất kỳ hàm toán học nào được bao gồm theo mặc định trong ngôn ngữ của bạn.

Lưu ý: một cơ số chỉ là cơ sở của số.

Chạy mẫu:

16
10
false

16
3
true

16
20
true

121
10
true

5
5
false

12346
12345
true

16781313
64
true

16781313
16
true

Lưu ý: một cơ số chỉ là cơ sở của số.

Có vẻ tốt bây giờ. Bạn có thể muốn cấm tài nguyên bên ngoài mặc dù.

@ user2509848 hmmm chẳng hạn?
durron597

Nếu một người có thể tìm thấy một máy tính trên web chuyển đổi số giữa các cơ sở, nó gần như chắc chắn sẽ được sử dụng. Chúng tôi đã có một phát ban của câu trả lời gần đây.

Một trong những thông điệp cố định có thể là chuỗi rỗng (giả sử rằng chuỗi kia là một chuỗi không trống)?
Toby Speight

Câu trả lời:


5

Tính năng nhân đôi J (23 char) và K (19)

Hai ngôn ngữ rất giống nhau, nói chung và trong môn golf cụ ​​thể này. Đây là J:

(-:|.)#.^:_1~/".1!:1,~1
  • ,~1- Nối số 1 vào chính nó, tạo mảng 1 1.
  • 1!:1- Đọc trong hai chuỗi từ bàn phím ( 1!:1là để đọc và 1là tay cầm / số tệp cho đầu vào bàn phím).
  • ". - Chuyển đổi từng chuỗi thành một số.
  • #.^:_1~/- F~/ x,ycó nghĩa là tìm y F x. Của chúng tôi F#.^:_1, thực hiện việc mở rộng cơ sở.
  • (-:|.)- Đối số có khớp ( -:) ngược lại ( |.) không? 1cho có, 0không

Và đây là K:

a~|a:_vs/|.:'0::'``
  • 0::'``- Đọc trong ( 0::) một chuỗi cho mỗi 'dòng ( ) từ bàn điều khiển ( `là xử lý tệp cho việc này).
  • .:'- Chuyển đổi ( .:) mỗi 'chuỗi ( ) thành một số.
  • _vs/|- Đảo ngược cặp số, sao cho cơ số đứng trước số, sau đó chèn ( /) hàm mở rộng cơ sở _vs("vectơ từ vô hướng") giữa chúng.
  • a~|a:- Gán mở rộng kết quả này cho a, và sau đó kiểm tra xem có akhớp ( ~) ngược lại ( |) không. Một lần nữa, 1cho có, 0cho không.

@ ak82 Tôi tin rằng nó thú vị hơn theo cách này
John Dvorak

8

GolfScript, 10 ký tự

~base.-1%=

Đó là một điều dễ dàng cho GolfScript nếu chúng ta làm theo cách đơn giản. Đầu ra là 0/ 1cho false / true.

~       # Take input and evaluate it (stack: num rdx)
base    # Fortunately the stack is in the correct order for
        # a base transformation (stack: b[])
.       # Duplicate top of stack (stack: b[] b[])
-1%     # Reverse array (stack: b[] brev[])
=       # Compare the elements

3

APL (20)

⎕{≡∘⌽⍨⍵⊤⍨⍺/⍨⌊1+⍺⍟⍵}⎕

Đầu ra 0hoặc 1, ví dụ:

      ⎕{≡∘⌽⍨⍵⊤⍨⍺/⍨⌊1+⍺⍟⍵}⎕
⎕:
      5
⎕:
      5
0
      ⎕{≡∘⌽⍨⍵⊤⍨⍺/⍨⌊1+⍺⍟⍵}⎕
⎕:
      16781313
⎕:
      64
1

Giải trình:

  • ⎕{... }⎕: đọc hai số, chuyển chúng vào hàm. là số thứ nhất và là số thứ hai.
  • ⌊1+⍺⍟⍵: floor(1+⍺ log ⍵), số chữ số cần thiết để thể hiện trong cơ sở .
  • ⍺/⍨: cơ sở cho mỗi chữ số, do đó được nhân rộng theo số chúng tôi vừa tính.
  • ⍵⊤⍨: đại diện trong cơ sở đã cho (sử dụng số, vì vậy nó hoạt động cho tất cả các giá trị của ).
  • ≡∘⌽⍨: xem kết quả có bằng giá trị ngược của nó không.

3

Perl, 82 77 73 69 byte

$==<>;$.=<>;push(@a,$=%$.),$=/=$.while$=;@b=reverse@a;print@a~~@b?1:0

Các số đầu vào được dự kiến ​​là các dòng đầu vào của STDIN và kết quả được viết là 1hoặc 0, trước đây có nghĩa là số đầu tiên là một bảng màu trong biểu diễn của cơ sở đã cho.

Chỉnh sửa 1: Sử dụng $=lưu một số byte, vì chuyển đổi bên trong của nó thành int.

Chỉnh sửa 2: Toán tử smartmatch ~~so sánh trực tiếp các phần tử mảng, do đó không cần phải chuyển đổi thành chuỗi.

Chỉnh sửa 3: Tối ưu hóa bằng cách loại bỏ một biến không cần thiết.

65 byte : Nếu chuỗi trống được phép làm đầu ra cho false, bốn byte cuối cùng có thể được loại bỏ.

Phiên bản ung dung

$= = <>;
$. = <>;
while ($=) {
    push(@a, $= % $.);
    $= /= $.; # implicit int conversion by $=
}
@b = reverse @a;
print (@a ~~ @b) ? 1 : 0

Thuật toán lưu trữ các chữ số của số được chuyển đổi trong một mảng @a. Sau đó, biểu diễn chuỗi của mảng này được so sánh với mảng theo thứ tự ngược lại. Không gian ngăn cách các chữ số.


Xin lỗi, câu trả lời của tôi thực sự giống nhau, nhưng sử dụng $=cho phép bạn thực hiện intbước ... Và câu hỏi đặt ra anything you wantđể không có gì có thể là những gì bạn muốn ;-)
F. Hauri

@ F.Hauri: Cảm ơn, tôi sẽ cập nhật. $=cũng được đưa ra như một mẹo trong câu trả lời này cho câu hỏi "Mẹo chơi gôn ở Perl" . Trả lại 0chi phí thêm 6 byte, nhưng ấn tượng của tôi là một tin nhắn cố định không có ý định trống.
Heiko Oberdiek

Hem ,, Trả về 0 chi phí thêm 4 byte, không phải 6. Nhưng tôi duy trì: bất cứ điều gì! silence
F. Hauri

@ F.Hauri: Có, 4 là chính xác, hai byte thêm là dấu ngoặc đơn của phiên bản không được chỉnh sửa.
Heiko Oberdiek

2

Javascript 87

function f(n,b){for(a=[];n;n=(n-r)/b)a.push(r=n%b);return a.join()==a.reverse().join()}

nđối số là số, bđối số là cơ số.


2

Hiền nhân, 45

Chạy trong dấu nhắc tương tác

A=Integer(input()).digits(input())
A==A[::-1]

In Truekhi nó là một bảng màu, in Falsekhác


2

Perl 54 56 62

$==<>;$-=<>;while($=){$_.=$/.chr$=%$-+50;$=/=$-}say$_==reverse

Để được kiểm tra:

for a in $'16\n3' $'16\n10' $'12346\n12345' $'12346\n12346' $'21\n11' $'170\n16';do
    perl -E <<<"$a" ' 
        $==<>;$-=<>;while($=){$_.=$/.chr$=%$-+50;$=/=$-}say$_==reverse
    '
  done

sẽ cho:

1

1


1

Vì vậy, sản lượng này 1cho truekhi một palindrome được tìm thấy và không có gì nếu người nào khác.

Ungolfing:

$==<>;                            # Stdin to `$=`  (value)
$-=<>;                            # Stdin to `$-`  (radix)
while ( $= ) {
    $_.= $/. chr ( $= % $- +50 ); # Add *separator*+ chr from next modulo to radix to `$_`
    $=/= $-                       # Divide value by radix
}
say $_ == reverse                 # Return test result

Ghi chú :

  • $_ là bộ đệm dòng hiện tại và trống lúc bắt đầu.
  • $=là một biến dành riêng , nguyên bản được sử dụng để in dòng, đây là một bộ đếm dòng. Vì vậy, biến này là một số nguyên , bất kỳ phép tính nào trên này sẽ dẫn đến một số nguyên bị cắt cụt như nếu int()được sử dụng.
  • $- đã được sử dụng cho vui, chỉ để không sử dụng các chữ cái truyền thống ... (thêm một số ẩn ý) ...

để làm rõ, điều này không nói gì khi nó không phải là một bảng màu và 1 khi nó là?
durron597

1
Thủ đoạn hay. Tuy nhiên sai tích cực: 21 với cơ sở 11. Các chữ số cần một dấu phân cách trong so sánh chuỗi.
Heiko Oberdiek

Aaaarg +3! @HeikoOberdiek Bạn nói đúng ...
F. Hauri

@ F.Hauri: Ngoài ra các chữ số được đảo ngược. Do đó, 170 với cơ sở 16 là 0xAA, một palindrom, nhưng kết quả là sai.
Heiko Oberdiek

Có giá trị +6! chuyển đổi sang ký tự ...
F. Hauri

1

Toán học 77 43

IntegerDigits[n,b]đại diện cho n như một danh sách các chữ số trong cơ sở b. Mỗi chữ số cơ sở b được thể hiện một cách rõ ràng.

Ví dụ: 16781313 không phải là một bảng màu trong cơ sở 17:

IntegerDigits[16781313, 17]

{11, 13, 15, 11, 14, 1}

Tuy nhiên, nó một bảng màu trong cơ sở 16:

IntegerDigits[16781313, 16]

{1, 0, 0, 1, 0, 0, 1}


Nếu các cặp được đặt hàng trong các ví dụ trên được nhập vào,

(x=Input[]~IntegerDigits~Input[])==Reverse@x

sẽ trở lại

Sai (* (vì {11, 13, 15, 11, 14, 1}! = {1, 14, 11, 15, 13, 11}) *)

Đúng (* (vì {1, 0, 0, 1, 0, 0, 1} bằng {1, 0, 0, 1, 0, 0, 1}) *)


Thật kỳ lạ, không cần thiết cho câu trả lời nhưng tôi tò mò, làm thế nào để nó hiển thị chúng?
durron597

Tôi ghét nó khi tôi thua vì một lỗi đánh máy ngu ngốc ...
user12205

Vui lòng giải thích "typecast".
DavidC

Giải pháp hiền nhân của tôi dài hơn 2 ký tự của bạn bởi vì tôi phải chuyển đầu vào thành loạiInteger
user12205

Bây giờ tôi hiểu ý của bạn. Cảm ơn.
DavidC

1

Haskell (80 ký tự)

tb 0 _=[]
tb x b=(tb(div x b)b)++[mod x b]
pali n r=(\x->(x==reverse x))(tb n r)

Gọi nó với pali $number $radix. Đúng, khi số là một bảng màu, Sai nếu không.


1

Ruby - 76 ký tự

f=->(n,b){n==0?[]:[n%b,*f.(n/b,b)]};d=f.(gets.to_i,gets.to_i);p d==d.reverse

1

Perl 6 , 27 byte (22 không có stdin / out)

say (+get).base(get)~~.flip

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

  get()                     # pulls a line of stdin
 +                          # numerificate
(      ).base(get())        # pull the radix and call base to 
                            #  convert to string with that base
                    ~~      # alias LHS to $_ and smartmatch to
                      .flip # reverse of the string in $_

Perl6, vua của các golf có thể đọc được (golves?) (Và cũng có một số không dễ đọc).

Hàm Perl 6 (không phải stdin / stdout), 22 byte

{$^a.base($^b)~~.flip}

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


Lý do tôi không sử dụng basetrong câu trả lời của mình là basechỉ hỗ trợ tối đa 36 và câu hỏi yêu cầu hỗ trợ các cơ số lên đến32767
Jo King

Ồ, không biết điều đó. Hừm.
Phil H

0

dg - 97 byte

Đang dùng thử dg :

n,r=map int$input!.split!
a=list!
while n=>
 a.append$chr(n%r)
 n//=r
print$a==(list$reversed a)

Giải thích:

n, r=map int $ input!.split!      # convert to int the string from input
a = list!                         # ! calls a function without args
while n =>
 a.append $ chr (n % r)           # append the modulus
 n //= r                          # integer division
print $ a == (list $ reversed a)  # check for palindrome list

0

C, 140 132

int x,r,d[32],i=0,j=0,m=1;main(){scanf("%d %d",&x,&r);for(;x;i++)d[i]=x%r,x/=r;i--;for(j=i;j;j--)if(d[j]-d[i-j])m=0;printf("%d",m);}
  • cơ số 1 không được hỗ trợ :)

1
Chỉ cần puts(m)làm việc phải không?
durron597

printf("%d",m);sẽ ngắn hơn 8 ký tự.
VX

0

Haskell - 59

Rất ít thay đổi cho câu trả lời của Max Ried.

0%_=[]
x%b=x`mod`b:((x`div`b)%b)
p=((reverse>>=(==)).).(%)


0

dc, 39 byte

Độ dài là một palindrom, tất nhiên ( 33₁₂).

[[t]pq]sgod[O~laO*+sad0<r]dsrx+la=g[f]p

Số và cơ số phải ở trên cùng của ngăn xếp (trong cơ sở số hiện tại); số phải ít nhất là 0 và cơ số phải ít nhất là 2. Đầu ra là tnếu đó là một bảng màu và fnếu không. Vì nó không được chỉ định trong thử thách, tôi đã giả định rằng các số không bao giờ có các số 0 đứng đầu (vì vậy bất kỳ số nào kết thúc bằng 0không thể là một bảng màu).

Giải trình

Là một chương trình đầy đủ:

#!/usr/bin/dc

# read input
??

# success message
[[t]pq]sg

# set output radix
o

# keep a copy unmodified
d

# reverse the digits into register a
[O~ laO*+sa d0<r]dsrx

# eat the zero left on stack, and compare stored copy to a
+ la=g

# failure message
[f]p

0

LaTeX, 165 byte

Ví dụ tại desmos.com

k, cơ số, là một đầu vào có thể điều chỉnh

b=\floor \left(\log _k\left(\floor \left(x\right)\right)\right)
f\left(x\right)=k^bx-x-\left(k^2-1\right)\sum _{n=1}^bk^{\left(b-n\right)}\floor \left(xk^{-n}\right)

Nếu f(x)=0, xlà một palindrom trong cơ sở k.


0

Perl 6 , 34 byte

-4 byte nhờ PhilH

{@(polymod $^a: $^b xx*)~~[R,] $_}

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


Bạn có thể sử dụng $ _ thay vì @r để lưu 2
Phil H

@PhilH Không . (chỉ định Seq, không phải Danh sách)
Jo King

À, xin lỗi đã không thấy lỗi
Phil H

@PhilH Mẹo thứ hai của bạn vẫn giúp tiết kiệm byte!
Jo King

1
Luôn luôn khó chịu khi không có cách nào ngắn hơn để gọi giảm meta trên $ _ hoặc @_.
Phil H

0

05AB1E ,  4  3 byte

вÂQ

Hãy thử trực tuyến hoặc xác minh tất cả các trường hợp thử nghiệm .

Giải trình:

в      # The first (implicit) input converted to base second (implicit) input
       #  i.e. 12345 and 12346 → [1,1]
       #  i.e. 10 and 16 → [1,6]
 Â     # Bifurcate the value (short for duplicate & reverse)
       #  i.e. [1,1] → [1,1] and [1,1]
       #  i.e. [1,6] → [1,6] and [6,1]
  Q    # Check if they are still the same, and thus a palindrome
       #  i.e. [1,1] and [1,1] → 1
       #  i.e. [1,6] and [6,1] → 0

0

C (gcc) , 79 byte

n,r,m;main(o){for(scanf("%d %d",&n,&r),o=n;n;n/=r)m=m*r+n%r;printf("%d",m==o);}

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

Chạy xuống

n,r,m;main(o){
for(scanf("%d %d",&n,&r),       Read the number and the radix.
o=n;                            ...and save the number in o
n;                              Loop while n is non-zero
n/=r)                           Divide by radix to remove right-most digit.
m=m*r+n%r;                      Multiply m by radix to make room for a digit
                                and add the digit.
printf("%d",m==o);}             Print whether we have a palindrome or not.

Dựa trên thực tế là đối với một palindrom, đảo ngược của số phải bằng chính số đó.

Giả sử bạn có số ABC gồm ba chữ số trong một số cơ sở. Nhân nó với cơ sở sẽ luôn dẫn đến ABC0 và chia nó cho cơ sở trong AB với C là phần còn lại. Vì vậy, để đảo ngược số, chúng tôi chọn chữ số bên phải nhất từ ​​số ban đầu và chèn nó sang bên phải trên số bị đảo ngược. Để tạo khoảng trống cho chữ số đó, chúng tôi nhân số ngược lại với cơ sở trước.

Về cơ bản:

n       rev
ABC     0
AB      C
AB      C0
A       CB
A       CB0
0       CBA

Điều này thật tuyệt, bạn có thể giải thích toán học đằng sau này không?
durron597

@ durron597 Chắc chắn! Đã thêm một lời giải thích cho bài viết.
dạ dày
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.