X + Y = Z - แต่ในฐานใด


20

ความท้าทาย

ได้รับหมายเลข 3 X, YและZในฐานBหาBASE ซึ่งนอกเหนือจากXและอัตราผลตอบแทนY Zปัจจัยการผลิตx = 20, Y = 12และZ = 32ได้ผล5เพราะ20 + 12 = 32ในฐาน 5

  • คุณอาจคิดว่าจะมีฐานที่การเพิ่มถูกต้องเสมอ (มีบางกรณีที่ไม่มีฐานอยู่ขอขอบคุณ @ MasonWheelerและ @ Not ที่ Charlesสำหรับตัวอย่างบางส่วน)
  • ฐานที่ต่ำที่สุดที่เป็นไปได้คือ 1 คุณอาจใช้ตัวเลข 1 หรือ 0 เป็นตัวเลขได้ แต่คุณไม่สามารถผสมตัวเลขเหล่านั้นได้

I / O

  • ตัวเลขของตัวเลขที่ป้อนจะเป็นจำนวนเต็มไม่เป็นลบ
  • คุณอาจสมมติว่าหมายเลขอินพุตมีศูนย์นำหน้าดังนั้นมีความยาวที่เฉพาะเจาะจง (หรือเท่ากันทั้งหมด)
  • คุณอาจใช้ตัวเลขในรูปแบบที่สะดวกที่สุดตราบใดที่ยังไม่ได้ดำเนินการ ซึ่งรวมถึงรูปแบบโดยรวมของตัวเลขสามตัวและรูปแบบของตัวเลขของแต่ละหมายเลขเหล่านั้น โปรดระบุให้ชัดเจนว่าคุณใช้รูปแบบใด
  • หากมีหลายฐานที่เป็นไปได้คุณสามารถส่งออกทั้งหมดหรือเพียงหนึ่งในนั้น
  • คุณอาจคิดว่าฐานและหมายเลขอินพุตจะอยู่ในขีด จำกัด ตัวเลขของภาษาของคุณ

กฎระเบียบ

  • อนุญาตให้ใช้ฟังก์ชั่นหรือโปรแกรมเต็มรูปแบบ
  • กฎเริ่มต้นสำหรับอินพุต / เอาต์พุต
  • ช่องโหว่มาตรฐานใช้
  • นี่คือดังนั้นจำนวนไบต์ที่น้อยที่สุดจึงชนะ Tiebreaker เป็นการส่งก่อนหน้า

กรณีทดสอบ

รูปแบบการป้อนข้อมูลที่นี่คือรายการจำนวนเต็มเพื่อแทนค่าแต่ละจำนวน รายการทั้งสามจะคั่นด้วยเครื่องหมายจุลภาค
โปรดทราบว่าบางครั้งอาจมีหลายฐานได้ โซลูชันเดียว (สุ่ม) จะแสดงที่นี่

[12, 103], [4, 101], [16, 204] -> 349
[4, 21, 25], [5, 1, 20], [9, 23, 17] -> 28
[16, 11], [25, 94], [41, 105] -> 147
[2, 140], [21, 183], [24, 100] -> 223
[8, 157], [1, 28], [9, 185] -> 227
[2, 158], [88], [3, 12] -> 234
[8, 199], [1, 34], [9, 233] -> 408
[3, 247], [7, 438], [11, 221] -> 464
[3, 122], [3, 2], [6, 124] -> 480
[6, 328], [3, 31], [9, 359] -> 465
[2, 1, 0, 0, 0, 0], [1, 2, 0, 0, 1, 0, 1, 0], [1, 2, 2, 1, 1, 0, 1, 0] - > 3
[16, 105], [16, 120], [33, 84] -> 141
[15, 60], [9, 30], [24, 90] -> 268
[2, 0], [1, 2], [3, 2] -> 5
[1, 3, 3, 7], [1, 2, 3], [1, 4, 6, 0] -> 10
[0], [1, 12, 8], [1, 12, 8] -> 16
[1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1], [1, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0 , 1], [1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1, 0] -> 2
[1], [1], [1,1] -> 1

คุณสามารถสร้างกรณีทดสอบเพิ่มเติมด้วยโปรแกรม Pythนี้ ป้อนฐานในบรรทัดแรกและค่าทศนิยมสำหรับXและYในสองบรรทัดต่อไปนี้
นอกจากนี้คุณสามารถใช้โปรแกรม Pyth นี้เพื่อสร้างกรณีทดสอบหลายรายการพร้อมกันโดยใช้ค่าสุ่ม เพียงแค่ใส่จำนวนกรณีทดสอบที่ต้องการในอินพุต

Happy Coding!


คำตอบ:


12

เยลลี่, 16 11 7 ไบต์

_/N,‘FṀ

วิธีนี้ขึ้นอยู่กับคำตอบอ็อกเทฟของ @ beaker เป็นอย่างมาก

รูปแบบการป้อนข้อมูลคือZ, Y, Xพร้อมลำดับหลักเล็ก ๆ น้อย ๆ โดยใช้ตัวเลข0สำหรับเป็นเลขคู่

ลองออนไลน์! หรือเรียกใช้กรณีทดสอบทั้งหมด

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

แทนที่จะเพิ่มขึ้นทดสอบฐานศักยภาพแก้นี้พหุนามที่สอดคล้องกับอาร์เรย์P = X + Y - Z ผลตอบแทนนี้ทั้งค่าสัมประสิทธิ์ที่ใหญ่ที่สุดของP ≠ 0 - ซึ่งจะต้องมีรากเนื่องจากมีอย่างน้อยหนึ่งฐานที่ถูกต้อง - หรือหลักสูงสุดของX , YและZ , เพิ่มขึ้นทีละ1

_/N,‘FṀ  Main link. Argument: [Z, Y, X]

_/       Reduce by subtraction; yield Z - X - Y.
         This works since Z must have at least as many digits as X and Y.
  N      Negate to yield X + Y - Z.
    ‘    Yield [Z, Y, X], with all digits increments by 1.
   ,     Pair the results to the left and to the right.
     F   Flatten the resulting, nested list.
      Ṁ  Compute the maximum.

11

Pyth, 13 ไบต์

f!-FiRTQheSsQ

คาดว่า Z ตามด้วย X และ Y

ชุดทดสอบ

โดยพื้นฐานแล้วเราทดสอบทุกฐานที่เป็นไปได้เริ่มต้นที่มากกว่าหนึ่งหลักที่ใหญ่ที่สุด การทดสอบคือการที่เราแปลงตัวเลขแต่ละตัวให้เป็นฐานที่มีปัญหาจากนั้นจึงทำการลบการลบตัวเลขและลบล้างผลลัพธ์อย่างมีเหตุผล


5
ดังนั้นอันนี้ไม่ต้องสนใจเป็นศูนย์?
คดีฟ้องร้องกองทุนโมนิก้า

3
@QPaysTaxes ฉันเดาว่าคุณหมายถึงความเป็นเอกภาพและใช่
Mego

4
@Mego ฉันหมายถึง unary การแก้ไขอัตโนมัติหมายถึงสิ่งที่มันต้องการจะหมายถึง
คดีฟ้องร้องกองทุนโมนิก้า

10

อ็อกเทฟ, 67 75 38 32 ไบต์

เพราะ "วนรอบทุกสิ่ง" ทำงานมากเกินไป

@(x,y,z)max([m=max(x+y-z) z])+~m

ต้องใช้การเติม 0 เพื่อทำให้อาร์เรย์อินพุตมีขนาดเท่ากันเช่น:

[2, 158],[88],[3, 12]
becomes
[2, 158],[0, 88],[3, 12]

เนื่องจาก0จะใช้สำหรับการขยาย1จะใช้เป็นโทเค็นสำหรับเอกภาพ

(ขอบคุณ@DenkerAffeสำหรับการชี้แจงในคำถาม)

เรียกใช้ตัวอย่างในideone


คำอธิบายสั้น ๆ :

ทำคดีที่ไม่เกี่ยวข้องกับการอุ้ม:

   [ 8, 199]
 + [ 1,  34]
 -------------
     9, 233
 - [ 9, 233]
 -------------
     0,   0 --- no carries

ในกรณีนี้ไม่มีข้อ จำกัด ในฐานตราบใดที่มันมากกว่า "หลัก" ใด ๆ ใช้องค์ประกอบสูงสุดของz(ตามz >= x,y) และเพิ่ม 1 (หรือจำนวนเต็มบวกใด ๆ )

ในกรณีที่มีการพกพา (โดยไม่มีการพกพา) เราได้ฐานในคอลัมน์ใดคอลัมน์หนึ่งและความแตกต่างระหว่างx+yและzเป็นฐาน:

   [ 2, 140]
 + [21, 183]
--------------
    23, 323
 - [24, 100]
 -------------
    -1  223
     ^   ^------ base
     |---------- carry in

base+(-1)ถ้าผลรวมคอลัมน์ที่สองยังเกินฐานที่ต้องนำติดตัวออกมาเช่นเดียวกับการดำเนินการในมูลค่าของมันจะเป็น เราจะมีคอลัมน์อยู่ทางด้านขวาพร้อมกับการยกออกและไม่มีการพกพาที่มีค่าฐานที่ถูกต้อง (มากขึ้น)


9

Haskell, 90 73 ไบต์

f l=[b|b<-[1..],all(<b)$id=<<l,[x,y,z]<-[foldl((+).(b*))0<$>l],x+y==z]!!0

ตัวอย่างการใช้งาน: ->f [[3, 247],[7, 438],[11, 221]]464

ลองใช้ฐานทั้งหมดb(ซึ่งbมากกว่าตัวเลขสูงสุด) x+y==zเลือกคนแรกที่

แก้ไข: @xnor import Data.Digitsบันทึกจำนวนไบต์โดยส่วนใหญ่การกำจัด


1
หากunDigits bทำในสิ่งที่ฉันคิดว่าควรใช้ให้สั้นลงfoldl(\x y->b*x+y)0หรือเท่าfoldl((+).(b*))0กัน
xnor

1
มันสั้นกว่าที่จะใช้หลังจากแฟบ:maximum b<-[1+(maximum$id=<<l)..]
xnor

1
หรือการทดสอบสำหรับการเป็นmaximum b<-[1..],all(<b)$id=<<l
xnor

ใช้งานได้กับอินพุตโดยที่ base 1 เป็นโซลูชันเดียวหรือไม่ ฉันไม่สามารถดำเนินการนี้กับคอมไพเลอร์ออนไลน์ที่ฉันพบดังนั้นฉันจึงไม่สามารถทดสอบตัวเองได้
Denker

@DenkerAffe: ตัวเลขdของเลขฐานbไม่ควรเป็น0 <= d < bดังนั้นหลักสำหรับเลขฐาน1ที่เป็นไปได้เท่านั้นคือ0อะไร? ประเมินf [[0],[0],[0,0]] 1
nimi

8

MATL , 20 ไบต์

`GY:@XJZQ2:"wJZQ-]]J

อินพุตอยู่ในรูปแบบ (วงเล็บปีกกาหมายเหตุด้านนอก):

{[4, 21, 25],[5, 1, 20],[9, 23, 17]}

งานนี้ในรุ่นปัจจุบัน (15.0.0)

ลองออนไลน์!

คำอธิบาย

`        % do...while index
  G      %   push input. First time pushed nothing but asks for input implicitly
  Y:     %   unpack the cell array, pushing the three numeric arrays
  @      %   loop index: candidate base
  XJ     %   copy into clipboard J
  ZQ     %   evaluate polynomial: interpret third array in that base
  2:"    %   for loop: do this twice (subtract the other numbers from the third)
    w    %     swap, to process another array
    J    %     push base
    ZQ   %     evaluate polynomial: interpret array in that base
    -    %     subtract
  ]      %   end for loop. A result 0 indicates a solution has been found
]        % end do....while loop. Exit if top of stack is 0
J        % push found base. Implicitly display

8

MATL, 13 12 ไบต์

--X>t~1G+hX>

การแปลคำตอบระดับแปดคำของฉันเป็น MATL (คำตอบ MATL แรกของฉัน!)

  • ลำดับการป้อนข้อมูลคือZ, X, Y(หรือZ, Y, Xถ้าคุณต้องการฉันง่าย)
  • อาร์เรย์ที่ป้อนมีความยาวเป็นศูนย์จนถึงมีความยาวเท่ากัน
  • ใช้สิ่งที่ไม่ดึงดูดเป็น 1

ลองออนไลน์!

คำอธิบาย

--X>t~1G+hX>

--            % M = Z - X - Y
  X>          % P = max(M)
    t~        % Duplicate and negate
      1G      % Push 1st argument (Z) 
        +     % ~P + Z
         h    % Concatenate [P (~P + Z)]
          X>  % Return max

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