Задача состоит в том, чтобы найти максимальное число, которое вы можете получить из списка целых чисел, используя основные арифметические операторы (сложение, вычитание, умножение, унарное отрицание)
вход
Список целых чисел
Выход
Максимальный результат при использовании каждого целого числа в intput.
Порядок ввода не имеет значения, результат должен быть таким же.
Вам не нужно выводить полную операцию, только результат.
Примеры
Input : 3 0 1
Output : 4 (3 + 1 + 0)
Input : 3 1 1 2 2
Output : 27 ((2+1)*(2+1)*3))
Input : -1 5 0 6
Output : 36 (6 * (5 - (-1)) +0)
Input : -10 -10 -10
Output : 1000 -((-10) * (-10) * (-10))
Input : 1 1 1 1 1
Output : 6 ((1+1+1)*(1+1))
правила
Самый короткий код выигрывает
Стандартные "лазейки" применяются
Вы можете использовать только операторы + * - (сложение, умножение, вычитание, унарное отрицание)
Код должен работать до тех пор, пока результат может быть сохранен в 32-битном Integer.
Любое поведение переполнения зависит от вас.
Надеюсь, это достаточно ясно, это мое первое предложение Code Golf.
источник
Ответы:
C - 224 байта - время работы O (n)
Было забавно видеть только экспоненциально-временные решения для задачи с линейным временем, но я полагаю, что это был логичный способ продолжить, поскольку не было никаких бонусных баллов за фактическое наличие алгоритма, который является анаграммой логарифма.
Очевидно, что после преобразования отрицательных чисел в положительные и отбрасывания нулей нас больше всего интересует умножение. Мы хотим максимизировать логарифм окончательного числа.
log (a + b) <log (a) + log (b) за исключением случаев, когда a = 1 или b = 1, поэтому это единственный случай, когда мы заинтересованы в добавлении чего-либо вместе. Обычно лучше добавить 1 к меньшему числу, потому что это вызывает большее увеличение логарифма, то есть большее процентное увеличение, чем добавление 1 к большому числу. Существует четыре возможных сценария, упорядоченных от наиболее к наименее предпочтительным, для их использования:
Программа отслеживает количество единиц, количество двойок и минимальное число больше 2, и идет вниз по списку наиболее или менее предпочтительных способов их использования. Наконец, он умножает все оставшиеся числа.
источник
Хаскель, 126 символов
это просто грубое принуждение, за исключением игнорирования знака ввода и игнорирования вычитания и унарного отрицания.
этот код очень медленный код рекурсивно вычисляет f для каждой подпоследовательности ввода четыре раза (за исключением [] и самого ввода) . но эй, это код гольф.
источник
SWI-Пролог - 250
О, мальчик, я слишком долго на это потратил.
Вызывается из командной строки (например):
(Без особой причины я нашел удивительным, что мои названия функций в гольфе пишут "томатный горшок".)
Безголовая версия:
Объяснение:
ignore
или\+
), чтобы предикат в целом вернулсяtrue
и продолжил.is
а затем запишите.источник
Скала, 134
Ungolfed и прокомментировал:
Немного другой подход, от понимания того, что самый большой ответ всегда можно выразить как произведение сумм.
Так близко, но куча глупостей библиотеки (перестановки возвращают Iterator вместо Seq, ужасный вывод типа для пустых последовательностей, Array.update, возвращающий Unit) заставила меня задуматься.
источник
Python 278 (O (n!))
объяснение
источник
Haskell -
295 290 265 246 203 189182 байтаНаконец работает! Также теперь это грубая сила, а не динамическое решение.
Спасибо гордому скелеру за некоторые советы по игре в гольф.
Вероятно, это не полностью решение для игры в гольф, потому что я на самом деле отстой в игре в гольф, но это лучшее, что я могу придумать (и это выглядит сложным, поэтому я понял, что для меня):
Новые тестовые случаи:
Объяснение решения:
main
Функция просто получает входной сигнал и работаетg
с ним.g
принимает входные данные и возвращает максимум всех возможных комбинаций сумм и порядков списка.#
это функция, которая вычисляет суммы в списке следующим образом:источник
;
когда это возможно? это не меняет количество байтов, но затрудняет читаемостьd n=[0,2,1]!!n
илиd n=mod(3-n)3
. 3) составьтеo
иg
возьмите длину списка вместо того, чтобы брать сам список, поскольку они зависят только от длины (очевидно, это остается только до тех пор, пока они не встроены). 4) заменитьotherwise
на0<1
. 5) сделать последнее определение г бытьr$o x:y
. 6) Снимитеa@
и замените наx:y
. удачи в игре в гольф!GolfScript (52 символа)
Онлайн демо
Анализ feersum довольно хорош, но его можно продолжить, если цель - игра в гольф, а не эффективность. В псевдокоде:
источник