X + Y = Z - але в якій основі?


20

Змагання

Дано 3 числа X, Yа Zв основі Bзнайдіть Bасе, в якому додавання Xі Yвихід Z. Вхідні дані x = 20, Y = 12і Z = 32можуть дати вихід, 5тому що 20 + 12 = 32в базі 5.

  • Ви можете припустити, що завжди знайдеться база, в якій додавання є правильним (бувають випадки, коли немає бази, завдяки @ MasonWheeler та @ Не тому, що Чарльз наводить деякі приклади цього).
  • Найнижча можлива база - 1. Ви можете використовувати 1s або 0s в якості цифр унарних, але ви не можете їх змішувати.

I / O

  • Цифри вхідних чисел будуть невід’ємними цілими числами.
  • Можна припустити, що вхідні числа містять провідні нулі, тому вони мають конкретну (або все однакову) довжину.
  • Ви можете приймати номери у найбільш зручному форматі, якщо вони не будуть попередньо оброблені. Сюди входить загальний формат трьох вхідних чисел та формат цифр кожного з цих чисел. Будь ласка, уточніть, який формат ви використовуєте.
  • Якщо існує декілька можливих баз, ви можете вивести всі або лише одну з них.
  • Ви можете припустити, що базові та вхідні цифри будуть в числових межах вашої мови.

Правила

Тестові кейси

Формат введення тут - це список цілих чисел для представлення кожного числа. Три списки розділені комами.
Зауважте, що іноді можливі кілька підстав. Тут виводиться лише одне (випадкове) рішення.

[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

Ви можете генерувати додаткові тестові випадки за допомогою цієї програми Pyth . Введіть основу в перший рядок і десяткові значення для Xта Yна наступних двох рядках.
Також ви можете використовувати цю програму Pyth для створення декількох тестових випадків одночасно, використовуючи випадкові значення. Просто введіть потрібну кількість тестових випадків у вхід.

Щасливе кодування!


Відповіді:


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 Я здогадуюсь, ти мав на увазі одинарність, і так.
Мего

4
@Mego Я мав на увазі уніар, автокорекція означала все, що вона хотіла означати.
Фонд позову Моніки

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(as 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

Чи працює це для введення даних, де база 1 є єдиним рішенням? Я не можу виконати це з знайденими онлайн-компіляторами, тому не можу перевірити себе.
Денкер

@DenkerAffe: чи не повинні бути цифри dбазового bчисла 0 <= d < b, тож для базової 1є єдино можлива цифра 0? f [[0],[0],[0,0]]оцінює до 1.
німі

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
Унарі дуже непривабливий AutoCorrect в наші дні
Чарлі,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.