Направления
Напишите программу, которая, учитывая входное целое число n ( n >= 0
), выводит наименьшее положительное целое число m, где:
n = a[1]^b[1] + a[2]^b[2] + a[3]^b[3] + ... + a[k]^b[k]
a
иb
являются конечными последовательностями одинаковой длины- все элементы
a
меньше чемm
- все элементы
b
меньше чемm
- все элементы
a
являются разными и целымиa[x] >= 0
- все элементы
b
являются разными и целымиb[x] >= 0
a[x]
иb[x]
не оба 0 (так как 0 ^ 0 не определено)
Это код-гольф , поэтому побеждает меньше байтов.
Примеры
In 0 -> Out 1
Possible Sum:
In 1 -> Out 2
Possible Sum: 1^0
In 2 -> Out 3
Possible Sum: 2^1
In 3 -> Out 3
Possible Sum: 2^1 + 1^0
In 6 -> Out 4
Possible Sum: 2^2 + 3^0 + 1^1
In 16 -> Out 5
Possible Sum: 2^4
In 17 -> Out 4
Possible Sum: 3^2 + 2^3
In 23 -> Out 6
Possible Sum: 5^1 + 3^0 + 2^4 + 1^3
In 24 -> Out 5
Possible Sum: 4^2 + 2^3
In 27 -> Out 4
Possible Sum: 3^3
In 330 -> Out 7
Possible Sum: 6^1 + 4^3 + 3^5 + 2^4 + 1^0
code-golf
number
arithmetic
kukac67
источник
источник
m<2
затем, и такm<3
далее,m<4
пока я не найду сумму, равнуюn
. Кроме того, я подумал о том, чтобы получить сумму0
без терминов, но каков результат? м>?n = a[1]^b[1] + a[2]^b[2] + ... + a[k]^b[k]
.a
иb
являются конечные последовательности длины0
, так что не существует целое число ,m
которое не удовлетворяют ограничениям, и так как не существует наименьшее целое число , ответ не определен. Возможные исправления: запрос наименьшего натурального числаm
(в этом случае вы должны изменить ожидаемый ответ0
) или наименьшее положительное целое числоm
.Ответы:
GolfScript (59 символов)
Онлайн демо
При этом используется рекурсия для перечисления достижимых значений для данного
m
и поиска первого,m
который работает. Это слегка вдохновлено ответом xnor, но совсем по-другому.рассечение
источник
Питон, 120
Функция
f
является вспомогательной функцией, которая проверяет, неn
может ли она быть выражена как сумма степеней с различными основаниями от и показателями от . Он использует естественную рекурсивную стратегию: должен быть ненулевым, и мы пробуем каждый возможный выбор базисной и и экспонентной величин, и все они должны потерпеть неудачу. Мы удаляем их из разрешенных списков и уменьшаем на соответствующую сумму.A
B
n
n
Функция
g
является основной функцией. Он ищет,m
что работает.M
это набор допустимых значений доm-1
. Мы удаляем0
из разрешенных показателей, чтобы остановить0**0
(что Python оценивается в 1) от использования. Это ничего не повредит, потому0**x
что это бесполезно0
для всех остальныхx
.источник
n and all()
наn*all()
.Python 2, 138 байт
(Спасибо @Jakube за все советы)
Я никогда не узнал так много о
itertools
модуле, как узнал из этого одного вопроса. Последний случай занимает около минуты.Мы начинаем с поиска
m = 1
и увеличения, пока не получим решение. Чтобы найти решение, мы перебираем:k = 0 to m-1
гдеk
число слагаемых в решении[0, 1, ... m-1]
с размеромk
), затем суммирования и проверки, если мы имеемn
Обратите внимание, что мы повторяем
k
доm-1
- хотя техническиm
термины возможны всего, всегда есть решение сm-1
терминами,0^0
которое не разрешено и0^b
ничего не дает. Это на самом деле важно, потому0^0
что Python рассматривает его как 1, что кажется проблемой, но, оказывается, это не имеет значения!Вот почему
Предположим, что найденное решение ошибочно использует
0^0
1, например3^2 + 1^1 + 0^0 = 11
. Так как мы генерируем толькоm-1
термины, должны быть некоторые, которыеj
мы не используем в качестве основы (здесьj = 2
). Мы можем поменять базу 0,j
чтобы получить правильное решение, здесь3^2 + 1^1 + 2^0 = 11
.Если бы мы повторили все
m
термины, то, возможно, мы получили бы неправильные решения, такие какm = 2
forn = 2
, via0^0 + 1^1 = 2
.источник
imap(pow,C,D) ... for C,D in
itertools
пока мы говорим: у PI уже есть другая экономия -tee
.imap
, когда естьmap
?? -1 байтtee
ужеn=2
. Сохраняет 2 байта.map
несколько итераций, и на самом деле этот вопрос принес мне много нового.GolfScript (
9084 байта)Онлайн демо
рассечение
Самым элегантным трюком является обработка специального чехла для
0
.источник
Хаскелл,
143130Пример использования:
p 23
->6
.Это простой перебор. Для каждого списка
[0..0], [0..1], [0..2] ... [0..∞]
берут все начальные сегменты перестановок (например, [0..2]: перестановки:,[012], [102], [210], [120], [201], [021]
начальные сегменты для 1-й перестановки:,[0], [01], [012]
2-й:[1], [10], [102]
и т. Д.). Для каждой комбинации 2 из этих списков рассчитайте сумму степеней. Стоп, когда первый равен n.источник
>>=
а неconcatMap
. они точно такие же, но с переброшенными аргументами.Python: 166 символов
объяснение
Функция
f
создает все возможные целые числа, которые могут быть выражены как сумма степеней чисел вr
. Если начинается сr = [0]
. Если любое из этих целых чисел равноn
, он возвращает длинуr
, в противном случае он вызывает себя рекурсивно с расширениемr
.Вычисление всех целых чисел, которое может быть выражено как сумма, выполняется с помощью двух циклов. Первый цикл - это
for j in r
, который сообщает нам длину выражения (2 ^ 3 + 1 ^ 2 имеет длину 2). Внутренний цикл повторяется по всем комбинациям перестановокr
длиныj
. Для каждого я рассчитываю сумму полномочий.источник
JavaScript (ES6) 219
224Рекурсивная функция. Начиная с m = 1, я пробую все комбинации целого числа 1..m для оснований и 0..m для показателей (0 оснований бесполезно, учитывая 0 ^ 0 == undefined).
Если решение не найдено, увеличьте m и попробуйте снова.
Особый случай для ввода 0 (на мой взгляд, это ошибка в спецификации в любом случае)
Функция C рекурсивно генерирует все комбинации из массива заданной длины, так что
Третий уровень
every
используется для сжатия массива a базисов и b экспонент (zip
в JavaScript нет функции). Использованиеevery
для ранней остановки, когда есть решение, не использующее все элементы в двух массивах.Тест в консоли FireFox / FireBug
Выход
источник