Большинство из нас знает ...
что все простые числа p>3
имеют вид
Но сколько же простых чисел плюс ( 6n+1
) и сколько простых чисел минус ( 6n-1
) в определенном диапазоне?
Соревнование
Дано целое число k>5
, посчитать , сколько primes<=k
это PlusPrimes и сколько MinusPrimes .
Примеры
у k=100
нас есть
[5, 11, 17, 23, 29, 41, 47, 53, 59, 71, 83, 89]
12 MinusPrimes
и
[7, 13, 19, 31, 37, 43, 61, 67, 73, 79, 97]
11 PlusPrimes
у k=149
нас есть
[5, 11, 17, 23, 29, 41, 47, 53, 59, 71, 83, 89, 101, 107, 113, 131, 137, 149]
18 MinusPrimes
и
[7, 13, 19, 31, 37, 43, 61, 67, 73, 79, 97, 103, 109, 127, 139]
15 PlusPrimes
правила
Ваш код должен выводить 2 целых числа : одно для MinusPrimes и одно для PlusPrimes в любом порядке (пожалуйста, укажите, какой есть какой).
Это код-гольф : самый короткий ответ в байтах побеждает!
Тестовые случаи
Ввод -> Вывод [ MinusPrimes , PlusPrimes ]
6->[1,0]
7->[1,1]
86->[11,10]
986->[86,78]
5252->[351,344]
100000->[4806,4784]
4000000->[141696, 141448]
0%6
кратно 6,1%6
не может быть определено,2%6
кратно 2,3%6
кратно 3,4%6
кратно 2 и5%6
не может быть определено.Ответы:
05AB1E ,
109 байтовСохранено 1 байт благодаря Эрику Аутгольферу
Выходы как
[PlusPrimes, MinusPrimes]
Попробуйте онлайн! или как тестовый набор
объяснение
источник
MATL , 10 байт
Попробуйте онлайн! Или проверьте все тестовые случаи .
объяснение
источник
Python 2 , 77 байт
-2 байта благодаря Нейлу
Попробуйте онлайн!
Предыдущее решение,
838179 байт-1 байт благодаря Mr. Xcoder
-2 байт благодаря Halvard Hummel
Попробуйте онлайн!
Оба выводятся как [MinusPrimes, PlusPrimes]
источник
[]
s.Желе , 7 байт
Плюс, потом минус.
Попробуйте онлайн!
Как это работает
источник
Mathematica, 51 байт
Попробуйте онлайн!
@ngenisis проиграл 4 байта
Mathematica, 47 байт
источник
Mod
также может быть инфиксным, и если вы собираетесь назвать первый аргументs
, просто используйте именованный аргумент:sPrime~Array~PrimePi@s~Mod~6~Count~#&/@{5,1}
Japt ,
151311 байтПорядок вывода есть
[+,-]
.Попробуй это
ë
который привлек мое внимание к ранее неизвестному мне методу для массивов.объяснение
Неявный ввод целого числа
U
.Создайте массив целых чисел (
õ
) от 1 доU
и проверьте, является ли каждый простым (j
), давая массив логических значений.Разбейте массив на подмассивы длины 6.
Транспонировать (
y
) и суммировать столбцы.Получить каждый 4-й элемент массива и неявно вывести их.
Оригинал,
19171615 байтПопробуй это
источник
J , 23 байта
Попробуйте онлайн!
источник
Retina ,
5351 байтПопробуйте онлайн! Объяснение:
Преобразовать в одинарный.
Считать от 1 до
n
.Удалить номера меньше 4.
Удалить составные числа.
Возьми остаток по модулю 6.
Выведите число чисел с остатком от 3 до 5.
Выведите число чисел с остатком 1.
источник
Рубин,
6160 байт(52 байта + 8 за
-rprimes
флаг)Возвращает массив вида [плюс простые числа, минус простые числа].
Сохранено 1 байт благодаря ГБ!
Попробуйте онлайн.
источник
count
диапазон без оператора splat (сохранить 1 байт).Perl 6 , 42 байта
Сохранено 1 байт за счет удаления ненужного пробела ...
Сэкономили 2 байта, реорганизовав
map
вызов - благодаря @Joshua.Сохранено 3 байта, потому что
.round
равно.round: 1
.На самом деле сложная экспонента крутая, но очень дорогая по характеру. Сохранено 10 байтов, просто вырубив его ...
Попробуйте онлайн!
Это была версия со сложной экспоненциальной. (Мне слишком нравится его удалять.) Новая версия работает точно так же, просто сложная экспонента заменяется гораздо более коротким троичным оператором.
Попробуйте онлайн!
Выход представляет собой комплексное число
(PlusPrimes) + (MinusPrimes)i
. Я надеюсь, что это не слишком противоречит правилам.Объяснение: Это функция, которая принимает один целочисленный аргумент. Мы перебираем все целые числа от 5 до аргумента (
(5..$_)
). Для каждого из них мы оцениваем.is-prime
(это вызывается$_
как аргумент сопоставленного блока), умножаем его (если нумерованоTrue == 1, False == 0
) на сложную экспоненту, которая сделана либоexp(0) = 1
(для$_%6 = 1
), либоexp(iπ/2) = i
(для$_%6 = 5
), и, наконец, округляем его до ближайшее целое число Подведение их итогов[+]
дает результат.Наконец: это действительно эффективно, так что я не уверен, что TIO не истечет время ожидания, прежде чем вы получите вывод для больших чисел (для 1e5 это занимает 26 секунд на моей машине, а TIO имеет тенденцию быть немного медленнее).
источник
map
илиgrep
иногда может стоить вам несколько символов. Это экономит 2 символа:{[+] map {.is-prime*exp(π*($_%6-1)i/8).round: 1},5..$_}
На самом деле , 21 байт
Попробуйте онлайн!
Сначала выводит PlusPrimes, а затем MinusPrimes
Объяснение:
источник
С накоплением , 37 байтов
Попробуйте онлайн!
Довольно медленно, тесты на первичность для каждого K < N . Работает аналогично моему J ответу.
источник
MATLAB 2017a, 29 байт
Пояснение:
primes(k)
получает все простые числа вплоть до k.mod(primes(k),6)'
берет модуль 6 всех простых чисел и транспонирует его так, чтобы сумма проходила по правильному измерению.==[5,1]
устанавливает все пять (minusPrimes) на 1 в первом столбце и все пять (plusPrimes) на 1 во втором столбце.sum()
суммирует каждый столбец.Это выводы
[minusPrime, plusPrime]
источник
Джапт ,
1816 байтов-2 байта благодаря @Oliver
Попробуйте онлайн!
Выходы в формате
[PlusPrimes, MinusPrimes]
.источник
[5,1]
чтобы подсчитать, и вы попали туда первым.f
ilter и строку; Я использовал функцию отображенияõ
и массив. Кроме того, я получил[5,1]
идею из другого ответа.5â
чтобы получить[1,5]
C #,
202179174 байта-23 байта благодаря мистеру Xcoder
-5 байт благодаря Cyoce
Функция, которая возвращает массив длины 2,
[MinusPrimes, PlusPrimes]
выполняется путем вызоваa(n)
.Правильно отформатированный код на Try It Online: здесь
источник
public int[]a(int n){int[]r=new int[2];for(int i=5;i<=n;i++)if(i%2*b(i)>0)if(i%6<5)r[1]++;else++r[0];return r;}public int b(int n){for(int i=3;i<=Math.Sqrt(n)+1;i+=2)if(n%i<1)return 0;return 1;}
public int[]a(int n){int[]r=new int[2];for(int i=5;i<=n;i++)if(i%2*b(i)>0)if(i%6<5)r[1]++;else++r[0];return r;}public int b(int n){for(int i=3;i-2<Math.Sqrt(n);i+=2)if(n%i<1)return 0;return 1;}
Haskell ,
8169 байтПопробуйте онлайн!
Первое решение было:
Но я прочитал ответ w0lf в Ruby ...
источник
Pyth , 15 байт
Тестирование.
Pyth , 16 байт
Тестирование.
Как?
Объяснение № 1
Объяснение № 2
Альтернативы:
источник
Желе ,
12 1110 байтСпасибо @cairdcoinheringaahing за несколько советов в чате. Спасибо @Dennis за сохранение одного байта в чате.
Попробуйте онлайн!
Желе , 11 байт
Попробуйте онлайн!
Желе , 11 байт
Попробуйте онлайн!
Как это работает?
Объяснение № 1
Объяснение № 2
Объяснение № 3
источник
Java 8,
141140138106101100969481 байтВозвращает целое число-массив с двумя значениями, в обратном порядке по сравнению с описанием вызова:
[plusPrime, minusPrime]
.Порт @Xynos 'C # ответа , после того, как я сыграл в гольф
394042 байта.Огромная помощь от @Nevay для еще одного колоссального -55 байтов.
Объяснение:
Попробуй это здесь. (Финальный тестовый случай
4000000
немного превышает ограничение времени 60 секунд.)источник
n->{int r[]={0,0},i=4,j,c;for(;i++<n;){for(j=c=1;j*j<i;)c=i%(j+=2)<1?0:c;if(i%2*c>0)r[i%6%5]++;}return r;}
n->{int r[]={0,0},i=4,j,c;for(;i++<n;r[i%6%5%2]-=-i%2*c>>-1)for(j=c=1;j*j<i;)c|=i%(j+=2)-1;return r;}
n->{int r[]={0,0},i=4,j,c;for(;i++<n;r[i%6%5%2]+=i&c)for(j=c=1;j*j++<i;)c&=-i%++j>>-1;return r;}
(-1 спасибо вашемуj++,++j
)n->{int r[]={0,0},i=4,j,c;for(;i++<n;r[i%6/4]+=i&c)for(j=c=1;j*j++<i;)c&=-i%++j>>-1;return r;}
([plusPrime, minusPrime]
).n->{int r[]={0,0},c;for(;n-->4;r[n%6/4]+=c)for(c=n;c>1;)c=c-1&~n%c>>-1;return r;}
JavaScript (ES6),
8382806866 байтОказалось, что полностью рекурсивное решение было намного короче, чем отображение массива!
Порядок вывода есть
[-,+]
. Вылетает с ошибкой переполнения где-то около 3490.Попытайся
источник
CJam , 19 байтов
Программа, которая принимает входные данные из STDIN и выводит два числа, разделенных новой строкой, через STDOUT.
Попробуйте онлайн!
объяснение
источник
R + числа ,
66605840 байтов-16 байтов благодаря Ярко Дуббелдаму! Впоследствии я сыграл в гольф еще два байта.
Печатает
PlusPrimes MinusPrimes
на стандартный вывод; читает со стандартного ввода.table
табулирует счетчик каждого вхождения значений в свой входной вектор в порядке возрастания значений. Следовательно, поскольку существует только два значения, а именно1
и5
(mod 6), это как раз та функция, которая нам нужнаnumbers::Primes
, которая возвращает все простые числа между4
входными данными и между ними .Попробуйте онлайн!
База R ,
9791898665 байтздесь тоже куча байтов, сохраненных Ярко
Это почти идентично приведенному выше, за исключением того, что оно вычисляет все простые числа в базе R, а не использует пакет, и возвращает результат путем вывода функции, а не распечатывает ее. Вы можете увидеть в выводе, что он возвращает таблицу с именами
1
и5
со счетчиками ниже.Попробуйте онлайн!
источник
all(x%%2:x^.5>0)
все, что не равно нулю, уже является правдой, поэтомуall(x%%2:x^.5)
тоже работает4
мы можем избавиться,>4
поскольку мы больше не будем использовать2
их как простое число, так что вместо этого получается до 40 байт.Пари / ГП , 41 байт
Попробуйте онлайн!
источник
JavaScript (SpiderMonkey) ,
151,140, 131 байтПопробуйте онлайн!
Спасибо Shaggy за помощь в исправлении ошибок и игре в гольф.
Объяснение:
источник
17,15
за 149 (должно быть18,15
). Вам нужно увеличить размер вашего массива на 1: TIO . Кстати, это просто «ванильная» ES6, ничего особенного для SpiderMonkey в ней нет. Кроме того, вы можете использовать фрагменты стека для JS, а не TIO. И у вас есть много пробелов, которые вы можете удалить.