Два простых числа определяются как двойные простые числа, если они отличаются на два. Например, 3 и 5 являются двойными простыми числами, как 29 и 31.
Напишите программу, которая находит n-ю пару двойных простых чисел (где n берется из STDIN) и печатает их в STDOUT, разделенных запятой и пробелом. Это код-гольф, поэтому выигрывает самый короткий код.
Пример ввода:
3
Образец вывода:
11, 13
Ответы:
Haskell 118
Грубая сила всех двойных простых чисел и печатает n- ую пару.
источник
interact
вместоputStrLn
вас, вы можете пойти еще дальше и довести это до 105:a#b=all((>0).rem a)[2..a-b];main=interact$(!!)[show n++", "++show(n+2)|n<-[2..],n#1,(n+2)#2].(+)(-1).read
CJam,
2926 байтПопробуйте онлайн.
Примеры
Как это работает
источник
Perl,
1018787 персонажей, построение над комментарием Ашеплера
101 персонаж, предыдущий ответ
Использование:
объяснение
Работа регулярного выражения, не являющегося первичным, объясняется в этом вопросе SO .
источник
$n=pop;$r='^1$|^(11+?)\1+$';($t=1x$s)=~$r||"11$t"=~$r||--$n||exit say("$s, ",$s+2)while++$s
С: 113
Образец прогона:
Спасибо за помощь от Денниса, Бебе и Алхимика.
источник
scanf
вместо аргументов командной строки. Кроме того,o=0
является ненужным, так какo
является глобальным.main
может содержать переменную int по умолчанию, инкрементc
иi
между присваиваниями и операторами может сократить код, назначениеl
может быть возвращено к первому для третьего блока цикла, так что вам не понадобятся фигурные скобки, и использование только одного символа разделителя в printf может определенно сделать его более компактным.c<=i-1
, что просто глупо.i
вl
выражении присваивания, так как (новое) значениеi
используется для уменьшенияn
. Какие-нибудь советы?CJam - 26
Работает для простых чисел меньше 10000; Вы можете заменить
4
на более высокий показатель для больших чисел (потенциально до 10 20 ), но программа будет работать медленнее и будет использовать больше памяти.Попробуйте это на http://cjam.aditsu.net/
Объяснение:
1e4,
создает массив [0 1 2 ... 9999]{mp},
выбирает только простые числа,_2f-
копирует массив и вычитает 2 из каждого элемента,&
пересекает два массива, таким образом, находя младшие простые числа из каждой пары двойных простых чисел,qi
считывает ввод и преобразует в целое число,(=
корректирует index и получает соответствующее (нижнее) двойное простое число из массива,_2+
копирует простое число и добавляет 2", "\
ставит запятую и пробел между двумя простыми числамиисточник
Mathematica - 63 персонажа
Заметки
На самом деле это довольно простая реализация. Укорочение почти не приводило к запутыванию.
NextPrime
является встроенным, который находит следующее простое число после числа.NestWhile[NextPrime,#,#2-#1!=2&,2]&
является анонимной функцией, которая находит большее простое число следующей пары двойниковых простых чисел после числа.Nest
применяет эту анонимную функциюn
раз.Print[#-2,", ",#]&
является анонимной функцией, которая печатает на стандартный вывод в соответствии со спецификациями. К сожалению, это само по себе занимает 18 символов из 63 символов решения.пример
Обновление: два символа могут быть сохранены путем переопределения этого решения CJam . Однако этот алгоритм ограничивает максимальное значение
n
. Просто заменитеNest...
часть наIntersection[#,#-2][[5]]&@Prime@Range[999]
источник
Javascript (E6) 92
96Короче и соответствует - используйте оболочку spidermonkey для чтения stdin / write stdout (с запятой и пробелом). Он находит 10000-ую пару 1260989, 1260991 менее чем за минуту на моем ПК.
Можно было бы использовать
p[n]=o=n
вместо нее меньшеp.push(o=n)
, чтобы массив p был редким. Но это довольно медленно, и я не собираюсь выигрывать за длину кода в любом случае.Чтобы попробовать в консоли Firefox:
Ungolfed
Функция, которая нашла все первые m близнецов (возвращает наибольшее значение):
Пример:
console.log(T(50))
[5, 7, 13, 19, 31, 43, 61, 73, 103, 109, 139, 151, 181, 193, 199, 229, 241, 271, 283, 313, 349, 421, 433, 463, 523, 571, 601, 619, 643, 661, 811, 823, 829, 859, 883, 1021, 1033, 1051, 1063, 1093, 1153, 1231, 1279, 1291, 1303, 1321, 1429, 1453, 1483, 1489]
Просто последнее:
Затем возьмите эти 2 строки и добавьте IO
источник
J -
49 60 5551 байтЯ решил пойти с простым подходом. Функция
t
находит следующее двойное простое число, заданное в качестве входного значения простым числом (теперь оно включено вf
функцию). Функцияf
находит n-е двойное простое число. Это также первая настоящая программа, которую я написал на J.Примеры:
Только для некоторых бровей, имейте неопрятную версию.
Объяснение:
источник
C #, 265
источник
.Count(x=>j%x==0)==2)
->.Count(x=>j%x<1)<3)
P
вместо,Program
а параметрa
вместоargs
.)
после.Count(...)<3
. Вы также можете немного сэкономить, перейдяvar i=int.Parse(args[0]);int f=0,c=0;
вint i=int.Parse(args[0]),f=0,c=0;
. Вы можете сохранить некоторые из них, извлекая инициализатор из цикла, поэтомуc=0;for(int j=1;
=>c=0,j=1;for(;
.for
цикла, плюс использование полного имени, а неusing System
:using System.Linq;class P{static void Main(string[]args){int i=int.Parse(args[0]),f=0,c=0,j=1;for(;;j+=2)if(Enumerable.Range(1,j).Count(x=>j%x<1)>2)f=0;else if(f<1)f=j;else{if(++c==i){System.Console.WriteLine(f+", "+j);break;}j-=2;f=0;}}}
238 символов.Рубин 94
Онлайн тест: http://ideone.com/B2wxnG
источник
Perl,
10095Ungolfed:
источник
T-SQL (2008+): 344
Грубая сила CTE для поиска простых чисел, оконная функция для подсчета n, а затем объединение для поиска двойника. Работает в секунду для выходов <1000, чуть меньше минуты для выходов <10000.
Гольф (SQLFiddle здесь ):
Четкий:
источник
GolfScript 46
Онлайн тест: ссылка
Аннотированный код:
источник
PHP 5.4, 223
Не меньший, но одна попытка от php.
источник
С 309
Продолжает получать следующие простые числа и хранить нечетные и четные условия, а затем проверяет, есть ли разница в два.
источник
for (int i=2;i*i<=k;i++)
R, 91 символ
Ничего особенного
Использование:
источник
Japt,
2319 байт-4 байта благодаря Shaggy
Запустите его онлайн
источник
JavaScript (Node.js), 162 символа
Читает из стандартного ввода, выводит в стандартный вывод, выходит "рано" для ввода
<= 0
.Использование (скрипт выше сохранен как
ntp.js
):источник
AWK - 129
Файл
fsoe-pairs.awk
:Запуск это:
(1-я строка после ввода команды, 2-я строка)
Это основано на собственном алгоритме простого генератора, который я называю «плавающее сито из эрастосфена» (пока я не найду его описанным выше), который хранит только необходимую часть сита и уже вычисленные простые числа.
источник
Python 2 (75)
Так что здесь происходит?
Во-первых, давайте посмотрим на выражение
all(n%i&~2for i in range(2,n-2))
, которое проверяет, если(n-2,n)
являются ли пары двумя простыми числами.Более простое выражение
all(n%i for i in range(2,n))
просто проверяет,n
является ли простое число, пробуя каждый делительi
в диапазоне2<=i<=n-1
и проверяя, все ли остатки ненулевые. Этоall
проверяет именно это, так как Python обрабатывает0
какFalse
и все другие числа какTrue
.Теперь обратите внимание, что
(n-2)%i==0
именноn%i==2
для делителейi>2
. Таким образом, мы можем выполнить проверку первичностиn
иn-2
одновременно, проверяя остатки для обоих0
и2
. Это можно сделать какall(n%i not in [0,2] for i in range(2,n-2))
. Мы стараемся только делителей в пределах2<=i<=n-3
радиn-2
, но этого достаточно для ,n
как хорошо , такn-1
иn-2
не могут быть делителями , если толькоn<=4
. Мы будем только пытаться нечетным,n
начиная с того,5
чтобы избежать этого осложнения и сложности делителяi=2
.Мы гольфы выражения
n%i not in [0,2]
вn%i&~2
, помня , что0
ложны и другие цифрыTrue
. Приоритет оператора(n%i)&(~2)
- именно то, что нужно. Бит-дополнение~2
является...11111101
, поэтому его побитовогоand
с числом нулей-вне2
«s бинарное место значение. Это дает0
(т. Е.False
) Только для0
и2
, именно то, что мы хотим.Уф! Теперь мы имеем, что выражение
all(n%i&~2for i in range(2,n-2))
проверяет,n
является ли верхнее число пары простых чисел-близнецов. Осталось перебрать их, пока мы не увидимc
их, гдеc
находится введенное число. Мы начинаем с5
того,2
чтобы избежать проблем с делителями. Мы уменьшаемc
каждый раз, когда мы сталкиваемся с тем,n
что работает, останавливаясь, когдаc=0
. Наконец, мы печатаем двойную простую пару, которой мы заканчиваем.источник
T-SQL (2012 +), 255 символов
Более компактный двойной первичный искатель T-SQL, который также немного ускоряется.
Человек читаемый формат ::
Основная суть в том, что мы используем встроенную таблицу чисел (master..spt_values type = 'p') и псевдоним с CTE как чем-то коротким. Мы добавляем 2, чтобы избавиться от беспокойства по поводу вытягивания 0 или 1 тривиальных ошибок для нашего набора, так что теперь у нас есть кандидаты 2,2050.
Z самый внутренний запрос получает все простые числа от 2 до 2050, отфильтровывая любое число n, которое делится на число меньше n. Затем мы используем изящную оконную функцию T-SQL 2012,
lag
которая позволяет получить предыдущий результат, поэтому теперь результаты Z a и b являются простыми числамиP[n]
иP[n-1]
соответственно. Запрос R создает выходную строку и отфильтровывает простые числа, не являющиеся двойниками, а также создает порядковый номер для вывода, который мы называем K. Наконец, последний запрос R позволяет нам отфильтровать и получить простое двойное число Kth, изменив его переменную.источник
Mathematica - 71 байт
источник