Вам дают кучу весов, и ваша задача - создать небольшой сбалансированный мобильный телефон, используя эти веса.
Входные данные представляют собой список целых весов в диапазоне от 1 до 9 включительно. Там могут быть дубликаты.
Вывод представляет собой изображение ASCII мобильного телефона, который при зависании будет сбалансирован. Возможно, лучше всего показать на примере:
вход
3 8 9 7 5
возможный вывод
|
+-----+---------+
| |
+--+-+ +----+------+
| | | |
8 ++--+ 7 5
| |
9 3
Вы должны использовать символы ascii, как показано на рисунке. Горизонтальные и вертикальные сегменты могут быть любой длины. Никакая часть мобильного телефона не может касаться (по горизонтали или вертикали) другой неподключенной части мобильного телефона. Все веса должны быть подвешены на вертикальном отрезке длиной не менее 1, и должен быть вертикальный отрезок, на котором подвешен весь мобильный телефон.
Размер мобильного телефона является общим количеством +
, -
и |
символами , необходимым для создания его. Чем меньше размеры, тем лучше.
Вы можете разместить столько соединений в сегменте, сколько захотите. Например:
вход
2 3 3 5 3 9
возможный вывод
|
+---+---+-----------+
| | |
+--+-+ 5 9
| | |
2 | 3
|
+++
| |
3 3
Победившая программа - та, которая может генерировать наименьшее среднее число мобильных размеров для тестового набора входных данных. Настоящий тест является суперсекретным, чтобы предотвратить жесткое кодирование, но это будет что-то вроде этого:
8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7
1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 7 7
3 4 4 4 4 5 5 5 5 6 6 6 6 7 7 7 7
источник
total_weight_hung_from_point * distance_of_point_from_pivot
должна быть одинаковой с обеих сторон от точки поворота.Ответы:
Python 2.
Я
немногообманываю :Я строю мобильные телефоны только с одной горизонталью.
У меня есть чувство (но я не доказал это), что оптимальный мобильный телефон в данных условиях фактически всегда имеет только одну горизонталь.Изменить: не всегда верно; с2 2 9 1
Nabb нашел контрпример в комментариях ниже:Я просто делаю глупое грубое принуждение
Мои результаты для ваших примеров входных данных; каждый из них запускался в течение 5 секунд (я знаю, что для маленьких это смешно - просто пройти через все возможные перестановки будет быстрее). Обратите внимание, что, поскольку есть случайный элемент, последующие прогоны могут найти лучшие или худшие результаты.
Код (многословный, так как это не код гольф):
источник
1 9 2 8
этого порождает1-------8+-9--2
; из головы не могу придумать ничего лучшего (но я бы на это не полагался) - у вас есть что-нибудь?2 2 9 1
т.е. (2 + 2) * 3 = 9 + 1 * 3 для размера 16 вместо2-9+--2----1
18. Я бы предположил, что есть порог (может быть 5 или 6 ) после которого один горизонтальный ряд всегда оптимален.2-2-+9-1
балансами, со счетом 13(4*2+2*2 = 9*1+1*3)
. Так что я не думаю, что это хороший контрпример.Ну, это старый вопрос, но я только что увидел, что он появился на вкладке главных вопросов, так что вот мое (оптимальное) решение:
Глядя на правила, я почти уверен, что это не обман, хотя кажется, что это так. Это будет просто выводить все заданные числа в вертикальной цепочке, для общей стоимости 2 * number_of_inputs (что является минимально возможным, потому что у каждого числа должна быть полоса над ним, независимо от того, какой макет). Вот пример:
Производит:
Что, конечно, в идеальном балансе.
Изначально я собирался попробовать что-то еще в духе этой задачи, но быстро оказалось, что она все равно оптимизировалась под эту структуру
источник
|
к нижней части веса.Вот решение, которое грубой силой наименьшее решение одной строки. Код перебирает все перестановки и вычисляет центр масс для каждого. Если центр масс имеет целочисленные координаты, мы нашли решение.
После того, как все перестановки были опробованы, мы добавляем сегмент в микс (эквивалентный весу массы 0) в нашем текущем наборе весов и повторяем попытку.
Чтобы запустить программу, сделайте
python balance.py 1 2 2 4
.который производит эти лучшие решения:
источник
Python 3
Я полагаю, что это не хуже, чем на 1 больше, чем оптимально в любом из тестовых случаев, и делает это за 5 секунд.
В основном, я использую подход с одним баром. Я случайным образом упорядочиваю входные данные, а затем вставляю веса на линейку по одному. Каждый элемент либо помещается в положение, которое минимизирует избыточный вес с обеих сторон, либо во второе лучшее положение с этой точки зрения, используя первые 75% времени и последние 25% времени. Затем я проверяю, сбалансирован ли мобильный телефон в конце, и он лучше, чем лучший мобильный телефон, найденный до сих пор. Я сохраняю лучший, затем останавливаю и распечатываю его через 5 секунд поиска.
Результаты за 5 секунд:
Код:
Единственное из этих решений, которое я считаю неоптимальным, - самое длинное, у которого есть это решение, которое я нашел после 10-минутного прогона:
источник