Этот вопрос возник в этой ветке reddit от пользователя reddit taho_teg, но он расширен до более общей «головоломки».
У вас есть центрифуга с 24 отверстиями для флаконов, равномерно распределенных по кругу вокруг центральной оси. Если у вас сейчас есть несколько флаконов и вы хотите запустить центрифугу, вам необходимо убедиться, что они размещены сбалансированным образом. Единственное количество флаконов, которые вы не можете уравновесить, это 1 и 23. Вы можете, например, уравновесить 4, но вы также можете уравновесить 5, сделав «треугольник» с 3 флаконами и разместив два других на двух противоположных участках.
Цель
Вы должны написать программу, которая принимает количество отверстий (которые равномерно распределены по кругу вокруг вращающейся оси) вашей центрифуги в качестве входных данных, и которая выводит список количеств флаконов, которые не могут быть сбалансированы в центрифуге.
Вы должны сделать расчет и не можете просто жестко закодировать предварительно вычисленные решения.
Ввод и вывод должны быть реализованы таким образом, чтобы не нужно было изменять программный код для вызова программы для разных входов. Также допустимо написать функцию (или аналогичную конструкцию на вашем языке), которую можно вызывать через консоль.
Имейте также в виду, что если у вас есть 6 отверстий в вашей центрифуге, вы можете центрифугировать 2 и 3 флакона, но вы не можете сбалансировать 5, так как «треугольник» и две противоположные пересекаются в одной точке. Другой пример: при n = 15 вы не можете сбалансировать 11 флаконов, вы можете сбалансировать 6 и 5 флаконов, но комбинация этих решений будет пересекаться (это, конечно, еще не критерий того, что это невозможно сделать).
Обновить
Кажется, некоторые люди не поняли приведенный пример, поэтому я сделал рисунок здесь. ПОЖАЛУЙСТА, напишите краткое описание того, как работает ваш алгоритм, а также некоторые примеры выходных данных для проверки. Пожалуйста, включите следующие примеры:
n = 1, 6, 10, 24, 63, 100 = 10^2, 163 (prime), 40320 = 8!, 65536=2^2^2^2^2, 105953 (prime)
Обратите внимание, что 40320 и 65536 будут создавать огромные списки, возможно, будет хорошей идеей указать только длину этих списков.
Если вы знаете, какие интересные цифры добавить в этот список, пожалуйста, дайте мне знать! Алгоритм должен работать как минимум до n = 1 000 000.
Пример выходов:
Это некоторые примеры выходных данных, но, возможно, они ошибочны, потому что я просто рассчитал их вручную.
1: 1
2: 1
3: 1,2
4: 1,3
5: 1,2,3,4
6: 1,5
7: 1,2,3,4,5,6
8: 1,3,5,7
9: 1,2,4,5,7,8
10:1,3,7,9
11:1,2,3,4,5,6,7,8,9,10
12:1,11
13:1,2,3,4,5,6,7,8,9,10,11,12
14:1,3,5,9,11,13
15:1,2,4,7,8,11,13,14
намек
Если у вас есть центрифуга с п дырками, и вы не можете балансировать например , 6 ампул, вы также не сможете Blance N-6 ампул - это в основном та же задача баланса м флаконы на пустой центрифуге или балансировать заполненную центрифугу забрав м флаконов. Таким образом, если у вас есть номер m в вашем списке, вы также должны будете включить nm .
7 spoke wheel
и посмотрите.Ответы:
Мудрец -
102104/115Зачем использовать теорию чисел, когда есть грубая сила?
Для данного количества пузырьков это охватывает все способы позиционирования пузырьков и вычисляет их центр масс с использованием сложной арифметики. Если центр масс равен нулю ни для одного из этих способов, число возвращается.
К сожалению, в некоторых случаях это не работает (10,14), потому что Sage не может упростить некоторые выражения до нуля (что может быть связано с этой ошибкой ). Можно было бы расценить это как недостаток интерпретатора, а не программы, и при этом сказать, что алгоритм и программа в порядке.
Следующая 113-символьная альтернатива использует плавающие символы вместо символов и не страдает от этих проблем:
Тестовый вывод 113-символьной версии (
for n in range(14): print n,v(n)
):Я не хотел ждать времени выполнения выше
n
.Это происходит из следующего решения Python. Точная арифметика и отсутствие необходимости импортировать некоторые модули - это нечто.
Питон -
173 154156Тестовый вывод этого варианта (
for n in range(24): print n,v(n)
):Я не хотел ждать времени выполнения выше
n
.источник
Луа - 197
Метод не грубой силы, он создает список факторов и исключает их. Он также исключает числа, которые могут быть получены с добавлением этих факторов, если наибольший используемый фактор меньше, чем количество незаполненных отверстий. Один всегда печатается и не используется в алгоритме.
Пример вывода: (некоторые обозначены как диапазоны, поэтому я не превышаю ограничение на количество символов)
источник
Pyth -
3937 байтПрямой перевод ответа Python @ Wrzlprmft.
Объяснение и, вероятно, дальнейшее гольф в ближайшее время.
Попробуйте это онлайн здесь .
источник