Belirli bir yarıçapta (taban) bir tamsayının palindrom olup olmadığını belirleme


11

Her biri yeni satır sonlandırılmış, bundan böyle "sayı" ve "sayı tabanı" olarak adlandırılan iki tamsayıdan okunan bir program yazın ve:

  1. Sayı o yarıçaptaki bir palindromsa istediğiniz sabit mesajı yazdırır (ör true. t, 1)
  2. Numarası o tabanda bir palindrom (örn değilse istediğiniz herhangi farklı sabit mesaj yazdırır false, f, 0vs.)
  3. Bu mesajlar her koşu için aynı olmalıdır, ancak ne olması gerektiği hakkında hiçbir kural yoktur (golf için en iyi olanı ne olursa olsun).
  4. Girdinin geçerli olduğunu, iki pozitif tamsayı olduğunu varsayabilirsiniz. "sayı" 2147483647aşılmaz, "sayı tabanı" aşılmaz 32767.
  5. Harici kaynakları kullanamazsınız, ancak varsayılan olarak kendi dilinizde bulunan herhangi bir matematik işlevini kullanabilirsiniz.

Not: sayı tabanı sadece sayının temelidir.

Örnek çalışmalar:

16
10
false

16
3
true

16
20
true

121
10
true

5
5
false

12346
12345
true

16781313
64
true

16781313
16
true

Not: sayı tabanı sadece sayının temelidir.

Şimdi iyi görünüyor. Ancak harici kaynakları yasaklamak isteyebilirsiniz.

@ user2509848 hmmm, örneğin?
durron597

Bir kişi web üzerinde bazlar arasındaki sayıları dönüştüren bir hesap makinesi bulabilirse, neredeyse kesinlikle kullanılacaktır. Son zamanlarda trolly cevapları döküntüsü yaşıyoruz.

Sabit iletilerden biri boş dize olabilir (diğerinin boş olmayan bir dize olduğunu varsayarak)?
Toby Speight

Yanıtlar:


5

J (23 karakter) ve K (19) çift özellik

İki dil hem genel olarak hem de bu özel golfte çok benzer. İşte J:

(-:|.)#.^:_1~/".1!:1,~1
  • ,~1- Diziyi yaparak 1 sayısını kendine ekleyin 1 1.
  • 1!:1- Klavyeden iki dizeyi okuyun ( 1!:1okunacak ve 1klavye girişi için dosya tanıtıcısı / numarasıdır).
  • ". - Her dizeyi bir sayıya dönüştürün.
  • #.^:_1~/- F~/ x,ybulmak demektir y F x. Bizim Fise #.^:_1taban genişletme gerçekleştirir, hangi.
  • (-:|.)- Argüman tersiyle ( -:) eşleşiyor |.mu ( )? 1evet 0için, hayır için.

Ve işte K:

a~|a:_vs/|.:'0::'``
  • 0::'``- Konsoldan 0::her ( ') satır için bir dize okuyun ( ) ( `bunun için dosya tanıtıcısıdır).
  • .:'- .:Her ( ') dizeyi bir sayıya dönüştürün ( ) .
  • _vs/|- Sayı çiftini tersine çevirin, böylece sayı /tabanı sayının önünde olur ve sonra aralarına taban genişletme işlevini _vs("skaler vektör") ekler ( ) .
  • a~|a:- Ortaya çıkan bu genişlemeyi atayın ave ardından tersine ( ) aeşleşip eşleşmediğini ( ~) kontrol edin |. Yine, 1evet 0için, hayır için.

@ ak82 Bu yolların daha ilginç olduğuna inanıyorum
John Dvorak

8

GolfScript, 10 karakter

~base.-1%=

Eğer anlaşılır bir şekilde yaparsak, bu, GolfScript için kolay bir yöntemdir. Çıktı 0/ 1için 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+⍺⍟⍵}⎕

Çıktılar 0veya 1örneğin:

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

Açıklama:

  • ⎕{... }⎕: iki sayıyı oku, işleve ilet. birinci sayı ve ikinci sayıdır.
  • ⌊1+⍺⍟⍵: floor(1+⍺ log ⍵), tabanda temsil etmek için gereken basamak sayısı .
  • ⍺/⍨: her bir basamağın tabanı, bu yüzden az önce hesapladığımız sayı ile çoğaltılır.
  • ⍵⊤⍨: verilen tabanda temsil eder (sayıları kullanarak tüm değerleri için çalışır ).
  • ≡∘⌽⍨: sonucun tersine eşit olup olmadığına bakın.

3

Perl, 82 77 73 69 bayt

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

Girdi sayıları, STDIN'in girdi satırları olarak beklenir ve sonuç, 1veya olarak yazılır 0, ilk anlamı, ilk sayının verilen tabanı temsil ederken bir palindrom olmasıdır.

Düzenleme 1: kullanma $=, int'e dahili dönüşümü nedeniyle bazı baytları kaydeder.

Düzenleme 2: smartmatch operatörü ~~dizi öğelerini doğrudan karşılaştırır, böylece bir dizeye dönüştürmeye gerek yoktur.

Düzenleme 3: Gereksiz bir değişkeni kaldırarak optimizasyon.

65 bayt : Boş dizenin çıktı olarak girilmesine izin verilirse false, son dört bayt kaldırılabilir.

Ungolfed sürümü

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

Algoritma, dönüştürülen sayının rakamlarını bir dizide saklar @a. Daha sonra bu dizinin dize temsili dizi ile ters sırada karşılaştırılır. Boşluklar basamakları ayırır.


Maalesef, cevabım gerçekten aynı yaklaşım, ancak kullanarak adım $=atmaya izin ver int... Ve anything you wanthiçbir şey için soru standı istediğiniz şey olabilir ;-)
F. Hauri

@ F.Hauri: Teşekkürler, güncelleyeceğim. $=Ayrıca ucu olarak verilir Bu yanıt soru için "Perl golf için ipuçları" . Geri gönderme 06 ekstra bayt maliyeti, ancak sabit bir mesajın boş olması tasarlanmadığı izlenimimdi.
Heiko Oberdiek

Hem ,, Dönüş 0 maliyeti 4 ekstra bayt, 6 değil. Ama ben korumak: bir şeydir! silence
F. Hauri

@ F.Hauri: Evet, 4 doğru, fazladan iki bayt, çözülmemiş versiyonun paranteziydi.
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()}

nbağımsız değişken sayı, bbağımsız değişken sayıdır .


2

Adaçayı, 45

Etkileşimli bilgi isteminde çalışır

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

Baskılar Truebir palindrom, yazdırır edilir Falseaksi


2

Perl 54 56 62

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

Test edilecek:

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

verecek:

1

1


1

Bu çıkışın Yani 1için truebir palindrom bulundu ve zaman hiçbir şey else if.

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

Not :

  • $_ geçerli satır arabelleğidir ve başlangıçta boştur.
  • $=a, ayrılmış originaly çizgi baskısı için kullanılan değişken, bu bir satır sayacı. Dolayısıyla bu değişken bir tamsayıdır , buradaki herhangi bir int()hesaplama, kullanılmış gibi kesilmiş bir tamsayı ile sonuçlanır .
  • $- eğlence için kullanılırdı, sadece geleneksel harfleri kullanmamak için ... (biraz daha şaşkınlık) ...

açıklığa kavuşturmak için, bu bir palindrom olmadığında hiçbir şey ve 1 olduğunda?
durron597

1
Güzel numaralar. Ancak yanlış pozitif: 21 taban 11 ile. Rakamlar, string karşılaştırmasında bir ayırıcıya ihtiyaç duyar.
Heiko Oberdiek

Aaaarg +3! @HeikoOberdiek Haklısın ...
F. Hauri

@ F.Hauri: Ayrıca rakamlar tersine çevrilir. Dolayısıyla, 16 tabanlı 170, bir palindrom olan 0xAA'dır, ancak sonuç yanlıştır.
Heiko Oberdiek

Aaarg +6! karakterlere dönüştürülüyor ...
F. Hauri

1

Mathematica 77 43

IntegerDigits[n,b]n, b tabanındaki rakamların bir listesi olarak temsil edilir. Her baz-b basamağı ondalık olarak ifade edilir.

Örneğin, 16781313, temel 17'deki bir palindrom değildir:

IntegerDigits[16781313, 17]

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

Ancak, bir baz 16'da bir palindrom:

IntegerDigits[16781313, 16]

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


Yukarıdaki örneklerde sıralı çiftler girildiyse,

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

dönecekti

Yanlış (* (çünkü {11, 13, 15, 11, 14, 1}! = {1, 14, 11, 15, 13, 11}) *)

Doğru (* (çünkü {1, 0, 0, 1, 0, 0, 1}, {1, 0, 0, 1, 0, 0, 1} 'e eşittir) *)


Garip, cevap için gerekli değil ama merak ediyorum, onları nasıl işler?
durron597

Aptal bir
önsezisi

Lütfen "typecast" i açıklayınız.
DavidC

Adaçayı çözümüm sizden 2 karakter daha uzun çünkü girdiyi yazmak için kullanmam gerekiyorInteger
user12205

Şimdi ne demek istediğini anlıyorum. Teşekkürler.
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)

İle ara pali $number $radix. Doğru, sayı bir palindrom olduğunda, değilse Yanlış.


1

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

1

Perl 6 , 27 bayt (22 adet stdin / out olmadan)

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

Çevrimiçi deneyin!

  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 $_

Okunabilir golflerin kralı Perl6 (golves?) (Ve bazıları da okunamaz).

Perl 6 işlevi (stdin / stdout değil), 22 bayt

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

Çevrimiçi deneyin!


Cevabımda kullanmamamın nedeni base, baseyalnızca 36. kata kadar desteklenmesidir ve soru, en fazla yarıçapı desteklemeyi ister32767
Jo King

Ooh, bunu bilmiyordum. Hmm.
Phil H

0

dg - 97 bayt

Dg deniyor :

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

Açıklaması:

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);}
  • sayı 1 desteklenmez :)

1
Sadece puts(m)doğru çalışır mıydı?
durron597

printf("%d",m);8 karakter daha kısa olacaktır.
VX

0

Haskell - 59

Max Ried'in cevabında birkaç değişiklik yapıldı.

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


0

dc, 39 bayt

Uzunluk elbette bir palindrom ( 33₁₂).

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

Sayı ve sayı tabanı yığının üstünde olmalıdır (geçerli sayı tabanında); sayı en az 0, yarıçap en az 2 olmalıdır. Çıktı tpalindrom ise ve fdeğilse. Meydan okumada belirtilmediğinden, sayıların asla önde gelen sıfırlara sahip olmadığını varsaydım (bu nedenle biten herhangi bir sayı 0palindrom olamaz).

açıklama

Tam bir program olarak:

#!/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 bayt

Desmos.com'da örnek

k, sayı tabanı, ayarlanabilir bir girdidir

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)

Eğer f(x)=0, xtabanda bir palindrom k.


0

Perl 6 , 34 bayt

PhilH sayesinde -4 bayt

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

Çevrimiçi deneyin!


2 kurtarmak için @ r yerine $ _ kullanabilirsiniz
Phil H

@PhilH Hayır . (Liste değil Seq atar)
Jo King

Ahh, üzgünüm hatayı görmedim
Phil H

@PhilH İkinci ipucunuz yine de bayt tasarrufuna yardımcı oldu!
Jo King

1
Çağrı yapmanın daha kısa bir yolu olmadığı her zaman sinir bozucu, $ _ veya @_.
Phil H

0

05AB1E ,  4  3 bayt

вÂQ

Çevrimiçi deneyin veya tüm test senaryolarını doğrulayın .

Açıklama:

в      # 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 bayt

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

Çevrimiçi deneyin!

Bitkin

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.

Bir palindrom için sayının tersi sayının kendisine eşit olmalıdır.

Bazı bazlarda üç basamaklı ABC numaranız olduğunu varsayalım. Baz ile çarpılması her zaman ABC0 ile sonuçlanacak ve AB'de C ile kalan baz olarak bölecektir. Bu nedenle sayıyı tersine çevirmek için orijinal numaradan en sağdaki rakamı seçer ve ters sayıya sağa yerleştiririz. Bu rakama yer açmak için, tersini önceden bazla çarparız.

Temelde:

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

Bu harika, bunun arkasındaki matematiği açıklayabilir misiniz?
durron597

@ durron597 Elbette! Gönderiye bir açıklama eklendi.
gastropner
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.