У меня 2/3 близнеца с моим братом, т.е. я родился в тот же день того же месяца, но спустя двенадцать лет. Когда мне было 5 лет, ему было 17 лет, оба простых числа; последняя пара возрастов, на которые мы можем разумно рассчитывать, - это [71, 83], где мы оба живы и можем праздновать этот совпадающий юбилей.
задача
Создать код, который
принимает в качестве входных данных два целых числа: разницу между счетчиком и «двойником» в качестве положительного целого числа k (ну да, я младший) и верхнюю границу в качестве положительного целого числа u (соображение времени выполнения)
и выводит в виде массива или списка всех чисел i, меньших или равных u, для которых i и i + k являются простыми числами. Вывод не нужно сортировать.
Тестовые случаи
12, 1000 -> [5, 7, 11, 17, 19, 29, 31, 41, 47, 59, 61, 67, 71, 89, 97, 101, 127, 137, 139, 151, 167, 179, 181, 199, 211, 227, 229, 239, 251, 257, 269, 271, 281, 337, 347, 367, 389, 397, 409, 419, 421, 431, 449, 467, 479, 487, 491, 509, 557, 587, 601, 607, 619, 631, 641, 647, 661, 727, 739, 757, 761, 797, 809, 811, 827, 907, 929, 941, 971, 997]
2, 999 -> [3, 5, 11, 17, 29, 41, 59, 71, 101, 107, 137, 149, 179, 191, 197, 227, 239, 269, 281, 311, 347, 419, 431, 461, 521, 569, 599, 617, 641, 659, 809, 821, 827, 857, 881]
3, 1500 -> [2]
30, 1500 -> [7, 11, 13, 17, 23, 29, 31, 37, 41, 43, 53, 59, 67, 71, 73, 79, 83, 97, 101, 107, 109, 127, 137, 149, 151, 163, 167, 181, 193, 197, 199, 211, 227, 233, 239, 241, 251, 263, 277, 281, 283, 307, 317, 337, 349, 353, 359, 367, 379, 389, 401, 409, 419, 431, 433, 449, 457, 461, 479, 491, 541, 547, 557, 563, 569, 571, 577, 587, 601, 613, 617, 631, 643, 647, 653, 661, 709, 727, 739, 743, 757, 797, 809, 823, 827, 829, 853, 857, 877, 881, 907, 911, 937, 941, 947, 953, 967, 983, 991, 1009, 1019, 1021, 1031, 1033, 1039, 1061, 1063, 1087, 1093, 1123, 1151, 1163, 1171, 1187, 1193, 1201, 1229, 1249, 1259, 1277, 1289, 1291, 1297, 1399, 1409, 1423, 1429, 1451, 1453, 1459, 1481, 1493]
редактировать
Поскольку я не смог указать верхнюю границу, приветствуются как инклюзивные, так и эксклюзивные решения.
Редакция № 2
Соревнование заканчивается 1 сентября, через неделю после начала.
Похоже, у нас есть победитель, но в случае ничьей популярность - это тай-брейк; в этом случае «второй» будет компенсирован через вознаграждение.
Ответы:
Желе,
87 байтПопробуйте онлайн!
объяснение
источник
Брахилог ,
2723 байтаПопробуйте онлайн!
Проверьте все тестовые случаи.
Предикат 0 (основной предикат)
Предикат 1 (вспомогательный предикат)
источник
05AB1E , 9 байтов
Код:
Использует кодировку CP-1252 . Попробуйте онлайн! ,
источник
Пайк, 10 байт
Попробуй это здесь!
Также 10 байтов:
Попробуй это здесь!
источник
Октава,
3433 байтаисточник
MATL , 8 байт
Благодарю @alephalpha за его подход , который помог мне сэкономить 3 байта
Попробуйте онлайн!
источник
Python 3,
1149290 байтСпасибо @Dennis за -2 байта
Функция, которая принимает входные данные через аргумент и возвращает несортированный набор. Это исключительно в отношении верхней границы.
При этом используется метод , описанный в @ XNOR Ответим здесь , чтобы найти простые числа.
Попробуйте это на Ideone
Как это устроено
Премьер нахождение
Сначала мы инициализируем тестовое значение
i
и продуктP
как1
, а список простых чисел -l
как набор, содержащий0
. Затем выполняетсяwhile
цикл, который проверяет все значенияi
в диапазоне[1, u+k-1]
на простоту. Идея заключается в том , что путем умноженияP
наi^2
в конце каждой итерации,P
принимает значение во(i-1)!^2
время тестированияi
, то есть произведение целых чисел в[1, i+1]
квадрате. Фактический тест на первичность затем выполняется путем вычисленияP mod i
; если это возвращает ноль, тоi
не может быть простым, поскольку это подразумевает, чтоi
оно делится хотя бы на одно из значений, составляющих произведение. Если это вернется1
, тоi
должно быть простым, так как оно не делится ни на одно из значений в продукте. Еслиi
это простое число, оно добавляетсяl
, а если нет, то0
добавляется. Возведение в квадрат продукта предотвращает ложную идентификацию4
как простое число, и здесь полезно, поскольку оно гарантирует, что только0
или1
будет возвращено, что позволяет сделать выбор добавляемого значения путем простого умножения результата наi
.Идентификация «двойниковых» простых чисел
Теперь мы создадим набор дальнейших элементов, содержащий все элементы
l-k
поэлементно. Пересечение этого набора иl
затем найдено с использованием&
, что оставляет набор, содержащий только элементы, общие для обоих наборов. Числоi
есть только в обоих наборах, если обаi
иi+k
являются простыми, это означает, что это оставляет желаемый результат. Однако, еслиk
простое число,0
будет присутствовать в обоих наборах, а это означает, что это должно быть удалено перед возвратом.источник
k,u=input();i=P=1;l={0};exec'l|={P%i*i};P*=i*i;i+=1;'*(u+k);print{i-k for i in l}&l
работает на 83 байта в Python 2. Даже в 3, создание набора таким способом должно сохранить несколько байтов.0
из окончательного набора, так как, еслиk
это простое число, это по ошибке возвращается .R, 98 байт
Ungolfed:
источник
CJam, 17 байт
Либо как полная программа:
Попробуйте онлайн!
Или как безымянный блок:
Попробуйте онлайн!
источник
Java 7,
185175 байтUngolfed & тестовый код:
Попробуй это здесь.
Выход:
источник
PARI / GP, 39 байт
источник
Mathematica, 43 байта
Генерация всех простых чисел, меньших или равных верхней границе. Добавьте разницу в возрасте к результату. Выберите простые числа среди них. Вычтите разницу в возрасте до результата.
источник
Swift, 142 байта
источник
Perl 6 ,
3937 байтОбъяснение:
источник
СИЛОС , 205 байт
Попробуйте онлайн!
Тест на первичность по теореме Вильсона .
источник
На самом деле , 12 байтов
Вклад
u
тогдаk
. Предложения по игре в гольф приветствуются. Попробуйте онлайн!Ungolfing:
источник
R 104 байта
В отличие от другого опубликованного R-решения, оно принимает данные от stdin.
Ungolfed:
источник
Javascript (ES6),
90838075 байтовПример:
источник
Pyth, 13 байт
Программа, которая принимает ввод списка формы
[k, u]
и печатает список.Попробуйте онлайн
Как это устроено
источник