Соревнование
Учитывая 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
- Цифры входных чисел будут неотрицательными целыми числами.
- Можно предположить, что входные числа содержат начальные нули, поэтому они имеют определенную (или все одинаковую) длину.
- Вы можете взять числа в наиболее удобном формате, если они не были предварительно обработаны. Это включает в себя общий формат трех входных чисел и формат цифр каждого из этих чисел. Пожалуйста, дайте понять, какой формат вы используете.
- Если существует несколько возможных баз, вы можете вывести все или только одну из них.
- Вы можете предположить, что базовые и входные числа будут в числовых пределах вашего языка.
правила
- Функция или полная программа разрешены.
- Правила по умолчанию для ввода / вывода.
- Применяются стандартные лазейки .
- Это код-гольф , поэтому выигрывает меньшее количество байт. 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, 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 для создания нескольких тестовых случаев одновременно, используя случайные значения. Просто введите желаемое количество тестов в поле ввода.
Удачного кодирования!
Ответы:
Желе,
16117 байтЭтот подход в значительной степени основан на ответе @ beaker на октаву .
Формат ввода: Z, Y, X , с порядком цифр в младшем порядке, используя цифру 0 для одинарного.
Попробуйте онлайн! или запустите все тестовые случаи .
Как это устроено
Вместо того , чтобы постепенно тестирование потенциальных баз, это решает полином , который соответствует массиву P: = X + Y - Z . Это возвращает либо наибольший коэффициент P ≠ 0 - который должен быть корнем, поскольку существует хотя бы одно действительное основание - либо наибольшую цифру X , Y и Z , увеличенную на 1 .
источник
Pyth, 13 байт
Ожидается Z, а затем X и Y.
Тестирование
По сути, мы тестируем каждую возможную базу, начиная с единицы больше, чем самая большая цифра. Тест состоит в том, что мы конвертируем каждое число в соответствующую базу, затем сворачиваем вычитание по числам и логически сводим на нет результат.
источник
Октава,
67753832 байтаПотому что «перебрать ВСЕ вещи» - это слишком много работы.
Требуется заполнение 0, чтобы входные массивы были одинакового размера, например:
Так
0
как используется для заполнения,1
используется в качестве токена для одинарного.(Спасибо @DenkerAffe за разъяснения в вопросе.)
Пробный прогон на идеоне .
Краткое объяснение:
Возьмите дело с участием не несет:
В этом случае нет никаких ограничений на базу, если она больше, чем любая «цифра». Просто возьмите элемент max
z
(какz >= x,y
) и добавьте 1 (или любое положительное целое число).В случае выноса (без переноса) мы превысили базу в одном из столбцов, и разница между
x+y
иz
является базой:Если сумма во втором столбце также превысила основание, требующее выполнения, а также переноса, ее значение будет равно
base+(-1)
. У нас будет где-то справа столбец с выносом и без переноса, который имеет правильное (большее) базовое значение.источник
Haskell,
9073 байтаПример использования:
f [[3, 247],[7, 438],[11, 221]]
->464
.Просто попробуйте все базы
b
(гдеb
больше, чем максимум цифр). Выберите первый, гдеx+y==z
.Редактировать: @xnor сэкономил много байтов, прежде всего избавившись от
import Data.Digits
.источник
unDigits b
делает то, что я думаю, это должно быть короче, чтобы реализовать какfoldl(\x y->b*x+y)0
или эквивалентноfoldl((+).(b*))0
.maximum
после сплющиванияb<-[1+(maximum$id=<<l)..]
.maximum
какb<-[1..],all(<b)$id=<<l
.d
базовогоb
числа0 <= d < b
, поэтому1
единственной возможной цифрой для базы является0
?f [[0],[0],[0,0]]
оценивает до1
.MATL , 20 байтов
Ввод в формате (обратите внимание на внешние фигурные скобки):
Это работает в текущей версии (15.0.0) .
Попробуйте онлайн!
объяснение
источник
MATL,
1312 байтПеревод моего октавского ответа на MATL. (Мой первый ответ в MATL!)
Z, X, Y
(или,Z, Y, X
если вы предпочитаете, я легко)Попробуйте онлайн!
объяснение
источник