Что нужно знать:
Во-первых, счастливые числа.
Счастливые числа генерируются так:
Возьмите все натуральные числа:
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20...
Затем удалите каждый второй номер.
1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39...
Теперь 3
безопасно.
Удалить каждый третий номер:
1, 3, 7, 9, 13, 15, 19, 21, 25, 27, 31, 33, 37, 39, 43, 45, 49, 51, 55, 59...
Теперь 7
безопасно.
Удалить каждый 7-й номер.
Продолжите и удалите каждый n
номер, где n
находится первый безопасный номер после исключения.
Финальный список безопасных чисел - счастливые числа.
Неудачные числа составлены из отдельных списков чисел, которые есть [U1, U2, U3... Un]
.
U1
это первый набор чисел, удаляемых из счастливых «кандидатов», поэтому они:
2, 4, 6, 8, 10, 12, 14, 16, 18, 20...
U2
удален второй набор чисел:
5, 11, 17, 23, 29, 35, 41, 47, 53, 59...
И так далее, и тому подобное ( U3
третий список, U4
четвертый и т. Д.)
Вызов:
Ваша задача, когда дано два входа m
и n
, сгенерировать m
число в списке Un
.
Пример входов и выходов:
(5, 2) -> 29
(10, 1) -> 20
Технические характеристики:
- Ваша программа должна работать
m
до1e6
иn
до100
.- Вам гарантировано, что оба
m
иn
являются положительными целыми числами. - Если вам интересно,
U(1e6, 100)
=5,333,213,163
. (Спасибо, @pacholik!)
- Вам гарантировано, что оба
- Ваша программа должна вычислить это в течение 1 дня на разумном современном компьютере.
Это код-гольф , поэтому выигрывает самый короткий код в байтах!
PS: Было бы хорошо, если бы кто-то придумал общую формулу для их генерации. Если у вас есть формула, укажите ее в своем ответе!
(1e6,1e6)
?n=1
случая? Поскольку это особенное - для всех остальных случаев индекс следующего счастливого числа на основе 0 равенn-1
.Ответы:
CJam , 74 байта
Попробуйте онлайн! Тайм-аут для более крупных случаев, более подробно о временных ограничениях ниже.
Объяснение:
Наша программа беззастенчиво заимствует код aditsu для генерации списка из N счастливых чисел, замена 1 на 2 дает приращение в каждой фазе сита. Оставшийся код уменьшается в каждом элементе до тех пор, пока не будет найден ноль (путем нарезки и добавления невырожденного хвоста), и эффективно подсчитывает шаги в каждой из N фаз решета сразу.
Сроки:
Если вам абсолютно необходимо запустить программу в браузере для больших чисел, вы можете использовать этот интерпретатор и разрешить выполнение сценария, если будет предложено, но это может быть слишком медленным для определения. Использование ( M , N ) = (100,100) занимает ~ 247 с. Итерация программ относительно линейна с точки зрения M , поэтому вычисления (1 6 100) могут занять ~ 29 дней.
Используя интерпретатор оболочки на ПК, программа вычисляет (100 100) за ~ 6 с и вычисляет (1 e4 100) за ~ 463 с. Программа должна быть в состоянии вычислить (1e6,100) в ~ 13-17 часов. В этом случае я буду считать, что программа соответствует требованиям.
Обратите внимание, что все времена были округлены в обоих измерениях и расчетах.
источник
Perl,
87858281 байтВключает +4 для
-pX
Введите ввод в STDIN одной строкой с первым n (обратите внимание, что это обратный порядок, предложенный в тесте). Итак, для расчета
U(1000000, 100)
:Алгоритм, основанный на счастливых числах ответа aditsu. Сложность времени заключается в том, что он достаточно быстр для требуемого диапазона.
O(n^2)
100, 1000000
Случай дает5333213163
в 0,7 секунды. Из-за проблем, которые Perl имеет сdo$0
основанной рекурсией, он использует много памяти. Переписав его как функцию, можно использовать памятьO(n)
но на несколько байт длиннееunlucky.pl
:Это работает, как показано, но использовать буквальный
^S
чтобы получить заявленную оценку.Я не знаю о каком-либо более раннем использовании
$^S
в Perlgolf.источник
(1e6,100)
?do$0
этим, в основном недоступен на любом реалистичном компьютере. Но если такая память существовала около 2 лет. Я действительно не написал и не протестировал нормальную версию для подпрограмм, но я ожидал, что она закончится через несколько месяцев и будет запущена даже на компьютерах с очень небольшим объемом памяти. Поэтому хорошо, что эти значения не находятся в требуемом диапазоне для этой задачи.(1e6,100)
течение дня? Что вы имеете в виду, эти значения не обязательны?n
иm
даны в обратном порядке.100 1000000
Вход вычисляетU(1000000, 100)
и выдает5,333,213,163
в 0,7 секунды. Это, безусловно, самая быстрая программа из всех опубликованных на данный момент(100,1e6)
что это будет намного быстрее(1e6,100)
, и подумал, что это объяснение молниеносной скорости 0,7 секунды!Питон 3, 170
Функция L генерирует ряд возможных счастливых чисел (если k - True) или Un (если False). Оценивается лениво (поэтому мне не нужно генерировать n-1 бесконечных списков, если я хочу Un ).
Запустить функцию U .
скорость
U (1 000 000; 100) требуется около 1 часа 45 минут, чтобы работать на моей машине с PyPy. Я подозреваю, что около четырех часов с CPython. (Да, 4ч 20мин, если быть точным.)
Если бы я использовал список вместо генераторов, я мог бы получить некоторую скорость, но мне нужен список большего размера, чем позволяет мне Python. И если бы это произошло, потребовались бы десятки гигабайт оперативной памяти.
Да, и U (1 000 000; 100) = 5 333 213 163 .
источник
Haskell
Невозможно вычислить для n = 1:
175160 байтовПосле компиляции моему компьютеру потребовалось 2 часа 35 минут, чтобы вычислить следующие данные
(1000000,100)
:Я попытался избавиться от
where
модулей, но они, кажется, влияют на скорость, и я не уверен, почему ... Но я думаю, что здесь нужно сделать больше обрезки.Метод, используемый
m?n
для запроса ответа, заданногоm
иn
.Ungolfed
Я считаю, что возможно объединить функции 'skipeverynth' и 'everynth' в одну функцию, которая возвращает пару.
Я использовал код этого доброго человека для пропуска каждого n-го элемента. Я сам делал это несколько раз, но это всегда было гораздо более неэффективно, и я не мог понять, почему.
Возможность вычислить для всех n: 170 байт
Это в основном то же самое, но
max
для обработки особого случая пришлось добавить пару функцийn=1
.источник
R 82 байта
использование
Для этого нужно иметь достаточно большой вектор, чтобы осталось достаточно чисел для возврата значения. Созданный вектор уже имеет размер около 800 Мб, и функция может обрабатывать до m = 1e4 и n = 100, поэтому все еще далеко от цели.
Чтобы создать достаточно большой вектор для вычисления f (1e6,100), потребуется начальный вектор 1: 2e10. Из-за процедур выделения данных Rs это создает вектор> 70Gb, который не может быть запущен на любом компьютере, который я знаю, хотя код будет работать.
Для справки f (1e4,100) работает примерно за 30 секунд. На основании этого и нескольких небольших тестов f (1e6,100) потребуется около часа.
источник
Ракетка 332 байта
Безголовая версия:
Тестирование:
Выход:
источник
Clojure, 221 байт
Могучий долго, но обрабатывает дело
(f 1)
. Без этого особого случая это было 183 байта. Это было слишком много усилий, чтобы не публиковать его.Пример выходов:
Случай 1000000 100 был рассчитан примерно за 4,7 часа, по крайней мере, он не вылетел.
источник