Menentukan apakah bilangan bulat adalah palindrom di radix yang diberikan (basis)

11

Tulis program yang membaca dari stdin dua bilangan bulat, setiap baris diakhiri, selanjutnya disebut "angka" dan "radix", dan:

  1. Mencetak pesan tetap Anda inginkan jika nomor tersebut adalah palindrom di radix itu (misalnya true, t, 1)
  2. Mencetak pesan tetap berbeda yang Anda inginkan jika nomor tersebut bukan merupakan palindrom di radix itu (misalnya false, f, 0, dll)
  3. Pesan-pesan ini harus sama untuk setiap latihan, tetapi tidak ada aturan tentang apa yang harus mereka mainkan (apa pun yang terbaik untuk bermain golf).
  4. Anda dapat menganggap input tersebut valid, dua bilangan bulat positif. "angka" tidak akan melebihi 2147483647, "radix" tidak akan melebihi 32767.
  5. Anda mungkin tidak menggunakan sumber daya eksternal, tetapi Anda dapat menggunakan fungsi matematika apa pun yang disertakan secara default dalam bahasa Anda.

Catatan: radix hanyalah basis dari angka.

Sampel berjalan:

16
10
false

16
3
true

16
20
true

121
10
true

5
5
false

12346
12345
true

16781313
64
true

16781313
16
true
durron597
sumber
Catatan: radix hanyalah basis dari angka.
Terlihat bagus sekarang. Anda mungkin ingin melarang sumber daya eksternal.
@ user2509848 hmmm, misalnya?
durron597
Jika seseorang dapat menemukan kalkulator di web yang mengubah angka di antara basis, itu hampir pasti akan digunakan. Kami telah memiliki ruam jawaban trolly akhir-akhir ini.
Bisakah salah satu pesan tetap menjadi string kosong (dengan asumsi bahwa pesan lainnya adalah string tidak kosong)?
Toby Speight

Jawaban:

5

Fitur ganda J (23 char) dan K (19)

Kedua bahasa ini sangat mirip, baik secara umum maupun dalam golf khusus ini. Inilah J:

(-:|.)#.^:_1~/".1!:1,~1
  • ,~1- Tambahkan nomor 1 untuk dirinya sendiri, membuat array 1 1.
  • 1!:1- Baca dalam dua string dari keyboard ( 1!:1untuk membaca, dan 1menangani file / nomor untuk input keyboard).
  • ". - Konversi setiap string ke angka.
  • #.^:_1~/- F~/ x,yBerarti untuk menemukan y F x. Kami Fadalah #.^:_1, yang melakukan ekspansi basis.
  • (-:|.)- Apakah argumen cocok dengan ( -:) kebalikannya ( |.)? 1untuk ya, 0untuk tidak.

Dan di sini adalah K:

a~|a:_vs/|.:'0::'``
  • 0::'``- Baca dalam ( 0::) string untuk setiap 'baris ( ) dari konsol ( `adalah pegangan file untuk ini).
  • .:'- Konversi ( .:) setiap ( ') string ke angka.
  • _vs/|- Balikkan pasangan angka, sehingga radix berada di depan angka, dan kemudian masukkan ( /) fungsi ekspansi basis _vs("vektor dari skalar") di antara mereka.
  • a~|a:- Tetapkan ekspansi yang dihasilkan ini ke a, dan kemudian periksa apakah acocok ( ~) kebalikannya ( |). Sekali lagi, 1untuk ya, 0untuk tidak.
algoritme hiu
sumber
@ ak82 Saya percaya ini lebih menarik dengan cara ini
John Dvorak
8

GolfScript, 10 karakter

~base.-1%=

Itu yang mudah untuk GolfScript jika kita melakukannya dengan cara langsung. Outputnya adalah 0/ 1untuk 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
Howard
sumber
3

APL (20)

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

Keluaran 0atau 1, misalnya:

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

Penjelasan:

  • ⎕{... }⎕: baca dua angka, berikan ke fungsi. adalah angka pertama dan merupakan angka kedua.
  • ⌊1+⍺⍟⍵: floor(1+⍺ log ⍵), jumlah digit yang diperlukan untuk mewakili basis .
  • ⍺/⍨: basis untuk setiap digit, jadi direplikasi dengan angka yang baru saja kita hitung.
  • ⍵⊤⍨: mewakili dalam basis yang diberikan (menggunakan angka, sehingga berfungsi untuk semua nilai ).
  • ≡∘⌽⍨: lihat apakah hasilnya sama dengan kebalikannya.
marinus
sumber
3

Perl, 82 77 73 69 byte

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

Angka-angka input diharapkan sebagai garis input STDIN dan hasilnya ditulis sebagai 1atau 0, yang pertama berarti angka pertama adalah palindrom dalam representasi basis yang diberikan.

Sunting 1: Menggunakan $=menyimpan beberapa byte, karena konversi internal ke int.

Sunting 2: Operator smartmatch ~~membandingkan elemen array secara langsung, sehingga konversi ke string tidak diperlukan.

Sunting 3: Optimasi dengan menghapus variabel yang tidak perlu.

65 byte : Jika string kosong dibolehkan sebagai output untuk false, empat byte terakhir dapat dihapus.

Versi tidak disatukan

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

Algoritma menyimpan digit angka yang dikonversi dalam array @a. Kemudian representasi string dari array ini dibandingkan dengan array dalam urutan terbalik. Spasi memisahkan digit.

Heiko Oberdiek
sumber
Maaf, jawaban saya benar-benar sama, tetapi menggunakan $=membiarkan Anda intmelangkah ... Dan pertanyaan berdiri anything you wantsehingga tidak ada yang bisa Anda inginkan ;-)
F. Hauri
@ F. Hauri: Terima kasih, saya akan memperbarui. $=juga diberikan sebagai tip dalam jawaban untuk pertanyaan "Tips untuk bermain golf di Perl" . Pengembalian 0biaya 6 byte tambahan, tetapi kesan saya bahwa pesan tetap tidak dimaksudkan untuk kosong.
Heiko Oberdiek
Hem ,, Kembali 0 biaya 4 byte ekstra, tidak 6. Tapi saya mempertahankan: adalah apa-apa! silence
F. Hauri
@ F. Hauri: Ya, 4 sudah benar, dua byte tambahan adalah tanda kurung dari versi yang tidak diklik.
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()}

nargumen adalah angka, bargumen adalah radix.

Michael M.
sumber
2

Sage, 45

Berjalan di prompt interaktif

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

Mencetak Truesaat palindrom, mencetak Falsesebaliknya

pengguna12205
sumber
2

Perl 54 56 62

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

Untuk diuji:

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

akan memberi:

1

1


1

Jadi output ini 1untuk trueketika palindrom ditemukan dan tidak ada jika yang lain.

Tidak melakukan pelanggaran:

$==<>;                            # 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

Nota :

  • $_ adalah buffer baris saat ini dan kosong di awal.
  • $=adalah variabel yang dipesan , aslinya digunakan untuk pencetakan garis, ini adalah penghitung baris. Jadi variabel ini adalah bilangan bulat , perhitungan apa pun pada ini akan menghasilkan bilangan bulat terpotong seperti jika int()digunakan.
  • $- digunakan untuk bersenang-senang, hanya untuk tidak menggunakan huruf tradisional ... (beberapa kebingungan lagi) ...
F. Hauri
sumber
untuk memperjelas, ini tidak mengatakan apa-apa saat itu bukan palindrom, dan 1 kapan?
durron597
1
Trik yang bagus. Namun salah positif: 21 dengan basis 11. Digit membutuhkan pemisah dalam perbandingan string.
Heiko Oberdiek
Aaaarg +3! @ HeikoOberdiek Anda benar ...
F. Hauri
@ F. Hauri: Juga digitnya dibalik. Jadi 170 dengan basis 16 adalah 0xAA, sebuah palindrome, tetapi hasilnya salah.
Heiko Oberdiek
Aaarg +6! mengonversi ke karakter ...
F. Hauri
1

Mathematica 77 43

IntegerDigits[n,b]mewakili n sebagai daftar angka dalam basis b. Setiap basis-b digit dinyatakan secara desimal.

Misalnya, 16781313 bukan palindrom di basis 17:

IntegerDigits[16781313, 17]

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

Namun, ini adalah palindrom di basis 16:

IntegerDigits[16781313, 16]

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


Jika pasangan yang dipesan dalam contoh di atas dimasukkan,

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

akan kembali

Salah (* (karena {11, 13, 15, 11, 14, 1}! = {1, 14, 11, 15, 13, 11}) *)

Benar (* (karena {1, 0, 0, 1, 0, 0, 1} sama dengan {1, 0, 0, 0, 1, 0, 0, 1}) *)

DavidC
sumber
Aneh, tidak perlu untuk jawaban tetapi saya ingin tahu, bagaimana itu membuat mereka?
durron597
Aku benci kalau aku kalah karena kesalahan
ketik
Mohon jelaskan "typecast".
DavidC
Solusi bijak saya lebih panjang daripada milik Anda dengan 2 karakter karena saya harus memberikan input untuk mengetikInteger
user12205
Sekarang saya mengerti apa yang Anda maksud. Terima kasih.
DavidC
1

Haskell (80 karakter)

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

Sebut saja dengan pali $number $radix. Benar, ketika angka adalah palindrome, Salah jika tidak.

Max Ried
sumber
1

Ruby - 76 karakter

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

Perl 6 , 27 byte (22 tanpa stdin / out)

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

Cobalah online!

  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, raja golf yang dapat dibaca (golves?) (Dan juga beberapa tidak dapat dibaca).

Fungsi Perl 6 (bukan stdin / stdout), 22 byte

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

Cobalah online!

Phil H
sumber
Alasan saya tidak menggunakan basedalam jawaban saya adalah bahwa basehanya mendukung hingga basis 36, dan pertanyaannya meminta untuk mendukung radix hingga32767
Jo King
Ooh, tidak tahu itu. Hmm.
Phil H
0

dg - 97 byte

Mencoba dg :

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

Dijelaskan:

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
rubik
sumber
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);}
  • radix 1 tidak didukung :)
VX
sumber
1
Hanya puts(m)akan bekerja dengan benar?
durron597
printf("%d",m);akan lebih pendek 8 karakter.
VX
0

Haskell - 59

Beberapa perubahan pada jawaban Max Ried.

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

dc, 39 byte

Panjangnya adalah palindrome, tentu saja ( 33₁₂).

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

Nomor dan radix harus di atas tumpukan (di basis nomor saat ini); angka harus minimal 0, dan radix harus minimal 2. Outputnya tjika palindrom dan fjika tidak. Karena tidak ditentukan dalam tantangan, saya berasumsi bahwa angka tidak pernah memiliki angka nol di depan (jadi angka apa pun yang berakhir dengan 0tidak bisa menjadi palindrom).

Penjelasan

Sebagai program lengkap:

#!/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
Toby Speight
sumber
0

LaTeX, 165 byte

Contoh di desmos.com

k, radix, adalah input yang dapat disesuaikan

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)

Jika f(x)=0, xadalah palindrome di pangkalan k.

KEBESARAN
sumber
0

Perl 6 , 34 byte

-4 byte terima kasih kepada PhilH

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

Cobalah online!

Jo King
sumber
Anda dapat menggunakan $ _ alih-alih @r untuk menyimpan 2
Phil H
@ Philip Tidak . (memberikan Seq, bukan Daftar)
Jo King
Ahh, maaf tidak melihat kesalahan
Phil H
@PhilH Tip kedua Anda masih membantu menghemat byte!
Jo King
1
Selalu menyebalkan bahwa tidak ada cara yang lebih singkat untuk memanggil pengurangan meta pada $ _ atau @_.
Phil H
0

05AB1E ,  4  3 byte

вÂQ

Cobalah secara online atau verifikasi semua kasus uji .

Penjelasan:

в      # 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
Kevin Cruijssen
sumber
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);}

Cobalah online!

Kehabisan

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.

Berdasarkan fakta bahwa untuk palindrome, kebalikan dari angka harus sama dengan angka itu sendiri.

Misalkan Anda memiliki nomor ABC tiga digit di beberapa pangkalan. Mengalikannya dengan basis akan selalu menghasilkan ABC0, dan membaginya dengan basis dalam AB dengan C sebagai sisanya. Jadi untuk membalikkan angka kita mengambil digit paling kanan dari nomor asli dan memasukkannya ke kanan pada nomor terbalik. Untuk memberi ruang bagi digit itu, kita gandakan kebalikannya dengan basis sebelumnya.

Pada dasarnya:

n       rev
ABC     0
AB      C
AB      C0
A       CB
A       CB0
0       CBA
gastropner
sumber
Ini keren, bisakah kamu menjelaskan matematika di balik ini?
durron597
@ durron597 Tentu! Menambahkan penjelasan ke pos.
gastropner