Нам дан список целых чисел p1, ..., pk (не обязательно различимых), где каждое имеет значение от 1 до 9 включительно. Используя каждый из p1, ..., pk ровно один раз, мы можем сформировать конкатенацию цифр, чтобы получить новый список чисел; затем мы выводим произведение этого нового списка. Цель состоит в том, чтобы максимизировать этот продукт, выбирая лучшие комбинации цифр.
Например, нам дают список: 2 3 2 (разделенные пробелами). Мы можем сформировать следующие объединения:
2 3 2
(продукт этих объединений есть12
)23 2
(продукт есть46
)32 2
(продукт есть64
)22 3
(продукт есть66
)
Поскольку наибольшим продуктом, который мы можем сформировать, является 66, мы выводим его.
Правила:
- Должно быть хотя бы одно умножение (т. Е. Вы не можете просто объединить все цифры и вывести их).
- Вы не можете использовать другие операторы, кроме умножения, или вставлять скобки и т. Д.
- Предположим, что указанный список целых чисел разделен пробелами, и все целые числа имеют значения от 1 до 9.
Самый короткий код (в байтах) побеждает!
Тестовые случаи:
Входные данные : 1 2 3
; Выход: 63
(т.е. 21*3
)
Входные данные : 2 5 9
; Выход: 468
( 52*9
)
Входные данные : 1 2 3 4
; Выход: 1312
( 41*32
)
Ответы:
CJam,
32282312 байтПопробуйте онлайн в интерпретаторе CJam .
Спасибо @ user23013 за помощь в сохранении 16 целых байтов!
идея
Перестановка символов во входной строке делит ее на целые числа (группы последовательных цифр), разделенные пробелами. Нажав на ноль, а затем оценив перестановочную входную строку, мы помещаем два или более целых числа. Умножение двух верхних приведет либо к произведению входных данных, разделенному ровно на два целых числа, либо к некоторому неоптимальному значению.
Код
источник
l2%_,,1>\e!m*{~S+m<~*}%$W=
,l2%S+e!{0\~*}%$W=
,CJam,
3635 байтДовольно прямо вперед. Перебирает все возможные комбинации и сортирует их по продуктам. Затем выводит наибольшее. Все это с учетом того, что должно присутствовать хотя бы 1 умножение.
Скоро добавлю объяснение.
Попробуйте онлайн здесь
источник
JavaScript (ES6) 125
Редактировать Я думаю, что @oberon понял это правильно: «каждая новая цифра должна быть соединена с наименьшим числом»
Я не буду менять этот ответ, крадя его идею. Реализация в ES6 будет 70 байтов (знак изменился по сравнению, чтобы сравнить как число, а не строки)
Мое решение
Как я уже говорил в комментариях, для каждой пары чисел a, b произведение a * b меньше простой конкатенации ab (= a * 10 ^ (цифры b) + b). Поэтому лучше избегать продуктов и предпочитать конкатенацию, но так как запрашивается как минимум 1 продукт, мы должны построить 2 числа и умножить их.
Я пробую все возможные группировки цифр, создавая пару чисел для умножения. Каждое число построено из цифр в порядке убывания.
Например, со списком из 4 чисел [1 2 3 4] - попробуйте:
Максимум этих значений - результат, который нам нужен.
Группировки могут быть пронумерованы зацикливанием на битовой карте из 4 битов с минимальным значением 0001 и максимальным значением 0111 (то есть 1 << (4 -1) - 1)
Не так играли в гольф
Протестируйте с помощью фрагмента ниже в Firefox.
источник
Python 3, 111 байт
Это, вероятно, намного более пригодно для игры в гольф. Мне нравится время его работы, хотя (O ( n log n ), не так ли?).
Разгромленный с объяснением.
источник
Pyth, 25 байт
Я зацикливаюсь на каждой перестановке ввода. Тогда, поскольку каждая оптимальная комбинация состоит из двух целых чисел, я просто делю ее в каждой возможной позиции и умножаю каскадные разбиения. Затем я сортирую и получаю последний элемент.
источник
R 164
В качестве метода я не уверен, является ли это надежным. В случаях, которые я проверял, похоже, каждый раз работает. Я попытался протестировать его с помощью оптимизатора, и, похоже, с этим тоже все в порядке. Я более чем готов быть неправым :) Есть место для игры в гольф, но я надеялся сначала получить отзыв о методе.
Общий процесс:
Расширен с некоторыми комментариями
И некоторые тестовые прогоны (реализованные как функция с именем g)
источник