แปลงระหว่างฐานที่สมดุล!


13

ฐานที่สมดุล:

ฐานที่สมดุลเป็นหลักเหมือนกับฐานปกติยกเว้นว่าตัวเลขจะเป็นค่าบวกหรือลบในขณะที่ตัวเลขฐานปกติจะเป็นค่าบวกเท่านั้น

จากที่นี่ในฐานความสมดุลของฐานbอาจจะแสดงเป็นbalb- ฐานความสมดุลเพื่อให้ 4 bal4=

ในคำจำกัดความของความท้าทายนี้ช่วงของตัวเลขในฐานที่สมดุลbคือจาก-(k - 1)ถึงb - kซึ่ง

k = ceil(b/2)

ตัวอย่างของช่วงของตัวเลขในฐานสมดุลต่างๆ:

bal10:
  k = ceil(10/2) = 5
  range = -(5 - 1) to 10 - 5 = -4 to 5
        = -4, -3, -2, -1, 0, 1, 2, 3, 4, 5
bal5:
  k = ceil(5/2) = 3
  range = -(3 - 1) to 5 - 3 = -2 to 2
        = -2, -1, 0, 1, 2

การแสดงตัวเลขในฐานที่สมดุลนั้นเป็นเช่นเดียวกับฐานปกติ ตัวอย่างเช่นการแสดงตัวเลข27(ฐาน 10) ถึงbal4(ฐานสมดุล 4) นั้นเป็น2 -1 -1เพราะ

  2 -1 -1 (bal4)
= 2 * 4^2 + -1 * 4 + -1 * 1
= 32 + (-4) + (-1)
= 27 (base 10)

งาน:

งานของคุณได้รับสามอินพุต:

  • จำนวนที่จะแปลง ( n)
    • อินพุตนี้สามารถยืดหยุ่นได้โปรดดู "ความยืดหยุ่นของ I / O"
  • ฐานซึ่งnอยู่ใน ( b)
  • ฐานซึ่งnจะถูกแปลงเป็น ( c)

2 < b, c < 1,000ที่ไหน

กลับตัวเลขในฐานความสมดุลเป็นตัวแทนของc nผลผลิตยังสามารถมีความยืดหยุ่น

โปรแกรม / ฟังก์ชั่นจะต้องกำหนดความยาวของnอินพุตนั้น

ความยืดหยุ่นของ I / O:

อินพุตnและเอาต์พุตของคุณสามารถแสดงได้ด้วยวิธีเหล่านี้:

  • นิยามภาษาของอาร์เรย์
  • สตริงที่มีอักขระใด ๆ เป็นตัวคั่น (เช่นช่องว่างเครื่องหมายจุลภาค)

ตัวอย่าง:

โปรดทราบว่าสิ่งเหล่านี้ใช้อาร์เรย์ Python เป็นnและเอาต์พุต คุณสามารถใช้สิ่งที่เหมาะกับภาษาของคุณตราบใดที่มันสอดคล้องกับคำจำกัดความของ "I / O Flexibility"

[2, -1, -1] 4 7 = [1, -3, -1]
[1, 2, 3, 4] 9 5 = [1, 2, 2, -1, 2]
[10, -9, 10] 20 5 = [1, 1, 1, -2, 1, 0]

นี่คือดังนั้นรหัสที่สั้นที่สุดในหน่วยไบต์ชนะ!


ในคำตอบแรกของคุณ 4 ไม่ใช่เลข 7 หลักตามกฎหมาย ฉันเชื่อว่าคำตอบควรเป็น [1, -3, -1] และฉันได้รับคำตอบที่แตกต่างกันสำหรับกรณีทดสอบที่สอง ([1,2,2, -1,2]) และกรณีทดสอบที่สาม ([1,1,0, -2,1,0]) เช่นกัน ... ?
เกร็กมาร์ติ

@ GregMartin Ah, โห่ร้อง - ฉันคำนวณมันด้วยมือดังนั้นมันจึงมีปัญหาบางอย่าง ขอบคุณที่สังเกต! คุณสามารถตรวจสอบโซลูชันของคุณซ้ำได้ไหม?
clismique

@GregMartin @ Qwerp-Derp กรณีทดสอบที่สามคือ[1,1,1,-2,1,0]
ngenisis

คำตอบ:


2

Mathematica, 85 ไบต์

#~FromDigits~#2~IntegerDigits~#3//.{p___,a_:0,b_,q___}/;b>⌊#3/2⌋:>{p,a+1,b-#3,q}&

คำอธิบาย

#~FromDigits~#2

การแปลง#1(1 หมายถึง - อินพุต 1 รายการของตัวเลข) ลงในฐานจำนวนเต็ม#2(อินพุต 2)

... ~IntegerDigits~#3

แปลงจำนวนเต็มผลลัพธ์ให้เป็นฐาน#3(อินพุต 3) เพื่อสร้างรายการตัวเลข

... //.{p___,a_:0,b_,q___}/;b>⌊#3/2⌋:>{p,a+1,b-#3,q}

แทนที่รายการตัวเลขซ้ำ ๆ หากตัวเลขนั้นสูงกว่าพื้น ( #3/ 2) ให้ลบออก#3จากนั้นแล้วบวก1ตัวเลขทางด้านซ้าย ถ้ามีอะไรที่อยู่ทางด้านซ้ายใส่และเพิ่ม01


มันมักจะแนะนำให้พูดคุยเกี่ยวกับวิธีแก้ปัญหาของคุณเล็กน้อยและอธิบายให้คนที่อาจไม่รู้จัก Mathematica
ATaco

@ATaco เพิ่มคำอธิบายแล้ว!
JungHwan Min

ฉันประหลาดใจเล็กน้อยจากสิ่งนี้ ฉันไม่เคยเห็นรูปแบบที่เป็นตัวเลือกใช้ได้ทุกที่ยกเว้นคำจำกัดความของฟังก์ชัน คุณไม่ต้องการด้านนอก{...}เนื่องจากมีเพียงกฎการแทนที่เดียว
ngenisis

1
@JungHwanMin p___ทรูผมคิดว่าสิ่งที่ฉันสับสนเป็นวิธีการนี้มีผลต่อการทำงานของ นี้ไม่ได้พบที่สั้นที่สุดp___ตามด้วยa_,b_หรือb_, หรือไม่ก็ตรวจสอบทั้งรูปแบบที่กำหนดให้แต่ละรูปแบบตัวเลือกและมีความก้าวหน้าแล้ววางรูปแบบตัวเลือกจนกว่าจะพบการแข่งขัน (หรือบางตัวเลือกที่สาม)
ngenisis

1
@ngenisis ผมเชื่อว่าผมผิดในความคิดเห็นก่อนหน้า (ลบ) FixedPointList[k=#3;#/.{p___,a_:0,b_,q___}/;b>⌊k/2⌋:>{p,a+1,b-k,q}&, #~FromDigits~#2~IntegerDigits~#3]&สังเกตผลมาจากการ {p___,a_,b_,q___}ถูกจับคู่ก่อน (สำหรับทุกคนที่เป็นไปได้p) จากนั้น{p___,b_,q___}จับคู่ การแทนที่ครั้งที่สองจะใช้เมื่อbอยู่ที่จุดเริ่มต้นเท่านั้นเพราะหากมีจุดbกึ่งกลางที่ตรงตามเงื่อนไข{p___,a_,b_,q___}จะจับคู่แทน
JungHwan Min

1

Perl 6 , 121 ไบต์

->\n,\b,\c{sub f{sum [R,](@^n)Z*($^b X**0..*)}
first {f(b,n)==f c,$_},map {[$_-($_>floor c/2)*c for .base(c).comb]},0..*}

วิธีแก้ปัญหากำลังช้า

มันทำงานอย่างไร:

  • map {[ .base(c).comb]}, 0..*- สร้างลำดับไม่ จำกัด จำนวนขี้เกียจของตัวเลขธรรมชาติในฐานcโดยแต่ละหมายเลขแสดงเป็นอาร์เรย์ของตัวเลข
  • $_ - ($_ > floor c/2) * c- แปลงมันโดยการลบออกcจากแต่ละหลักที่สูงกว่าพื้น (c / 2)
  • first { f(b, n) == f(c, $_) }, ...- รับอาร์เรย์แรกของลำดับนั้นซึ่งเมื่อตีความว่าเป็นcหมายเลขฐานเท่ากับอาร์เรย์อินพุตที่nตีความว่าเป็นbหมายเลขฐาน
  • sub f { sum [R,](@^n) Z* ($^b X** 0..*) }- ฟังก์ชั่นตัวช่วยที่เปลี่ยนอาเรย์@^nเป็นตัวเลขในฐาน$^bโดยนำผลรวมของผลิตภัณฑ์ที่ได้มาโดยการซิปอาเรย์กลับด้านพร้อมลำดับของกำลังของฐาน

1

JavaScript (ES6), 89 ไบต์

(n,b,c,g=(n,d=n%c,e=d+d<c)=>[...(n=n/c+!e|0)?g(n):[],e?d:d-c])=>g(n.reduce((r,d)=>r*b+d))

100 nไบต์งานสำหรับค่าลบของ

(n,b,c,g=(n,d=(n%c+c)%c)=>[...(n-=d,n/=c,d+d<c||(d-=c,++n),n?g(n):[]),d])=>g(n.reduce((r,d)=>r*b+d))

0

Mathematica, 118 114 ไบต์

IntegerDigits[#3~FromDigits~#2,k=⌊#/2⌋;#]//.{{a_,x___}/;a>k:>{1,a-#,x},{x___,a_,b_,y___}/;b>k:>{x,a+1,b-#,y}}&

และเป็นอักขระ 3 ไบต์U+230AและU+230Bตามลำดับ แปลง#3เป็นฐาน10จากฐาน#2จากนั้นแปลงเป็นฐาน#(เพื่อให้อาร์กิวเมนต์ลำดับย้อนกลับจากตัวอย่าง) หากตัวเลขใด ๆ มีค่ามากกว่าจำนวนหลักที่อนุญาตสูงสุดให้k=⌊#/2⌋ลดจำนวนนั้นด้วย#และเพิ่มตัวเลขถัดไปให้สูงขึ้น (อาจต้องเพิ่ม1ล่วงหน้า) kให้ทำเช่นนี้จนกว่าตัวเลขทั้งหมดที่มีน้อยกว่า

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