Это мой первый и очень простой вопрос по гольфу, поэтому я заранее прошу прощения, если нарушил какие-либо правила сообщества.
Задача состоит в том, чтобы распечатать в порядке возрастания все простые числа менее миллиона. Формат вывода должен быть один номер на строку вывода.
Целью, как и в большинстве представлений кода для гольфа, является минимизация размера кода. Оптимизация для времени выполнения также является бонусом, но является вторичной целью.
code-golf
kolmogorov-complexity
primes
Делан Азабани
источник
источник
10^6
еще короче;)1e6
:-DОтветы:
Математика ,
1724Просто для сравнения:
Как отмечено в комментарии, я не смог указать одно простое число в строке; коррекция:
источник
Prime~Array~78498
также 17 :)Print/@
и прекращение с,;
чтобы предотвратить вывод длинного спискаNull
исправлений, стоимостью 8 дополнительных символов.Python 3, 46 байт
К тому времени, когда цикл достигает тестирования
k
, он итеративно вычисляет квадрат-факториалP=(k-1)!^2
. Еслиk
простое число, то оно не появляется в продукте1 * 2 * ... * (k-1)
, поэтому это не является факторомP
. Но, если он сложный, все его главные факторы меньше и поэтому в продукте. Квадрат на самом деле нужен только для того, чтобы избежатьk=4
ложного называния простым.Более того, из теоремы Вильсона следует , что когда
k
простое числоP%k
равно1
. Хотя нам нужно только, чтобы здесь он отличался от нуля, в целом полезно, чтобыP%k
это была индикаторная переменная для того,k
является ли простое число.источник
С, 61 символ
Почти такой же, как этот (вопрос тоже почти такой же).
источник
SEG-FAULT
после печати881
-O3
кgcc
решенной проблеме !!n=2;main(m){n<1e6&&main(m<2?printf("%d\n",n),n:m-++n%m);}
MATLAB
(16)(12)К сожалению, это выводится в одной строке:
но это решается простой транспонированием матрицы:
и я могу вырезать некоторые символы, используя экспоненциальную запись (как это предлагается в комментариях):
источник
1e6
вместо1000000
помогает и здесь.'
в концеБаш (37 символов)
(60 символов)
на моем компьютере (2,0 ГГц процессор, 2 ГБ оперативной памяти) занимает 14 секунд.
источник
seq 2 1000000|factor|sed 's/[0-9]*: //g;/^.* .*$/ d'
seq 1e6|factor|awk '$0=$2*!$3'
немного короче.c p
где c символическая ссылка на cat, а p текстовый файл с простыми числами до миллиона ... вы можете сделать это с помощью встроенных команд оболочки?seq
иfactor
вcoreutils
, так что это законно.sed
также довольно вездесущ.coreutils
можно рассматривать как встроенный. Bash без coreutils похож на C ++ без STL.J, 21 символов
который может быть сокращен до
если вы знаете, сколько простых чисел ниже 1000000.
источник
,.
вместо 1 [\\ для сохранения символа. Удалите ненужные скобки и использовать экспоненциальное обозначение:1e6
.,.i.&.(p:^:_1)1e6
не короче (после применения предложений @Omar), но я нашел использование под интересно.PowerShell,
4744 байтаОчень медленно, но самое короткое, что я мог придумать.
PowerShell, 123 байта
Это намного быстрее; далеко не оптимальный, но хороший компромисс между эффективностью и краткостью.
источник
Ruby 34
источник
Баш, 30 байт
Так как Саидн не будет действовать по моему предложению - которое короче и быстрее, чем его подход - я решил опубликовать свой собственный ответ:
Как это устроено
перечисляет все натуральные числа до 1000000.
факторы их один за другим. Для первой десятки результат следующий:
В заключение,
изменяет всю строку (
$0
) на произведение второго поля (первого простого множителя) и логического отрицания третьего поля (1
если один простой множитель или меньше, в0
противном случае).Это заменяет строки, соответствующие простым числам, самим числом, а все остальные строки - нулями. Так как awk печатает только истинные значения, будет напечатано только простое число.
источник
awk '$0=$2*!$3'
это круто круто!Рубин
5041источник
.to_a
, так как Enumerable уже включает в себяselect
. Вы также можете использовать сокращенное обозначение для Symbol # to_proc, чтобы сократить его еще больше:p (2..1e6).select &:prime?
(1 не простое)require'prime';p Prime.take 78498
.Баш, 37
Будет ли гольф больше, если я могу ...
Большая часть этого пытается разобрать
factor
неловкий формат вывода.Требуется 5,7 или около того секунд, чтобы завершить на моей машине.
(Так получилось, что мой пост первым перешел на вторую страницу ответов, поэтому никто его не увидит ...)
Старое решение
Это длиннее и медленнее (занимает 10 секунд).
источник
factor
прежде, но там это прямо в coreutils!seq 1e6|factor|grep -oP "(?<=: )\d+$"
с перл-grep взглядом назад-P
включает регулярные выражения в стиле Perl.(?<=: )
является положительным взглядом на строку ":". В основном это говорит о том, что «:» должно идти перед тем\d+$
, что соответствует , но на самом деле не является частью совпадения, поэтому-o
опция просто дает нам одно совпадающее число после двоеточия, то есть просто дает числа, где есть только один фактор, то есть простое число.Python 3.x: 66 символов
Более эффективное решение: 87 символов
На основе сита Эратосфена.
источник
0
и1
. Вы можете исправить это, используя вместо этогоrange(2,10**6)
. Кроме того, я думаю, чтоif
утверждение должно быть в отдельной строке от out,for
иначе вы получите ошибку.Хаскелл, 51
источник
mapM_
наmapM
, возвращаемое значение не будет напечатано, и это Code Golf. ;)APL, 15
У моего переводчика возникли проблемы с памятью, но теоретически это работает.
источник
⍪
спереди, чтобы сделать один номер в строке, и вам не нужно,
.⍳
- первые целые числа.1↓
падает первый.p←
назначает на р.p∘.×p
делает таблицу умножения.p~
удаляет из р все, что находится справа. (,
не требуется, таблица объединяется в список.)Perl, 49 байт
Регулярное выражение кунг-фу :)
Безголовая версия:
Он даже не достиг 10% прогресса, пока я набираю этот пост!
Источник для регулярного выражения: http://montreal.pm.org/tech/neil_kandalgaonkar.shtml
источник
1000000
может быть написано10**6
Юлия, 11
Похоже, что встроенные модули получают голоса, плюс мне нужно больше слов для более длинного ответа.
источник
J (15 или 9)
Я не могу поверить, что это бить Mathematica (даже если это просто
одинна 2 символа)Или же:
источник
... The output format should be one number per line of output.
Вот почему мой ответ начинается с1[\
.gs2, 5 байтов
Закодировано в CP437:
1C 29
толкает миллион,11 6C
это простые числа ниже,54
это показывать линии.источник
GolfScript, 22/20 (20/19) байтов
За счет скорости код можно сделать на два байта короче:
Если выходной формат, указанный в отредактированном вопросе, игнорируется (что и делают многие из существующих ответов), в быстрой версии можно сохранить два байта, а в медленной - один.
Это напечатает дополнительный LF после простых чисел для быстрой версии, и это напечатает простые числа как массив для медленной.
Как это устроено
Обе версии являются реализациями сита Эратосфена .
Быстрая версия делает следующее:
Установите
A = [ 2 3 4 … 999,999 ]
и| = [ 0 1 2 … 999,999 ]
.Установите
N = A[0]
и распечатайтеN
.Соберите каждый N-й элемент из
|
inC
. Это кратныеN
.Set
A = A - C
.Если
A
не пусто, вернитесь к 2.Медленная версия работает аналогичным образом, но вместо последовательного удаления кратных минимума «А» (который всегда является простым), она удаляет кратные всех положительных целых чисел ниже 1 000 000.
конкурентоспособность
В отсутствие каких-либо встроенных математических функций для разложения на множители или проверки на первичность все решения GolfScript будут либо очень большими, либо очень неэффективными.
Хотя это еще далеко от эффективности, я думаю, что достиг приличного соотношения скорости и размера. На момент представления этот подход, по-видимому, является самым коротким из тех, которые не используют ни одну из вышеупомянутых встроенных программ. Я говорю кажется потому что я понятия не имею, как работают некоторые ответы ...
Я протестировал все четыре представленных решения GolfScript: w0lf (пробное деление), другой мой ответ (теорема Уилсона) и два из этого ответа. Это были результаты:
источник
NARS2000 APL, 7 символов
источник
Golfscript
26 2524Изменить (спас еще один символ благодаря Питеру Тейлору):
Старый код:
Этот код имеет только теоретическое значение, так как он невероятно медленный и неэффективный. Я думаю, что это может занять несколько часов, чтобы бежать.
Если вы хотите проверить это, попробуйте, например, только простые числа до 100:
источник
\;
на*
. (Вы также можете получить намного быстрее для текущего количества символов, найдя первый делитель, а не все из них:10 6?,2>{.),2>{1$\%!}?=},`
.,
на:x,
и\.@
наx\
(пробел из-за экранирования проблем с MD в комментариях) и удалить*
.CJam - 11
1e6,
- массив 0 ... 999999{mp},
- выбрать простые числаN*
- объединить с помощью новых строкисточник
GolfScript, 25 (24) байта
Если формат вывода, указанный в редактируемом вопросе, игнорируется, один байт может быть сохранен:
Это будет печатать простые числа как массив (как это делают многие другие решения), а не по одному на строку.
Как это устроено
Общая идея состоит в том, чтобы использовать теорему Вильсона , которая утверждает, что n > 1 является простым тогда и только тогда, когда
Ориентиры
Быстрее, чем пробное деление, но медленнее, чем сито Эратосфена. Смотрите мой другой ответ .
источник
Java, 110 байт
Использование унарного деления через регулярные выражения в качестве критерия примитивности.
источник
C,
9188858281807672 символовАлгоритм ужасно неэффективен, но так как мы занимаемся гольф-кодом, это не должно иметь значения.
источник
main(i,j,b){for(;i++<1e6;b++&&printf("%d\n",i))for(j=2;j<i;)b=i%j++&&b;}
или что-то вроде этого (поскольку я на самом деле не скомпилировал его)i
обязательно быть 0? Я думаю, что если вы предоставите какой-либо аргумент, он потерпит неудачу. Также, я думаю,j
будет какая-то ошибка типа. Не уверен,b
хотя.Mathematica 25
Предполагая, что вы не знаете число простых чисел меньше 10 ^ 6:
источник
J, 16 символов
Без требования формата вывода это может быть уменьшено до 13 символов:
1]\
просто берет массив простых чисел ранга 1, превращает его в массив ранга 2 и помещает каждое простое число в свою собственную строку - и поэтому формат вывода интерпретатора по умолчанию превращает список из одной строки в одно простое число в строке.(#~ f) y
в основномfilter
, гдеf
возвращает логическое значение для каждого элемента вy
.i.1e6
это диапазон целых чисел [0,1000000), и1&p:
это логическая функция, которая возвращает 1 для простых чисел.источник
R
45 45символовДля каждого числа x от 2 до 1e6 просто выведите его, если число x mod 2 до x, равное 0, меньше 2.
источник
Баш (433643)
Моя (не очень умная) попытка была использовать фактор для факторинга продукта.
К сожалению, с большими числами продукт, конечно, огромен. Это также заняло более 12 часов, чтобы бежать. Я решил опубликовать это хотя, потому что я думал, что это было уникально.
Вот полный код.
Если бы это было простые числа до шести лет, это было бы разумно.
Ну хорошо, я пытался.
источник
factor
намного хуже, чем основной алгоритм пробного деления.C #, 70
Вы не увидите много здесь, хотя в течение длительного времени ...
источник
double
1e6
в aint
, ноint
это требуетсяRange
. (2) ВнутреннийRange
должен принимать не болееn-2
условий, в противном случае вы будете проверять,n % n
что явно0
. (3) Ты пишешь,x%n
когда хочешьn%x
. Исправление этих проблем, что-то вроде этого будет работать:Enumerable.Range(2,999999).Where(n=>Enumerable.Range(2,n-2).All(x=>n%x!=0))
однако, это все еще не выводит числа; требование было по одному на строку.