Ваша задача, если вы решите принять ее, - написать программу / функцию, которая принимает целое число N в качестве входных данных. Программа / функция должна вывести / вернуть список первых N простых чисел. Но здесь есть одна загвоздка: вам не разрешено использовать простые символы в вашем коде. Простым символом является символ, чья кодовая точка Unicode является простым числом. В диапазоне ASCII для печати это:
%)+/5;=CGIOSYaegkmq
Но правило также применяется к не-ASCII символам, если ваш код использует их.
- Допустимым входным значением является целое число N, где 0 <N <= T , где вы можете выбрать T , но оно должно быть больше или равно 10000. T не обязательно должно быть конечным.
- Для недопустимых входных данных (нецелые числа, целые числа вне диапазона) выведите исключение или не выводите / не возвращайте ничего / ноль.
- Целое число с начальным / конечным пробелом в качестве входных данных считается недействительным.
- Целое число со
+
знаком в качестве входного признака считается недействительным. - Целое число с ведущими нулями в качестве входных данных считается допустимым.
- Если ваш язык позволяет вам передавать уже проанализированное целое число в качестве входных данных, вышеприведенные правила синтаксического анализа (кроме диапазона) не применяются, потому что int уже проанализирован.
- Ввод всегда базовый-10.
- Использование встроенных простых генераторов и тестеров простоты (включая функции факторизации простых чисел) не допускается.
- Исходное ограничение накладывается на символы Юникода, но подсчет байтов для оценки может быть в другой кодировке, если хотите.
- Вывод может содержать один завершающий перевод строки, но это не обязательно.
- Если вы выводите / возвращаете список простых чисел в виде строки, то каждое простое число должно быть разделено одним или несколькими нецифровыми символами. Вы можете выбрать, какой разделитель вы используете.
- Это задача кода-гольфа , выигрывает самый короткий код в байтах.
Фрагмент стека для проверки вашего кода
Вы можете использовать приведенный ниже фрагмент стека, чтобы убедиться, что ваш код не содержит простых символов:
var primes=[],max=10000;for(var i=2;i<=max;i++){primes.push(i);}for(var N=2;N<Math.sqrt(max);N++){if(primes.indexOf(N)===-1){continue;}primes=primes.filter(function (x){return x===N||x%N!==0;});}function setText(elem,text){var z=('innerText' in elem)? 'innerText' : 'textContent';elem[z]=text;}function verify(inputCode,resultSpan){var invalidChars=[];var success=true;for(var i=0;i<inputCode.length;i++){var cc = inputCode.charCodeAt(i);if (cc>max){setText(resultSpan,"Uh oh! The char code was bigger than the max. prime number calculated by the snippet.");success = false;break;}if (primes.indexOf(cc)!==-1){invalidChars.push(inputCode[i]);}}if (invalidChars.length===0&&success){setText(resultSpan, "Valid code!");}else if(success) { var uniqueInvalidChars = invalidChars.filter(function (x, i, self){return self.indexOf(x)===i;});setText(resultSpan, "Invalid code! Invalid chars: " + uniqueInvalidChars.join("")); }}document.getElementById("verifyBtn").onclick=function(e){e=e||window.event;e.preventDefault();var code=document.getElementById("codeTxt").value;verify(code,document.getElementById("result"));};
Enter your code snippet here:<br /><textarea id="codeTxt" rows="5" cols="70"></textarea><br /><button id="verifyBtn">Verify</button><br /><span id="result"></span>
code-golf
restricted-source
primes
ProgramFOX
источник
источник
;
оказывается запрещенным ...+
, то, кажется, разочаровывает необходимость вручную выбрасывать их.Ответы:
CJam,
191830343319172120 байтПопробуйте онлайн.
Это, наверное, один из самых ужасно неэффективных алгоритмов, которые я когда-либо реализовывал. Но я сделал это для размера!
Мой ответ состоит из блока кода, который действует как анонимная функция в CJam. Запустите его с целым числом, непосредственно предшествующим ему в стеке, и полученный список будет выгружен в стек. Я рассматриваю верхнюю границу ввода как бесконечную, поэтому мне не нужно проверять эту границу.
Мой алгоритм начинается с повышения 3 до степени
input
th, которая гарантированно даст число, большее, чемinput
-ое простое число, если введенные данные верны. Затем генерируется список целых чисел от 2 до этого числа минус один, что является достаточно большим диапазоном для размещения всех простых чисел, которые мы хотим. Чтобы избавиться от составных чисел ... вздох ... мы создаем список каждого попарного продукта, который должен генерировать все составные числа от 4 до некоторого тупо большого значения, достаточно большого для наших целей. Затем нужно просто удалить каждый элемент из исходного списка, который находится в этом составном списке, обрезать его до первыхinput
элементов и соединить элементы с символом новой строки.Алгоритм должен работать для любого входа. Однако, достаточно ли у переводчика / компьютера памяти или времени - это совсем другой вопрос, потому что требования к времени и пространству экспоненциальны относительно ввода. Таким образом, если входное значение больше, чем около 5 для онлайн-переводчика или около 8 для автономного переводчика, то ответ на этот вопрос, вероятно, нет.
источник
S*
?S
главный герой?Джава. 474 байта
Принимает ввод через аргумент функции, выводит через выброшенное исключение.
Отступ:
Удаленные символы удалены:
Объяснение:
Мое оригинальное решение использовало
return
утверждение. Задав этот вопрос на StackOverflow, regettman был достаточно любезен , чтобы обеспечить способ для вывода / возврат без использования простых писем.Как обычно, предложения приветствуются :)
источник
Руби, 74
Объяснение:
*o
инициализирует пустой выходной массив. пока у него нетn
элементов, мы найдем наименьшее число> = 2, которое не делит ни один элемент в данный моментo
, и добавим его кo
. Чтобы проверить на деление, yikes. Все хорошие операторы запрещены, и я даже не могу использоватьdivmod
. Лучшее, что я мог видеть, - это использоватьx.div y
, где x делится на y и округляется, а затем умножается на y. Если он равен x, округления не было, поэтому y делит x.1.>x.^
является тестом на равенство, проверяющим, равен ли xor результат 0. Оператор.
before before заключается в том, что нельзя смешивать.
вызовы -free-операторов и вызовы методов без скобок.Изменить: спецификации проверки диапазона были добавлены после того, как я опубликовал это, я думаю. Для соответствия требуется 79 символов:
источник
CJam,
383730 байтПопробуй здесь
Я думаю, что это должно соответствовать всем правилам и работает для любого неотрицательного N (т. Е. T бесконечно). Это ужасно неэффективно, так что не пробуйте это для больших количеств.
Это блок, наиболее близкий к (неназванной) функции, который ожидает целое число в стеке, печатает все простые числа и покидает стек без ввода. Для всех неверных входных данных он либо выдаст ошибку, либо ничего не выведет.
Большая часть кода является проверкой ввода, за которой следует сито Эратосфена. Мне нужно было только обойти ограничение ввода в 3 местах:
)
это инкремент в CJam. Мне это нужно было один раз, но я мог заменить его на~
(побитовое дополнение), потому что в любом случае я возводил в квадрат числа.%
по модулю Я использую37c~
вместо этого, который сначала создает персонажа,%
а затем Эвал. Это делает код намного медленнее.;
выскакивает и сбрасывает элемент из стека. Мне нужно сделать это в конце. Вместо этого я использую,'<(~
который толкает персонажа<
, уменьшает его, а eval это.источник
Bash + coreutils, 227 байт
Это было довольно сложно. Некоторые вещи, с которыми я столкнулся:
while
иuntil
) непригодны для использования, потому что они наиболее близкиdone
к ключевым словам оболочки и не могут быть результатом раскрытия переменной (еслиeval
не используется, но это тоже не так). Единственный используемый цикл - этоfor
/,in
который позволяет{
/}
вместоdo
/done
.for (( ; ; ))
также не пригоден для использования.=
отсутствует, поэтому нам нужен другой способ присвоения переменных.printf -v
хорошо для этого.jot
генерирует список потенциальных факторов во внутреннем цикле. Если потенциальный фактор делит потенциальное простое число, то оно не простое, и мы вырываемся раноbreak
, это встроенная оболочка, а не ключевое слово, поэтому может быть сгенерировано в результате расширения.dc
преобразует базовый номер 13 в поток байтовeak
./
или%
арифметические операторы оболочки. Так что это передается операторуdc
s~
, который помещает частное и остаток в стек.-lt
- less-than - единственный используемый оператор сравнения оболочек.echo
бесполезно для вывода.printf
работает, пока мы избегаем%
Правильно получить подтверждение ввода - это немного больно. Это ничего не возвращает в случае неверного ввода.
Выход:
источник
Haskell, 90 байт
Это анонимная функция, которая принимает целое число в
n
качестве входных данных.Как это работает:
[p|p<-[2..],not$or[b>p-1&&b-1<p|b<-[u*v|u<-[2..p-1],v<-[2..p-1]]]]
(первый пример однострочных простых чисел в вики Haskell, но сelem
замененной функцией) создает бесконечный список простых чисел.zip
она с числами от1
до ,n
чтобы сделать список(prime, seq. number)
пар. Удалить последовательность номер, опять же. Результатом является список простых чисел длиныn
.источник
Ржавчина, 64897 байт
(код пропущен из-за ограничения символов, полное решение здесь )
Следующие свойства ржавчины становятся недоступными из-за основного ограничения:
Что вы можете технически использовать:
Я просто не мог сделать что-нибудь в комплекте с этими инструментами. Мне жаль. Осталось только включить первые 10000 простых чисел, очищенных от 5. По крайней мере, вы можете нарезать его и найти правильное решение в самом узком смысле этого слова.
Мне бы очень хотелось, чтобы эксперты по дайвингу на Тарюнге (или на Rust!) Сказали мне, могу ли я сделать что-то лучше!
источник
GNU APL,
75 68 67 65 59 5655 символов⎕IO
должно быть1
.Я вернулся спустя несколько месяцев, осознав, что у меня есть дополнительное место!
источник
Pyth - 12 байт
Использует основную функцию факторизации Пита, чтобы увидеть, является ли # простым. Использование
!tPT
трюк предложил мне в моем ответе для простых чисел под миллион проблем.Поскольку фильтр работает только для простых чисел под n, а не для первых n, я просто посмотрел обратное число pi (x) для 10000 и получил 104000, поэтому я использую простые числа меньше 10 и получаю первые n. Это на самом деле не работает, поэтому вы должны проверить, заменив
^T6
на^T3
и ограничив n до 1000. Ввод из stdin и вывод в stdout.источник