ฐานบ้า แต่มีเหตุผล


11

เรามีความท้าทายมากมายจากฐาน 10 ฐาน 2 ฐาน 36 หรือแม้แต่ฐาน -10แต่ฐานเหตุผลอื่น ๆ ทั้งหมดเป็นอย่างไร

งาน

กำหนดจำนวนเต็มในฐาน 10 และฐานเหตุผลให้คืนค่าจำนวนเต็มในฐานนั้น (เป็นอาร์เรย์สตริง ฯลฯ )

กระบวนการ

เป็นการยากที่จะจินตนาการถึงฐานที่มีเหตุผลดังนั้นลองจินตนาการภาพโดยใช้Exploding Dots :

พิจารณาภาพเคลื่อนไหวนี้โดยแสดง 17 ในฐาน 3:

ป้อนคำอธิบายรูปภาพที่นี่

แต่ละจุดแทนหน่วยและกล่องแทนตัวเลข: กล่องด้านขวาสุดคือที่ที่หนึ่งกล่องกลางคือที่ 3 ^ 1 และกล่องซ้ายสุดคือที่ 3 ^ 2

เราสามารถเริ่มต้นด้วย 17 จุดในสถานที่หนึ่งของ อย่างไรก็ตามนี่คือฐาน 3 ดังนั้นตำแหน่งต้องน้อยกว่า 3 ดังนั้นเราจึง "ระเบิด" 3 จุดและสร้างจุดบนกล่องทางด้านซ้าย เราทำซ้ำจนกว่าเราจะจบลงด้วยตำแหน่งที่มั่นคงโดยไม่มีจุดที่สามารถระเบิดได้ (เช่น 3 จุดในกล่องเดียวกัน)

ดังนั้น 17 ในฐาน 10 คือ 122 ในฐาน 3


เศษส่วนพื้นฐานคล้ายคลึงกับการกระจายจุดจำนวนหนึ่งไปเป็นจุดมากกว่าหนึ่งจุด ฐาน 3/2 จะระเบิด 3 จุดเพื่อสร้าง 2

แสดง 17 ในฐาน 3/2:

ป้อนคำอธิบายรูปภาพที่นี่

ดังนั้น 17 ในฐาน 10 คือ 21012 ในฐาน 3/2


ฐานลบทำงานคล้ายกัน แต่เราต้องติดตามสัญญาณ (โดยใช้จุดต่อต้านที่มีค่าเท่ากับ -1; แสดงโดยวงกลมเปิด)

แสดง 17 ในฐาน -3:

ป้อนคำอธิบายรูปภาพที่นี่

หมายเหตุมีการระเบิดเป็นพิเศษเพื่อให้เครื่องหมายของกล่องทั้งหมดเหมือนกัน (ละเว้นศูนย์)

ดังนั้น 17 ในฐาน 10 คือ 212 ในฐาน -3

ฐานเหตุผลเชิงลบทำงานคล้ายกันโดยการรวมกันของสองกรณีข้างต้น

กฎระเบียบ

  • ไม่มีช่องโหว่มาตรฐาน
  • เครื่องหมายของแต่ละ "หลัก" ในผลลัพธ์จะต้องเหมือนกัน (หรือศูนย์)
  • ค่าสัมบูรณ์ของตัวเลขทั้งหมดจะต้องน้อยกว่าค่าสัมบูรณ์ของตัวเศษของฐาน
  • คุณอาจคิดว่าค่าสัมบูรณ์ของฐานมากกว่า 1
  • คุณอาจคิดว่าฐานเหตุผลอยู่ในรูปแบบลดลงต่ำสุด
  • คุณอาจใช้ตัวเศษและตัวส่วนของฐานแยกในอินพุต
  • หากตัวเลขมีการแทนหลายแบบคุณสามารถแสดงผลลัพธ์ใด ๆ ก็ได้ (เช่น 12 ในฐาน 10 สามารถเป็น{-2, -8}และ{1, 9, 2}ในฐาน -10)

กรณีทดสอบ:

รูปแบบ: {in, base} -> result

{7, 4/3}        ->  {3, 3}
{-42, -2}       ->  {1, 0, 1, 0, 1, 0}
{-112, -7/3}    ->  {-6, -5, 0, -1, 0}
{1234, 9/2}     ->  {2, 3, 6, 4, 1}
{60043, -37/3}  ->  {-33, -14, -22, -8}

เนื่องจากอินพุตบางตัวอาจมีการแทนหลายแบบฉันแนะนำให้ทดสอบเอาต์พุตโดยใช้ข้อมูลโค้ด Mathematica นี้บน TIO

นี่คือดังนั้นการส่งที่มีจำนวนไบต์สั้นที่สุดในแต่ละภาษาจะชนะ!


สำหรับข้อมูลเพิ่มเติมเกี่ยวกับจุดระเบิดเยี่ยมชมเว็บไซต์โครงการคณิตศาสตร์ระดับโลก ! พวกมันมีสิ่งที่น่าสนใจมากมาย!


คำตอบ:


6

Python 2 , 42 39 ไบต์

n,a,b=input()
while n:print n%a;n=n/a*b

ลองออนไลน์!

ขอบคุณ @xnor ที่ค้นหารูปแบบที่สั้นกว่านี้

รุ่นที่ล้าสมัย (42 ไบต์):

f=lambda n,a,b:n and[n%a]+f(n/a*b,a,b)or[]

ลองออนไลน์!

พารามิเตอร์: อินพุต, ตัวเศษ (พร้อมเครื่องหมาย) และตัวหาร

ส่งคืนอาร์เรย์ซึ่งเป็นตัวเลขต่ำสุดก่อน

สิ่งนี้ใช้งานได้เพราะการหารและโมดูโลใน Python เป็นไปตามเครื่องหมายของส่วนดังนั้นเราไม่ต้องสนใจสัญญาณเดียวกันอย่างชัดเจน

กรณีทดสอบเอาท์พุท:

f(7, 4, 3)       == [3, 3]
f(-42, -2, 1)    == [0, -1, -1, -1, -1, -1, -1]
f(-112, -7, 3)   == [0, -1, 0, -5, -6]
f(1234, 9, 2)    == [1, 4, 6, 3, 2]
f(60043, -37, 3) == [-8, -22, -14, -33]

4
ดูเหมือนว่าโปรแกรมจะสั้นกว่าปกติ
xnor

@ xnor ขอบคุณฉันมักจะลืมวิธีที่จะเขียนอะไรบางอย่าง ...
Bubbler

4

Aheui (esotope) , 91 ไบต์

벙수벙섞벙석
희빠챠쌳뻐삭빠빠싻싸삯라망밣밭따맣사나삮빠싸사땨

ลองออนไลน์!

ใช้เวลาinteger, และnumerator of basedenominator of base

เนื่องจากข้อ จำกัด ของล่าม TIO แต่ละอินพุตต้องลงท้ายด้วยการขึ้นบรรทัดใหม่

การดำเนินงานของ@ Bubbler ของงูหลาม 2 คำตอบ โชคดีที่ล่าม Aheui นี้เขียนด้วย Python ดังนั้นเราจึงสามารถใช้เคล็ดลับเดียวกันได้


4
o_O ภาษานี้บนแผ่นดินโลกคืออะไร ... D:
HyperNeutrino

3

05AB1E , 11 10 ไบต์

[D_#²‰`,³*

ลองออนไลน์!

ใช้เวลาinteger, numerator of baseและdenominator of baseชอบคำตอบทั้งหมด เนื่องจากล่าม 05AB1E ถูกเขียนด้วย Python (?) เคล็ดลับ Python 2 ของ Bubbler สามารถใช้ใน 05AB1E ได้เช่นกัน

คำอธิบาย

[d_ # ²‰ `³ *
[ วนไม่มีสิ้นสุด
 D_ # ถ้าตัวเลขเป็น 0 ให้ออกจากลูป (อินพุตโดยปริยาย
                                         ในการทำซ้ำครั้งแรก)
     ²รับตัวเศษของฐาน
      ‰ Divmod
       `ผลักองค์ประกอบทั้งหมดลงในสแต็ก
        พิมพ์ส่วนที่เหลือ
         ³รับส่วนของฐาน
          * ทวีคูณมัน

ดังนั้นโปรแกรมจะทำงานเหมือนกับรหัส Python นี้:

i1, i2, i3 = input ()
stack = []
ในขณะที่ 1:
 stack = (stack หรือ [i1])
 stack + = [stack [-1]]
 ถ้าไม่ใช่ stack [-1]: break
 stack + = [i2]
 stack = stack [: - 2] + [divmod (stack [-2], stack [-1])]
 stack = stack [: - 1] + รายการ (stack [-1])
 ปึกพิมพ์ [-1]
 stack = stack [: - 1]
 stack + = [i3]
 stack = stack [: - 2] + [stack [-2] * stack [-1]]

11> 10 ขอบคุณนีล


ฉันคิดว่าคุณสามารถใช้_แทนที่0Qนี่
Neil

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