Задание
Напишите программу или функцию, которая при пропуске числового ввода x
печатает или возвращает простые числа ниже квадратного корня из x
1 , которые не являются множителями x
.
Примеры
Позвольте f(x)
быть функция называется:
>>> f(4)
[]
>>> f(5)
[2]
>>> f(20)
[3]
>>> f(60)
[7]
>>> f(100)
[3, 7]
>>> f(10000)
[3, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]
Бонус Правила
- Вы можете использовать любые встроенные функции, которые предоставляет ваш язык.
- Ваша программа должна поддерживать
x
ввод, превышающий верхнюю границу, определенную вашим языком.
1 Использование квадратного корня в качестве только простых чисел ниже квадратного корня может быть фактически вовлечено в факторы x
. Без этого ограничения у больших чисел будет много лишних напечатанных чисел.
x
», это неправда: число может иметь один простой фактор, который больше его квадратного корня. Действительно, ваши первые два примера (5 и 20) имеют это свойство, как и все простые числа, в два раза больше нечетных простых чисел ...Ответы:
Желе, 6 байтов в кодовой странице желе
Попробуйте онлайн!
Объяснение:
источник
MATL ,
109 байтПопробуйте онлайн!
объяснение
источник
Python 3 ,
6762 байтаПопробуйте онлайн!
источник
MATLAB,
5754 байтаДовольно просто, получает массив простых чисел до sqrt (p), а затем удаляет все, которые также являются факторами p. По умолчанию выводит вывод последней строки, поскольку точка с запятой не указана.
источник
Pyth, 10 байт
Программа, которая принимает ввод числа и печатает список.
Тестирование
Как это устроено
источник
05AB1E , 8 байтов
Попробуйте онлайн!
объяснение
источник
PHP, 76 байт
использует мое решение is_prime для игры в гольф за $ n> 1
принимает входные данные из аргумента командной строки. Беги с
-r
.источник
Mathematica, 46 байт
Анонимная функция. Принимает число в качестве ввода и возвращает список номеров в качестве вывода. Символ Unicode - это U + 2223 DIVIDES для
\[Divides]
.источник
Рубин, 55 байт
Довольно ленивый ответ с использованием встроенного простого перечислителя.
источник
Чудо , 14 байт
Использование:
Извлекает элементы из бесконечного списка простых чисел, пока элемент меньше квадратного корня аргумента.
источник
Пайк, 10 байт
Попробуй это здесь!
источник
PowerShell v2 +, 71 байт
Итеративное решение. Принимает ввод
$n
и создает диапазон из1
доSqrt($n)
(обратите внимание, что оператор диапазона неявно приведёт верхний конец к[int]
который по умолчанию будет выполнять округление Банкира). Затем используется|?{...}
(наWhere-Object
оператора, который действует как фильтр) , чтобы вытащить эти цифры , где$n%$_
не равен нулю (то есть, любой остаток к модулю означает , что он не является фактором, и любой ненулевой является truthy)-and
простое испытание обычно регулярное выражение является$true
, Они остаются на конвейере, и вывод неявный.Примеры
(с некоторым дополнительным форматированием, чтобы улучшить вывод)
NB - Это не удастся на более ранних версиях, если вход больше, чем вокруг
2500000000
, потому что..
оператор диапазона может поддерживать только до 50 000 элементов. Но, поскольку это больше, чем[int]
максимальное значение типа данных по умолчанию ,2147483647
, я предполагаю, что все будет в порядке. На моей машине, PSv4 Win8.1, однако, я могу пойти выше, но я не могу найти документацию, объясняющую разницу.источник
JavaScript (ES6),
7976 байтНа основании моего рекурсивного теста на простоту . Я чувствую, что должно быть несколько способов упростить это, но я не могу понять, как ...
Тестовый фрагмент
источник
Октава, 44 байта
Этот ответ вдохновлен ответом MattWH на MATLAB , но я играл в гольф, используя некоторые особенности, характерные для Octave.
Это анонимная функция, которая принимает данные
x
. Octave имеет встроенное назначение переменных и индексацию, позволяющуюy
сначала создать функцию (это невозможно в MATLAB), а затем использовать как часть логической маски, созданнойismember
(опять же, это невозможно сделать в MATLAB).источник
Perl 6 , 37 байт
Expanded:
источник
TSQL, 130 байт
Это будет выполнено только один раз, затем вам нужно будет удалить временную таблицу для повторного выполнения в том же редакторе
Я сделал версию для ее тестирования, она немного длиннее, потому что онлайн-разрешения для создания таблиц недоступны. По той же причине ему не нужна таблица удаления.
Попробуйте онлайн
источник
R,
5863 байтаПеребирает все значения от 2 до
sqrt(x)
и проверяет, являются ли они простыми сnumbers
пакетом.x%%i
вычисляет,x mod i
что0 -> False
еслиi
является делителемx
и>0 -> True
еслиi
нет.+5 байт, потому что
numbers::Primes(n)
функция не допускает десятичные дроби, хотя2:sqrt(x)
и работает, добавила первичную проверку вif
оператор.источник
Haskell,
5554 байтаВ основном простые вложенные списки. GCD выполняет две роли: проверяет, являются ли числа ниже y факторами y, а также проверяет, является ли y фактором x.
Разместил немного:
источник
gcd(z*x)y>1
.Сетчатка ,
6966 байтПечать простых чисел в отдельных строках, от самых больших до самых маленьких.
Попробуйте онлайн!(Занимает около 10 секунд из-за последних двух тестовых случаев. Заголовок и нижний колонтитул включают отдельный набор тестов с переводом строки и преобразуют вывод в разделение запятыми для удобства чтения.)
объяснение
Преобразовать ввод в унарный.
Это добавляет квадратный корень ввода, разделенный
:
. Квадратный корень вычисляется на основе того факта, что квадратn
также является суммой первыхn
нечетных целых чисел. Мы можем сопоставить последовательные нечетные целые числа с прямой ссылкой(11\1|^1)
. При этом группа будет использоваться ровно в тотn
раз, когдаn
наибольшее число, квадрат которого вписывается во вход.Мы вставляем унарное представление этого числа с
$#1$*1
последующим двоеточием и самим соответствием.Это соответствует всем отсутствующим простым числам, которые вписываются в квадратный корень. Обнаружение простых чисел основано на стандартном регулярном выражении проверки простых чисел , и затем мы просто проверяем , что только что полученное простое число не делит входные данные со вторым прогнозом. Используя эту
&
опцию, мы получаем перекрывающиеся совпадения, чтобы обеспечить получение всех простых чисел.Это преобразует каждую строку (т. Е. Каждое пропущенное простое) обратно в десятичную, сопоставляя число
1
s. Единственная проблема заключается в том, что он вставляет ноль, если не было найдено пропущенных простых чисел.Таким образом, этот этап удаляет этот ноль, если он был добавлен.
источник