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 и @ Not that Charles за некоторые примеры этого).
  • Наименьшее возможное основание равно 1. Вы можете использовать 1 или 0 в качестве цифр в унарном, но вы не можете смешивать их.

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 для создания нескольких тестовых случаев одновременно, используя случайные значения. Просто введите желаемое количество тестов в поле ввода.

Удачного кодирования!

Denker
источник
4
Очень похоже: определить базу, где
заданное

Ответы:

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.

Тестирование

По сути, мы тестируем каждую возможную базу, начиная с единицы больше, чем самая большая цифра. Тест состоит в том, что мы конвертируем каждое число в соответствующую базу, затем сворачиваем вычитание по числам и логически сводим на нет результат.

isaacg
источник
5
Таким образом, это принимает непривлекательным как нули?
Фонд Моники Иск
3
@QPaysTaxes Полагаю, вы имели в виду унарный, и да.
Mego
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 за разъяснения в вопросе.)

Пробный прогон на идеоне .


Краткое объяснение:

Возьмите дело с участием не несет:

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

В этом случае нет никаких ограничений на базу, если она больше, чем любая «цифра». Просто возьмите элемент max 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
Это работает для ввода, где база 1 является единственным решением? Я не могу выполнить это с онлайн-компиляторами, которые я нашел, поэтому я не могу проверить себя.
Денкер
@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
унарное очень непривлекательно для автозамены в эти дни
Чарли