X + Y = Z - nhưng ở cơ sở nào?


20

Các thách thức

Cho 3 số X, YZtrong cơ sở B, tìm một Base trong đó bổ sung XYsản lượng Z. Các đầu vào x = 20, Y = 12Z = 32có thể mang lại 520 + 12 = 32trong cơ sở 5.

  • Bạn có thể cho rằng sẽ luôn có một cơ sở trong đó bổ sung là chính xác (có những trường hợp không có cơ sở tồn tại, nhờ @ MasonWheeler và @ Không phải Charles cho một số ví dụ về điều đó).
  • Cơ sở thấp nhất có thể là 1. Bạn có thể sử dụng 1s hoặc 0 làm các chữ số trong unary, nhưng bạn không thể trộn lẫn chúng.

Tôi / O

  • Các chữ số của các số đầu vào sẽ là các số nguyên không âm.
  • Bạn có thể giả sử rằng các số đầu vào chứa các số 0 đứng đầu, do đó, có độ dài cụ thể (hoặc tất cả giống nhau).
  • Bạn có thể lấy các số ở định dạng thuận tiện nhất, miễn là nó không được xử lý trước. Điều này bao gồm định dạng chung của ba số đầu vào và định dạng các chữ số của mỗi số đó. Vui lòng làm rõ định dạng bạn sử dụng.
  • Nếu có nhiều cơ sở có thể, bạn có thể xuất tất cả hoặc chỉ một trong số chúng.
  • Bạn có thể giả định rằng số cơ sở và số đầu vào sẽ nằm trong giới hạn số của ngôn ngữ của bạn.

Quy tắc

Các trường hợp thử nghiệm

Định dạng đầu vào ở đây là danh sách các số nguyên để thể hiện mỗi số. Ba danh sách được phân tách bằng dấu phẩy.
Lưu ý rằng đôi khi có nhiều cơ sở có thể. Chỉ có một giải pháp (ngẫu nhiên) được xuất ra ở đây.

[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, 0, 0 , 1], [1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 1, 0] -> 2
[1], [1], [1,1] -> 1

Bạn có thể tạo các trường hợp thử nghiệm bổ sung với chương trình Pyth này . Nhập một cơ sở trên dòng đầu tiên và các giá trị thập phân cho XYtrên hai dòng sau.
Ngoài ra, bạn có thể sử dụng chương trình Pyth này để tạo nhiều trường hợp thử nghiệm cùng một lúc bằng cách sử dụng các giá trị ngẫu nhiên. Chỉ cần nhập số lượng trường hợp thử nghiệm mong muốn trong đầu vào.

Chúc mừng mã hóa!


Câu trả lời:


12

Thạch, 16 11 7 byte

_/N,‘FṀ

Cách tiếp cận này chủ yếu dựa trên câu trả lời Octave của @ beaker .

Định dạng đầu vào là Z, Y, X , với thứ tự chữ số cuối nhỏ, sử dụng chữ số 0 cho unary.

Hãy thử trực tuyến! hoặc chạy tất cả các trường hợp thử nghiệm .

Làm thế nào nó hoạt động

Thay vì từng bước kiểm tra các cơ sở tiềm năng, giải quyết điều này các đa thức rằng tương ứng với mảng P: = X + Y - Z . Điều này trả về hệ số lớn nhất của P 0 - phải là một gốc, vì có ít nhất một cơ sở hợp lệ - hoặc chữ số cao nhất của X , YZ , tăng thêm 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

Bình thường, 13 byte

f!-FiRTQheSsQ

Mong đợi Z, tiếp theo là X và Y.

Bộ kiểm tra

Về cơ bản, chúng tôi kiểm tra mọi cơ sở có thể, bắt đầu từ một chữ số lớn hơn. Bài kiểm tra là chúng tôi chuyển đổi từng số thành cơ sở được đề cập, sau đó gấp phép trừ trên các số đó và phủ nhận một cách hợp lý kết quả.


5
Vì vậy, cái này mất hấp dẫn như số không?
Vụ kiện của Quỹ Monica

3
@QPaysTaxes Tôi đoán bạn có nghĩa là unary, và vâng.
Mego

4
@Mego Ý tôi là unary, tự động sửa nghĩa là bất cứ điều gì nó muốn nói.
Vụ kiện của Quỹ Monica

10

Tháng mười, 67 75 38 32 byte

Bởi vì "vòng lặp trên TẤT CẢ mọi thứ" là quá nhiều công việc.

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

Yêu cầu 0 đệm để làm cho các mảng đầu vào có cùng kích thước, ví dụ:

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

Kể từ khi 0 được sử dụng để đệm, 1được sử dụng làm mã thông báo cho unary.

(Nhờ vào @DenkerAffe đã làm rõ trong câu hỏi.)

Mẫu chạy trên ideone .


Giải thích ngắn gọn:

Lấy một trường hợp không liên quan đến mang:

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

Trong trường hợp này, không có hạn chế nào trên cơ sở miễn là nó lớn hơn bất kỳ "chữ số" nào. Chỉ cần lấy phần tử tối đa của z(as z >= x,y) và thêm 1 (hoặc bất kỳ số nguyên dương nào).

Trong trường hợp thực hiện (không mang theo), chúng tôi đã vượt quá cơ sở ở một trong các cột và sự khác biệt giữa x+yzlà cơ sở:

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

Nếu tổng của cột thứ hai cũng vượt quá cơ sở, đòi hỏi phải mang theo cũng như mang theo, giá trị của nó sẽ là base+(-1). Chúng ta sẽ có một cột ở đâu đó bên phải với phần mang ra và không có phần mang có giá trị cơ bản (lớn hơn) chính xác.


9

Haskell, 90 73 byte

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

Ví dụ sử dụng: f [[3, 247],[7, 438],[11, 221]] -> 464.

Đơn giản chỉ cần thử tất cả các cơ sở b(nơi blớn hơn mức tối đa của các chữ số). Chọn cái đầu tiên ở đâu x+y==z.

Chỉnh sửa: @xnor đã lưu nhiều byte bằng cách chủ yếu loại bỏ import Data.Digits.


1
Nếu unDigits blàm những gì tôi nghĩ, nó nên ngắn hơn để thực hiện như foldl(\x y->b*x+y)0hoặc tương đương foldl((+).(b*))0.
xnor

1
Nó ngắn hơn để lấy maximumsau khi làm phẳng : b<-[1+(maximum$id=<<l)..].
xnor

1
Hoặc, các thử nghiệm cho maximumnhư b<-[1..],all(<b)$id=<<l.
xnor

Điều này có làm việc cho đầu vào trong đó cơ sở 1 là giải pháp duy nhất? Tôi không thể thực hiện điều này với các trình biên dịch trực tuyến mà tôi đã tìm thấy, vì vậy tôi không thể tự kiểm tra.
Denker

@DenkerAffe: không nên là các chữ số dcủa một bsố cơ sở 0 <= d < b, vậy đối với cơ sở 1, chữ số duy nhất có thể là 0? f [[0],[0],[0,0]]đánh giá để 1.
nimi

8

MATL , 20 byte

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

Đầu vào có định dạng (lưu ý dấu ngoặc nhọn bên ngoài):

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

Điều này hoạt động trong phiên bản hiện tại (15.0.0) .

Hãy thử trực tuyến!

Giải trình

`        % 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 byte

--X>t~1G+hX>

Bản dịch câu trả lời Octave của tôi thành MATL. (Câu trả lời MATL đầu tiên của tôi!)

  • Thứ tự đầu vào là Z, X, Y(hoặcZ, Y, X nếu bạn thích, tôi dễ)
  • Mảng đầu vào được đệm bằng 0 đến độ dài bằng nhau
  • Có những điểm không hấp dẫn là 1

Hãy thử trực tuyến!

Giải trình

--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 rất không hấp dẫn bởi AutoC chính xác những ngày này
Charlie
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.