Странное число - это число, в котором сумма правильных делителей больше, чем само число, и никакое подмножество правильных делителей не суммируется с этим числом.
Примеры:
70 - странное число, потому что его собственные делители (1, 2, 5, 7, 10, 14 и 35) составляют 74, что больше 70, и ни одна комбинация этих чисел не равна 70.
18 не является странным числом, потому что его собственные делители (1, 2, 3, 4, 6, 9) составляют 25, что больше 18, а 3, 6 и 9 - 18.
Ваша задача - написать самую короткую программу, которая вводит через std любое число n и вычисляет и печатает в файл или выводит первые n странных чисел с разделением новой строки. Не допускается жесткое кодирование ответов (извините, что не указали это в начале).
Дополнительные примеры см. На этой странице: http://mathworld.wolfram.com/WeirdNumber.html
Ответы:
Mathematica
999487Пространства не нужны. Медленный!:
За счет нескольких символов это более быстрая версия, которая проверяет только четные числа и пропускает кратные числа
6
, которые никогда не странны:это все еще слишком медленно для какой-либо полезной цели. Находит первые два за несколько секунд, но становится все медленнее и медленнее с увеличением числа делителей.
источник
Haskell - 129
Я уверен, что здесь есть много возможностей для игры в гольф, но так как конкуренция пока кажется низкой, я добавлю это.
Не пытайтесь запустить это, хотя, мне удалось подождать только два первых элемента, третий начнет занимать минуты.
источник
Python 2,7 (255 байт)
источник
PHP, 267 байт
А вот оригинальный исходный код:
Вы заметите, что для вывода чисел требуется некоторое время, так как он выполняет проверку методом грубой силы (хотя вы должны довольно быстро добраться до 70).
источник
R 164
Версия без гольфа:
Это занимает некоторое время из-за грубой силы.
источник
Рубин - 152
Рубин с ActiveSupport - 138
Очень медленно, и я почти уверен, что еще есть место для игры в гольф ...
источник
Smalltalk, 143
вход:
выход:
источник
SageMath:
143131 байтЭто более или даже не игра в гольф, в коде не так уж много всего для игры в гольф. Самое главное, что вы должны
2*x>=sum(l)
сначала выполнить тест , это сэкономит много времени на вычисления. Надо понимать , чтоmax
на булевом являетсяor
Второй вещь в том , чтоw(x)
этоFalse
за странные числа иTrue
для не странных чисел. Безголовая версия:источник
С ++ - 458
Это не все мое решение, так как мне пришлось обратиться к SO за помощью в расчете суммы подмножеств, но все остальное мое:
Длинная версия:
В настоящее время он рассчитал только первые два (70 и 836). Я убил это после этого.
источник
Perl, 173
Позвольте мне добавить еще одно бесполезное решение. Это решение настолько медленное, что даже после первого странного числа оно не может вывести ничего. Смею сказать, что это самое медленное из всех решений здесь.
демонстрация
Тот же код, написанный на Java (с которым мне удобнее), даже не может распознать 2-е странное число (836), и я уже передал число непосредственно методу проверки (вместо зацикливания и проверки каждого числа).
Суть этого решения заключается в регулярном выражении:
И как строка установлена, чтобы быть в 3 раза больше числа, которое мы проверяем.
Длина строки установлена в 3 раза больше числа, которое мы проверяем
i
: первые 2i
предназначены для совпадения суммирования факторов, а последние 1i
зарезервированы для проверки, является ли число факторомi
.(?=(.+)\1{2}$)
используется для захвата номера, который мы проверяем.((.+)(?=.*(?(2)(?=\2$)\3.+$|(?=\1$)\3.+$))(?=.*(?=\1$)\3+$))+
соответствует коэффициентам числа. Более поздняя итерация будет соответствовать меньшему коэффициенту, чем более ранняя итерация.(.+)
и(?=.*(?=\1$)\3+$)
вместе выбирают коэффициент проверяемого числа.(?=.*(?(2)(?=\2$)\3.+$|(?=\1$)\3.+$))
гарантирует, что выбранный коэффициент меньше, чем число, проверяемое в первой итерации, и меньше, чем предыдущий фактор в последующих итерациях.Регулярное выражение пытается сопоставить как можно больше факторов числа в пределах 2
i
. Но мы не заботимся о фактическом значении суммы делителей, мы заботимся только о том, является ли число обильным.Затем второе регулярное выражение, которое является первым регулярным выражением с
\1{2}$
добавленным. В результате регулярное выражение проверяет, что сумма (некоторых) факторов проверяемого числа равна самому числу:Добавленное ограничение заставит механизм регулярных выражений выполнять поиск в обратном направлении по всем возможным подмножествам факторов, поэтому он будет очень медленным.
источник
Perl,
176174 байтаЧисло странных чисел ожидается в STDIN, а найденные числа печатаются в STDOUT.
Неуправляемая версия
Ограничения
источник