Соревнование
Внедрите сито Sundaram для поиска простых чисел ниже n
. Возьмите входное целое число n
и выведите простые числа ниже n
. Можно предположить, что n
всегда будет меньше или равен одному миллиону.
Сито
Начните со списка целых чисел от
1
доn
.Удалите все числа в форме
i + j + 2ij
где:i
иj
меньше чемn
.j
всегда больше или равноi
, что больше или равно1
.i + j + 2ij
меньше или равноn
Умножьте оставшиеся числа на
2
и добавьте1
.
Это даст все простые числа (кроме тех 2
, которые должны быть включены в ваш вывод) меньше, чем 2n + 2
.
Вот анимация сита, используемого для поиска простых чисел ниже 202
.
Выход
Ваш вывод должен быть каждым простым целым числом ≤ n
(в порядке возрастания), за которым следует новая строка:
2
3
5
Где n
находится 5
.
Примеры
> 10
2
3
5
7
> 30
2
3
5
7
11
13
17
19
23
29
Входы обозначены >
.
n=30
отсутствующим 29 в выводе.(i,j)
сi<=j
, но результат не меняется, если мы игнорируем это требование. Можем ли мы сделать это, чтобы сохранить байты?i <= j
. Это только часть того, как работает сито. Так что да, вы можете не указыватьi <= j
в своем коде. @xnor2n+1
), которые не имеют формы2(i + j + 2ij)+1
- можем ли мы проверить это свойство непосредственно на потенциальных простых числах или наш код должен выполнить времена 2 плюс 1 в какой-то момент ?n
во всем этом. В описании метода говорится, что он сгенерирует все простые числа до2 * n + 2
. Но в описании ввода / вывода говорится, что вход естьn
, а выходные данные все простыеn
. Так нужно ли применять метод для генерации всех простых чисел до2 * n + 2
, а затем отбрасывать те, которые больше, чемn
для выходных данных? Или мы должны рассчитатьn
в описании метода из вводаn
?Ответы:
Pyth, 23 байта
демонстрация
Действительно просто реализует алгоритм как дано.
источник
Haskell,
9390 байтКак это работает:
[i+j+2*i*j|j<-r,i<-r]
все,i+j+2ij
что удалено (\\
) из[1..n]
. Масштабировать2x+1
и превратить их в строку (show
). Присоединиться с NL (unlines
).источник
Scala,
115 124 122 115114 байтовАнонимная функция; принимает n в качестве аргумента и выводит результат на стандартный вывод.
источник
JavaScript (ES7),
107105 байтПонимание массива потрясающее! Но мне интересно, почему у JS нет синтаксиса диапазона (например
[1..n]
) ...Это было успешно протестировано в Firefox 40. Разбивка:
Альтернативное, безопасное для ES6 решение (111 байт):
Предложения приветствуются!
источник
МАТЛАБ, 98
И в читабельном виде
источник
Java8:
168165 байтДля более большого числа может использоваться тип данных с широким диапазоном. Нам не нужно итерировать для целых
N
индексовN/2
достаточно.Чтобы правильно понять следующее, это эквивалентный метод.
источник
N>=2
->N>1
?A[i]==0
->A[i]<1
?CJam, 35 байт
Попробуйте онлайн
Это кажется довольно продолжительным по сравнению с решением Pyth от isaacg, но это ... то, что у меня есть.
Объяснение:
источник
Perl 6 , 96 байт
Если я строго следую описанию, то самое короткое, что мне удалось получить, составляет 96 байт.
Если бы я мог выполнить
2n + 1
инициализацию массива, предварительно вставив2
и ограничив его только значениями, меньшими или равнымиn
; это может быть уменьшено до 84 байтов.Если я также проигнорирую, что
j
должно быть по крайней мереi
, я могу уменьшить его до 82 байтов.Пример использования:
источник
PHP, 126 байт
Онлайн версия
источник
Юлия 0,65 байт
Попробуйте онлайн!
Не большая проблема с точки зрения игры в гольф, но я просто должен был сделать это для имени. :)
источник