ตรวจสอบว่าจำนวนเต็มเป็น palindrome ใน radix ที่กำหนด (ฐาน)


11

เขียนโปรแกรมที่อ่านจาก stdin สองจำนวนเต็มแต่ละบรรทัดใหม่ถูกยกเลิกหลังจากนี้เรียกว่า "number" และ "radix" และ:

  1. พิมพ์ข้อความการแก้ไขใด ๆ ที่คุณต้องการถ้าตัวเลขเป็น palindrome ในสมุฎฐานที่ (เช่นtrue, t, 1)
  2. พิมพ์ข้อความใด ๆ ที่แตกต่างกันคงที่คุณต้องการถ้าจำนวนไม่ได้เป็น palindrome ในสมุฎฐานที่ (เช่นfalse, f, 0ฯลฯ )
  3. ข้อความเหล่านี้จะต้องเหมือนกันต่อการวิ่งแต่ละครั้ง แต่ไม่มีกฎเกี่ยวกับสิ่งที่พวกเขาจะต้อง (สิ่งที่ดีที่สุดสำหรับการเล่นกอล์ฟ)
  4. คุณอาจจะสมมติว่าอินพุตนั้นถูกต้องซึ่งเป็นจำนวนเต็มบวกสองตัว "จำนวน" จะไม่เกิน2147483647"กี่" 32767จะไม่เกิน
  5. คุณไม่สามารถใช้ทรัพยากรภายนอกได้ แต่คุณสามารถใช้ฟังก์ชันคณิตศาสตร์ใดก็ได้ที่มีให้โดยค่าเริ่มต้นในภาษาของคุณ

หมายเหตุ: radix เป็นเพียงฐานของตัวเลข

ตัวอย่างการวิ่ง:

16
10
false

16
3
true

16
20
true

121
10
true

5
5
false

12346
12345
true

16781313
64
true

16781313
16
true

หมายเหตุ: radix เป็นเพียงฐานของตัวเลข

ดูดีตอนนี้ คุณอาจต้องการแบนทรัพยากรภายนอก

ตัวอย่างเช่น @ user2509848 hmmm?
durron597

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

ข้อความที่กำหนดอย่างใดอย่างหนึ่งสามารถเป็นสตริงว่างได้ (สมมติว่าอีกข้อความนั้นเป็นสตริงที่ไม่ว่างเปล่า)
Toby Speight

คำตอบ:


5

คุณลักษณะสองชั้น J (23 ถ่าน) และ K (19)

ภาษาทั้งสองมีความคล้ายคลึงกันมากทั้งโดยทั่วไปและในกอล์ฟที่เฉพาะเจาะจงนี้ นี่คือ J:

(-:|.)#.^:_1~/".1!:1,~1
  • ,~1- ผนวกหมายเลข 1 1 1กับตัวเองทำให้อาร์เรย์
  • 1!:1- อ่านสองสายจากคีย์บอร์ด ( 1!:1คืออ่านและ1เป็นหมายเลขอ้างอิงไฟล์ / หมายเลขสำหรับคีย์บอร์ด)
  • ". - แปลงแต่ละสายเป็นตัวเลข
  • #.^:_1~/- วิธีการที่จะหาF~/ x,y y F xของเราFคือ#.^:_1ซึ่งดำเนินการขยายฐาน
  • (-:|.)- อาร์กิวเมนต์ตรงกับ ( -:) reverse ( |.) หรือไม่ 1สำหรับใช่0สำหรับไม่

และนี่คือ K:

a~|a:_vs/|.:'0::'``
  • 0::'``- อ่านใน ( 0::) สตริงสำหรับแต่ละ'บรรทัด( ) จากคอนโซล ( `เป็นตัวจัดการไฟล์สำหรับสิ่งนี้)
  • .:'- แปลง ( .:) แต่ละ'สตริง( ) เป็นตัวเลข
  • _vs/|- กลับคู่ของตัวเลขเพื่อให้ radix อยู่ข้างหน้าหมายเลขแล้วใส่ ( /) ฟังก์ชันการขยายฐาน_vs("เวกเตอร์จากสเกลาร์") ระหว่างพวกเขา
  • a~|a:- กำหนดส่วนขยายนี้เป็นผลลัพธ์aจากนั้นตรวจสอบว่าaจับคู่ ( ~) ย้อนกลับ ( |) หรือไม่ อีกครั้ง1สำหรับใช่0เพื่อไม่

@ ak82 ฉันเชื่อว่ามันน่าสนใจกว่าวิธีนี้
John Dvorak

8

GolfScript 10 ตัวอักษร

~base.-1%=

นั่นเป็นวิธีที่ง่ายสำหรับ GolfScript ถ้าเราทำอย่างตรงไปตรงมา ผลลัพธ์คือ0/ 1สำหรับเท็จ / จริง

~       # 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+⍺⍟⍵}⎕

ผลลัพธ์0หรือ1เช่น:

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

คำอธิบาย:

  • ⎕{... }⎕: อ่านตัวเลขสองตัวส่งผ่านไปยังฟังก์ชัน เป็นหมายเลขแรกและเป็นหมายเลขที่สอง
  • ⌊1+⍺⍟⍵: floor(1+⍺ log ⍵)จำนวนตัวเลขที่จำเป็นเพื่อเป็นตัวแทนในฐาน
  • ⍺/⍨: ฐานสำหรับแต่ละหลักดังนั้นทำซ้ำโดยตัวเลขที่เราเพิ่งคำนวณ
  • ⍵⊤⍨: แสดงในฐานที่กำหนด (ใช้ตัวเลขดังนั้นจึงใช้ได้กับค่าทั้งหมดของ)
  • ≡∘⌽⍨: ดูว่าผลลัพธ์เท่ากับย้อนกลับหรือไม่

3

Perl, 82 77 73 69 ไบต์

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

คาดว่าหมายเลขอินพุตจะเป็นบรรทัดอินพุตของ STDIN และผลลัพธ์จะถูกเขียนเป็น1หรือ0อดีตความหมายที่หมายเลขแรกคือ palindrome ในการเป็นตัวแทนของฐานที่กำหนด

แก้ไข 1:การใช้$=บันทึกบางไบต์เนื่องจากการแปลงภายในเป็น int

แก้ไข 2:ตัวดำเนินการ smartmatch ~~เปรียบเทียบองค์ประกอบอาร์เรย์โดยตรงดังนั้นจึงไม่จำเป็นต้องแปลงเป็นสตริง

แก้ไข 3: การเพิ่มประสิทธิภาพโดยลบตัวแปรที่ไม่จำเป็นออก

65 ไบต์ : หากสตริงว่างได้รับอนุญาตเป็นเอาท์พุทfalseสามารถลบสี่ไบต์สุดท้ายได้

เวอร์ชันที่ไม่ดี

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

@aขั้นตอนวิธีการเก็บตัวเลขของจำนวนแปลงในอาร์เรย์ จากนั้นการแทนค่าสตริงของอาร์เรย์นี้จะถูกเปรียบเทียบกับอาร์เรย์ในลำดับย้อนกลับ ช่องว่างแยกตัวเลข


ขออภัยคำตอบของฉันคือ Aproach เดียวกันจริงๆ แต่ใช้$=ให้คุณ whipe intขั้นตอน ... และขาตั้งคำถามสำหรับanything you wantดังนั้นไม่มีอะไรอาจจะเป็นสิ่งที่คุณต้องการ ;-)
เอฟ HAURI

@ F.Hauri: ขอบคุณฉันจะอัปเดต $=นอกจากนี้ยังจะได้รับเป็นเคล็ดลับในคำตอบนี้กับคำถาม"เคล็ดลับสำหรับการเล่นกอล์ฟใน Perl" การส่งคืน0ค่าใช้จ่ายเพิ่มเติม 6 ไบต์ แต่มันก็เป็นความประทับใจของฉันที่ข้อความคงไม่ได้ตั้งใจที่จะว่างเปล่า
Heiko Oberdiek

เหม ,, กลับ0ค่าใช้จ่าย 4 ไบต์พิเศษไม่ 6. แต่ผมรักษา: คืออะไร! silence
F. Hauri

@ F.Hauri: ใช่ 4 ถูกต้องสองไบต์พิเศษเป็นวงเล็บของรุ่นที่ไม่ได้รับการอวด
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อาร์กิวเมนต์คือตัวเลขbอาร์กิวเมนต์คือ radix


2

Sage, 45

ทำงานในพรอมต์แบบโต้ตอบ

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

พิมพ์Trueเมื่อเป็น palindrome พิมพ์เป็นFalseอื่น


2

Perl 54 56 62

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

ที่จะทดสอบ:

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

จะให้:

1

1


1

ดังนั้นการแสดงผลนี้1สำหรับtrueเมื่อ palindrome พบและไม่มีอะไรถ้าอื่น

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

Nota :

  • $_ เป็นบัฟเฟอร์บรรทัดปัจจุบันและว่างเปล่าเมื่อเริ่มต้น
  • $=เป็นตัวแปรที่สงวนไว้ซึ่งเป็นต้นฉบับที่ใช้สำหรับการพิมพ์บรรทัดนี่คือตัวนับบรรทัด ดังนั้นตัวแปรนี้คือจำนวนเต็มการคำนวณใด ๆ เกี่ยวกับสิ่งนี้จะส่งผลให้จำนวนเต็มถูกตัดทอนเช่นถ้าint()ใช้
  • $- ใช้เพื่อความสนุกเพียงเพื่อไม่ใช้ตัวอักษรดั้งเดิม ... (ทำให้งงมากขึ้น) ...

เพื่อความกระจ่างแจ้งนี่ไม่ได้พูดอะไรเมื่อมันไม่ใช่ palindrome และ 1 เมื่อมันคืออะไร?
durron597

1
เทคนิคที่ดี อย่างไรก็ตามข้อผิดพลาดที่เป็นบวก: 21 กับฐาน 11 ตัวเลขต้องการตัวคั่นในการเปรียบเทียบสตริง
Heiko Oberdiek

Aaaarg +3! @HeikoOberdiek คุณถูกต้องฉ ...
F. Hauri

@ F.Hauri: ตัวเลขก็กลับกันได้เช่นกัน ดังนั้น 170 ที่มีฐาน 16 คือ 0xAA ซึ่งเป็น palindrome แต่ผลลัพธ์นั้นเป็นเท็จ
Heiko Oberdiek

Aaarg +6! แปลงเป็นตัวอักษร ...
F. Hauri

1

Mathematica 77 43

IntegerDigits[n,b]แทน n เป็นรายการของตัวเลขในฐาน b แต่ละตัวเลขฐานขแสดงเป็นทศนิยม

ตัวอย่างเช่น 16781313 ไม่ใช่ palindrome ในฐาน 17:

IntegerDigits[16781313, 17]

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

อย่างไรก็ตามมันเป็น palindrome ในฐาน 16:

IntegerDigits[16781313, 16]

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


หากคู่ที่สั่งซื้อในตัวอย่างข้างต้นถูกป้อน

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

จะกลับมา

เท็จ (* (เพราะ {11, 13, 15, 11, 14, 1}! = {1, 14, 11, 15, 13, 11}) *)

True (* (เพราะ {1, 0, 0, 1, 0, 0, 1} เท่ากับ {1, 0, 0, 1, 0, 0, 0, 1}))


แปลกไม่จำเป็นสำหรับคำตอบ แต่ฉันอยากรู้อยากเห็นมันทำให้พวกเขาได้อย่างไร
durron597

ฉันเกลียดเมื่อฉันสูญเสียเพราะ typecast โง่ ...
user12205

กรุณาอธิบาย "typecast"
DavidC

ผู้รอบรู้ของฉันมีความยาวมากกว่าตัวคุณ 2 ตัวเพราะฉันต้องใส่อินพุตให้พิมพ์Integer
user12205

ตอนนี้ฉันเข้าใจสิ่งที่คุณหมายถึง ขอบคุณ
DavidC

1

Haskell (80 ตัวอักษร)

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

pali $number $radixเรียกมันว่าด้วย จริงเมื่อจำนวนคือ palindrome, False ถ้าไม่ใช่



1

Perl 6 , 27 ไบต์ (22 ไม่มี stdin / out)

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

ลองออนไลน์!

  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, ราชาแห่งนักกอล์ฟที่อ่านได้ (golves?) (และบางอันก็ไม่สามารถอ่านได้)

ฟังก์ชันPerl 6 (ไม่ใช่ stdin / stdout), 22 ไบต์

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

ลองออนไลน์!


เหตุผลที่ฉันไม่ได้ใช้baseในคำตอบของฉันก็คือbaseรองรับได้สูงสุด 36 ฐานและคำถามขอให้สนับสนุน Radixes จนถึง32767
King King

โอ้ไม่ทราบว่า อืมมม
ฟิล H

0

dg - 97 ไบต์

ลองใช้dg :

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

อธิบาย:

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);}
  • ไม่รองรับ radix 1 :)

1
เพียงแค่puts(m)จะทำงานใช่มั้ย?
durron597

printf("%d",m);จะสั้นลง 8 ตัวอักษร
VX

0

Haskell - 59

มีการเปลี่ยนแปลงเล็กน้อยในคำตอบของ Max Ried

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


0

dc, 39 ไบต์

ความยาวเป็น Palindrome แน่นอน ( 33₁₂)

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

หมายเลขและเลขฐานจะอยู่ด้านบนสุดของสแต็ก (ในฐานหมายเลขปัจจุบัน) ตัวเลขต้องมีอย่างน้อย 0 และต้องมีอย่างน้อย 2 radix เอาต์พุตคือtถ้ามันเป็น palindrome และfถ้าไม่ใช่ ในขณะที่มันไม่ได้ระบุไว้ในความท้าทายที่ผมเคยคิดว่าตัวเลขที่ไม่เคยมีเลขศูนย์นำ (เพื่อให้หมายเลขใด ๆ ในตอนจบ0ไม่สามารถ palindrome ก)

คำอธิบาย

ในฐานะโปรแกรมเต็มรูปแบบ:

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

Perl 6 , 34 ไบต์

-4 ไบต์ขอบคุณ PhilH

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

ลองออนไลน์!


คุณสามารถใช้ $ _ แทน @r เพื่อบันทึก 2
Phil H

@PhilH Nope (มอบหมาย Seq ไม่ใช่รายการ)
Jo King

อ่าขอโทษที่ไม่เห็นข้อผิดพลาด
ฟิลเอช

@PhilH เคล็ดลับที่สองของคุณยังช่วยประหยัดไบต์!
Jo King

1
น่ารำคาญอยู่เสมอว่าไม่มีวิธีที่สั้นกว่าในการโทรหาลดเมตาบน $ _ หรือ @_
ฟิล H

0

05AB1E ,  4  3 ไบต์

вÂQ

ลองมันออนไลน์หรือตรวจสอบกรณีทดสอบทั้งหมด

คำอธิบาย:

в      # 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 ไบต์

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

ลองออนไลน์!

rundown

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.

ตามข้อเท็จจริงที่ว่าสำหรับ palindrome การย้อนกลับของตัวเลขต้องเท่ากับจำนวนตัวเอง

สมมติว่าคุณมี ABC สามหลักในบางฐาน การคูณด้วยฐานจะส่งผลให้ ABC0 เสมอและหารด้วยฐานใน AB ด้วย C เป็นส่วนที่เหลือ ดังนั้นในการกลับจำนวนที่เราเลือกตัวเลขที่ถูกต้องที่สุดจากหมายเลขเดิมและแทรกไปทางขวาบนหมายเลขที่กลับรายการ เพื่อให้มีที่ว่างสำหรับหลักนั้นเราคูณกลับด้วยฐานก่อนมือ

โดยทั่วไป:

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

นี่มันเจ๋งคุณอธิบายคณิตศาสตร์ได้ไหม?
durron597

@ durron597 แน่นอน! เพิ่มคำอธิบายลงในโพสต์
Gastropner
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.