Вам дан набор натуральных чисел. Вы должны расположить их в пары так, чтобы:
- Каждая пара содержит 2 числа, одно из которых кратно другому. Например, 8 кратно 4, а 9 кратно 9.
- Если одно и то же число встречается много раз в исходном наборе, его можно использовать много раз в парах; число может даже быть соединено с другим вхождением того же самого числа
- Максимально возможное количество пар получается.
На выходе должно быть количество пар. Самый короткий код выигрывает.
Образец данных
2,3,4,8,9,18
-> 3
7,14,28,42,56
-> 2
7,1,9,9,4,9,9,1,3,9,8,5
-> 6
8,88,888,8888,88888,888888
-> 3
2,6,7,17,16,35,15,9,83,7
-> 2
code-golf
math
number
number-theory
permutations
ghosts_in_the_code
источник
источник
2,3,4,8,9,18
. (Каждое число в этом списке является фактором и / или кратным как минимум двум другим числам в списке, но у него есть только одно решение.)Ответы:
Haskell,
1091077670 байтСпасибо Ними за то, что он сэкономил 33 байта и научил меня еще немного на Haskell. :)
Спасибо xnor за сохранение еще 6 байтов.
Yay, мой первый гольф на Haskell. Он работает так же, как и все ответы на данный момент (ну, не совсем: он учитывает только длину самого длинного префикса допустимых пар в каждой перестановке, но это эквивалентно и фактически соответствует тому, что сделал мой оригинальный код CJam).
Для дополнительной гольфивности это также крайне неэффективно за счет рекурсивного генерирования всех перестановок суффикса каждый раз, когда первые два элемента перестановки являются допустимой парой.
источник
f=
необходимо?chunksOf
больно. Я на самом деле не знаю стандартной библиотеки Haskell, чтобы можно было определить, существует ли более короткая эквивалентная функция. Я попытался реализовать это сам, но он получился на два или три байта длиннее, чем импорт.[]
и другое[_]
, поставивg x=[]
секунду, действительно умно. Я попробую. Спасибо :)f l=maximum$0:[1+f t|(a:b:t)<-permutations l,a`mod`b<1]
.CJam,
2218 байтПопробуйте онлайн.
Ожидается ввод в виде списка в стиле CJam.
Это немного неэффективно для больших списков (и Java, вероятно, исчерпает память, если вы не дадите ей больше).
объяснение
источник
[1 2 3 4 5 6 7 8 9 10]
Однако,[7 1 9 9 4 9 9 1 3 9 8 1]
который является более длинным списком, работает должным образом. Это почему?10! = 3628800
, но12! / 5! / 3! = 665280
. Так что для первого случая не хватает памяти. Если вы запускаете его из консоли с помощью интерпретатора Java, вы можете указать Java использовать больше памяти, и первый случай также будет работать (хотя это может занять некоторое время, не знаю).Pyth, 13 байт
Время и сложность хранения действительно ужасны. Первое, что я делаю, это создаю список со всеми перестановками исходного списка. Это занимает
n*n!
хранение. Входные списки длиной 9 уже занимают довольно много времени.Попробуйте онлайн: демонстрация или тестовый набор
Объяснение:
источник
Mathematica,
95938783796058 байтЗанимает несколько секунд для более крупных примеров.
источник
Matlab (120 + 114 = 234)
основной:
функция topper вызывается основной частью.
вход находится в форме
[. . .]
источник
Matlab (365)
Это, видимо, дольше, но один и более исполнительный, и мне удалось избежать
perms
функции, потому что это занимает вечность.Эта функция требует много реприз, чтобы работать спокойно из-за анонимных функций, я открыт для предложений здесь :)
источник