Плюс простые против минус простых


35

Большинство из нас знает ...

что все простые числа 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]

45
Я не знала! :(
Стьюи Гриффин

13
@StewieGriffin, интуитивно легко понять, если вы посмотрите на последовательность модулей: 0%6кратно 6, 1%6не может быть определено, 2%6кратно 2, 3%6кратно 3, 4%6кратно 2 и 5%6не может быть определено.
zzzzBov

3
@zzzzBov, было бы очень полезно, если бы я знал, почему у модуля есть последовательность, и что это значит для простых чисел ... Я бы хотел, чтобы старшая школа преподавала теорию чисел ...
Сократов Феникс

@SocraticPhoenix, модуль означает «остаток после деления». 0, 6, 12 и т. Д. Дают 0 после деления на 6; 1, 7, 13 все производят 1. Поскольку мы ищем числа, которые нельзя разделить на факторы, знание того, что число делится на целое число больше 1, говорит нам о том, что число не простое.
zzzzBov

Ответы:




6

Python 2 , 77 байт

-2 байта благодаря Нейлу

lambda x:[sum(all(n%j for j in range(2,n))for n in range(i,x,6))for i in 7,5]

Попробуйте онлайн!

Предыдущее решение, 83 81 79 байт

-1 байт благодаря Mr. Xcoder
-2 байт благодаря Halvard Hummel

lambda x:map([all(n%i for i in range(2,n))*n%6for n in range(4,x)].count,[5,1])

Попробуйте онлайн!
Оба выводятся как [MinusPrimes, PlusPrimes]





Я сделал слишком много пониманий массивов JavaScript - я забыл, что списки Python часто не нуждаются в []s.
Нил

Таким образом, вы делите n на все числа от i до n-1, чтобы увидеть, является ли оно простым, затем генерирует все целые числа (5,11, ...) и (7,13, ...) и проверяет, является ли число, о котором идет речь, есть, и посчитай их. Кажется эффективным. ;)
Якк

5

Желе , 7 байт

s6ÆPSm4

Плюс, потом минус.

Попробуйте онлайн!

Как это работает

s6ÆPSm4  Main link. Argument: n

s6       Split [1, ..., n] into chunks of length 6.
  ÆP     Test all integers for primality.
    S    Sum across columns.
         This counts the primes of the form 6k + c for c = 1, ..., 6.
     m4  Take every 4th element, leaving the counts for 6k + 1 and 6k + 5.

5

Mathematica, 51 байт

(s=#;Mod[Prime~Array~PrimePi@s,6]~Count~#&/@{5,1})&

Попробуйте онлайн!

@ngenisis проиграл 4 байта

Mathematica, 47 байт

sPrime~Array~PrimePi@s~Mod~6~Count~#&/@{5,1}

Modтакже может быть инфиксным, и если вы собираетесь назвать первый аргумент s, просто используйте именованный аргумент:sPrime~Array~PrimePi@s~Mod~6~Count~#&/@{5,1}
ngenisis

5

Japt , 15 13 11 байт

Порядок вывода есть [+,-].

õj ò6 yx ë4

Попробуй это

  • Получил вдохновение от решения Dennis 'Jelly, но, после игры в гольф, это ближе к тому, чтобы быть портом.
  • 2 байта сохранены благодаря Оливеру, ëкоторый привлек мое внимание к ранее неизвестному мне методу для массивов.

объяснение

Неявный ввод целого числа U.

õj

Создайте массив целых чисел ( õ) от 1 до Uи проверьте, является ли каждый простым ( j), давая массив логических значений.

ò6

Разбейте массив на подмассивы длины 6.

yx

Транспонировать ( y) и суммировать столбцы.

ë4

Получить каждый 4-й элемент массива и неявно вывести их.


Оригинал, 19 17 16 15 байт

õ fj
5â £è_%6¥X

Попробуй это

  • 1 байт благодаря вдохновляющему предложению Оливера использовать делители 5 после того, как я почил на лаврах, разделив 15 на массив.


3

Retina , 53 51 байт

.+
$*
1
$`1¶
G`1111
A`^(11+)\1+$
1{6}

*M`111
\b1\b

Попробуйте онлайн! Объяснение:

.+
$*

Преобразовать в одинарный.

1
$`1¶

Считать от 1 до n.

G`1111

Удалить номера меньше 4.

A`^(11+)\1+$

Удалить составные числа.

1{6}

Возьми остаток по модулю 6.

*M`111

Выведите число чисел с остатком от 3 до 5.

\b1\b

Выведите число чисел с остатком 1.


3

Рубин, 61 60 байт

(52 байта + 8 за -rprimesфлаг)

->n{[1,5].map{|x|(4..n).count{|i|i.prime?&&i%6==x}}}

Возвращает массив вида [плюс простые числа, минус простые числа].

Сохранено 1 байт благодаря ГБ!

Попробуйте онлайн.


Я был вдохновлен вашим ответом и обновил мой (в Haskell)!
17

@jferard Я очень рад это слышать! :)
Кристиан Лупаску

Вы можете использовать countдиапазон без оператора splat (сохранить 1 байт).
GB

3

Perl 6 , 42 байта

Сохранено 1 байт за счет удаления ненужного пробела ...

Сэкономили 2 байта, реорганизовав map вызов - благодаря @Joshua.

Сохранено 3 байта, потому что .round равно .round: 1 .

На самом деле сложная экспонента крутая, но очень дорогая по характеру. Сохранено 10 байтов, просто вырубив его ...

{[+] map {.is-prime*($_%6-1??i!!1)},5..$_}

Попробуйте онлайн!

Это была версия со сложной экспоненциальной. (Мне слишком нравится его удалять.) Новая версия работает точно так же, просто сложная экспонента заменяется гораздо более коротким троичным оператором.

{[+] map {.is-prime*exp(π*($_%6-1)i/8).round},5..$_}

Попробуйте онлайн!

Выход представляет собой комплексное число (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 имеет тенденцию быть немного медленнее).


отлично. отличная работа!

Я думаю, что вы имеете в виду в эффективном? Хороший метод, хотя!
Джонатан Аллан

Это была грубая попытка иронии :—).
Ramillies

При игре в гольф, используя метод формы mapили grepиногда может стоить вам несколько символов. Это экономит 2 символа:{[+] map {.is-prime*exp(π*($_%6-1)i/8).round: 1},5..$_}
Джошуа

Забыл сделать это здесь, спасибо, что обратили на это мое внимание!
Ramillies

2

На самом деле , 21 байт

u5x`p░⌠6@%1=;`╖*ƒ⌡Ml╜

Попробуйте онлайн!

Сначала выводит PlusPrimes, а затем MinusPrimes

Объяснение:

u5x`p░⌠6@%1=;`╖*ƒ⌡Ml╜
u5x                    range(5, n+1)
   `p░                 primes in range
      ⌠6@%1=;`╖*ƒ⌡M    for each prime:
       6@%               mod 6
          1=             equal to 1
            ;`╖*ƒ        execute ╖ if p%6==1 (add 1 to register 0, consuming p)
                   l   length of resulting list (MinusPrimes)
                    ╜  push value in register 0 (PlusPrimes)


2

MATLAB 2017a, 29 байт

sum(mod(primes(k),6)'==[5,1])

Пояснение: primes(k)получает все простые числа вплоть до k. mod(primes(k),6)'берет модуль 6 всех простых чисел и транспонирует его так, чтобы сумма проходила по правильному измерению. ==[5,1]устанавливает все пять (minusPrimes) на 1 в первом столбце и все пять (plusPrimes) на 1 во втором столбце.sum()суммирует каждый столбец.

Это выводы [minusPrime, plusPrime]


2

Джапт , 18 16 байтов

-2 байта благодаря @Oliver

õ_j ©Z%6
5â £è¥X

Попробуйте онлайн!

Выходы в формате [PlusPrimes, MinusPrimes].


Хм ... Я только что вернулся к своему столу, увеличил мой гольф до 17 байт, а затем увидел, что вы опубликовали это ... не знаю, должен ли я публиковать это или нет, так как суть обоих наших решений решена. [5,1]чтобы подсчитать, и вы попали туда первым.
Лохматый

@ Shaggy IMO у вашего решения достаточно различий, чтобы остаться отдельным постом. Вы использовали filter и строку; Я использовал функцию отображения õи массив. Кроме того, я получил [5,1]идею из другого ответа.
Джастин Маринер,

Я подумаю об этом немного; решения на разных языках, использующие сходные методы (даже если одно «позаимствовало» его у другого) - это нормально, но 2 решения на одном языке не вполне устраивают меня. Я редактировал свой пост в качестве альтернативы на данный момент.
Лохматый

Я решил бежать с ним, а затем сбрил еще один байт.
Лохматый

Вы можете использовать, чтобы получить[1,5]
Оливер

2

C #, 202 179 174 байта

-23 байта благодаря мистеру Xcoder

-5 байт благодаря Cyoce

Функция, которая возвращает массив длины 2, [MinusPrimes, PlusPrimes] выполняется путем вызова a(n).

int[]a(int n){int[]r={0,0};for(int i=5;i<=n;i++)if(i%2*b(i)>0)if(i%6<5)r[1]++;else++r[0];return r;}int b(int n){for(int i=3;i-2<Math.Sqrt(n);i+=2)if(n%i<1)return 0;return 1;}

Правильно отформатированный код на Try It Online: здесь


Можете ли вы добавить ссылку TIO?
г-н Xcoder

Извините за байт в гольф, 194 байта: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;}
Мистер Xcoder

193 байта: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;}
мистер Xcoder

Я люблю тебя, не так ли;)
MysticVagabond

1
спасибо за всю помощь, так как вы опубликовали отдельный ответ и заявили, что это мой гольф, я просто оставлю свой как есть и возьму уроки для следующей задачи: P
MysticVagabond


1

Pyth , 15 байт

/K%R6fP_TSQ5/K1

Тестирование.

Pyth , 16 байт

m/%R6fP_TSQd,1 5

Тестирование.


Как?

Объяснение № 1

/ K% R6fP_TSQ5 / K1 - Полная программа.

     fP_TSQ - фильтрует простые числа в диапазоне [1 ... вход].
  % R6 - мод 6 на каждого.
 K - назначить их переменной K.
/ 5 - Подсчитать вхождения 5 в К.
            / K1 - подсчитать вхождения 1 в K.
                - Неявно вывести результат.

Объяснение № 2

m /% R6fP_TSQd, 1 5 - Полная программа.

     fP_TSQ - фильтрует простые числа в диапазоне [1 ... input]
  % R6 - мод 6 на каждого.
            , 1 5 - нажать на список [1, 5]
м / д - посчитай, сколько у каждого есть.  
                 - Неявно вывести результат. 

Альтернативы:

/ K% R6fP_TSQ5 / KhZ (16 байт)
K% R6fP_TSQ / K5 / K1 (16 байтов)
m /% R6fP_TSQdj15T (16 байт)
m /% R6fP_TSQd [1 5 (16 байт)   
m /% R6fP_TSQdsM`15 (17 байт)
m /% R6.MP_ZSQd, 1 5 (17 байт)
m /% R6.MP_ZSQdj15T (17 байт)
m /% R6.MP_ZSQd [1 5 (17 байт)

2
Поздравляю по 10к !!
Луис Мендо

@LuisMendo Большое спасибо :-)
Mr. Xcoder

1

Желе ,  12 11  10 байт

Спасибо @cairdcoinheringaahing за несколько советов в чате. Спасибо @Dennis за сохранение одного байта в чате.

ÆR%6ċЀ1,5

Попробуйте онлайн!

Желе , 11 байт

ÆR%6µ1,5=þS

Попробуйте онлайн!

Желе , 11 байт

ÆR%6µċ5,ċ1$

Попробуйте онлайн!


Как это работает?

Объяснение № 1

ÆR%6ċЀ1,5   As usual, full program.

ÆR           Get all the primes in the range [2...input].
  %6         Modulo each by 6.
       1,5   The two-element list [1, 5].
    ċЀ      Count the occurrences of each of ^ in the prime range.

Объяснение № 2

ÆR%6µ1,5=þS   As usual, full program.

ÆR            Get all the primes in the range [2...input].
  %6          Modulo each by 6.
    µ         Chain separator.
     1,5      The two-element list [1, 5].
        =     Equals?   
         þ    Outer product.     
          S   Sum.

Объяснение № 3

ÆR%6µċ5,ċ1$   As usual, full program.

ÆR            All the primes in the range [2...input].
  %6          Modulo each by 6.
    µ     $   Some helpers for the chains.
       ,      Two element list.
     ċ5       The number of 5s.
        ċ1    The number of 1s.

1

Java 8, 141 140 138 106 101 100 96 94 81 байт

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;}

Возвращает целое число-массив с двумя значениями, в обратном порядке по сравнению с описанием вызова:
[plusPrime, minusPrime].

Порт @Xynos 'C # ответа , после того, как я сыграл в гольф 39 40 42 байта.
Огромная помощь от @Nevay для еще одного колоссального -55 байтов.

Объяснение:

Попробуй это здесь. (Финальный тестовый случай 4000000немного превышает ограничение времени 60 секунд.)

n->{                   // Method with integer parameter and integer-array return-type
  int r[]={0,0},       //  Return integer-array, starting at [0,0]
      c;               //  Temp integer
  for(;n-->4;          //  Loop (1) as long as the input is larger than 4
                       //  and decrease `n` by 1 before every iteration
      r[n%6/4]+=c)     //    After every iteration, increase the plus or minus prime by `c`
                       //    (where `c` is either 0 or 1)
    for(c=n;           //   Reset `c` to `n`
        c>1;           //   And inner loop (2) as long as `c` is larger than 1
      c=               //    Change `c` to:
        c-1&~n%c>>-1;  //     inverting the bits of `n`,                    [~n]
                       //     modulo-`c` that result,                       [%c]
                       //     then bit-shift right that by -1,              [>>-1]
                       //     and then bitwise-AND that result with `c-1`   [c-1&]
    );                 //   End of inner loop (2)
                       //  End of loop (1) (implicit / single-line body)
  return r;            //  Return result integer-array
}                      // End of method

1
106 байт: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;}
Nevay

1
101 байт: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;}
Nevay

1
96 байт: 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)
Невай

1
94 байта: 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]).
Невай

1
81 байт: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;}
Nevay

1

JavaScript (ES6), 83 82 80 68 66 байт

Оказалось, что полностью рекурсивное решение было намного короче, чем отображение массива!

Порядок вывода есть [-,+]. Вылетает с ошибкой переполнения где-то около 3490.

f=(n,a=[0,0])=>n>4?f(n-1,a,(g=y=>n%--y?g(y):y<2)(n)&&++a[n%6%5]):a

Попытайся

o.innerText=(

f=(n,a=[0,0])=>n>4?f(n-1,a,(g=y=>n%--y?g(y):y<2)(n)&&++a[n%6%5]):a

)(i.value=6);oninput=_=>o.innerText=i.value>5?f(+i.value):[0,0]
<input id=i min=6 type=number><pre id=o>


0

CJam , 19 байтов

ri){mp},6f%_5e=p1e=

Программа, которая принимает входные данные из STDIN и выводит два числа, разделенных новой строкой, через STDOUT.

Попробуйте онлайн!

объяснение

ri){mp},6f%_5e=p1e=

ri                        Read integer k
  )                       Add 1
       ,                  Filter the (implicit) array [0 1 ... k] ...
   {mp}                   ... on the function "is prime"
         f                Map over the resulting array...
          %               ... the function "modulus" ...
        6                 ... with extra parameter 6
           _              Duplicate the resulting array
             e=           Count occurrences ...
            5             ... of number 5
               p          Print with newline
                 e=       Count occurrences ...
                1         ... of number 1. Implicitly display

0

R + числа , 66 60 58 40 байтов

-16 байтов благодаря Ярко Дуббелдаму! Впоследствии я сыграл в гольф еще два байта.

cat(table(numbers::Primes(4,scan())%%6))

Печатает PlusPrimes MinusPrimesна стандартный вывод; читает со стандартного ввода.

tableтабулирует счетчик каждого вхождения значений в свой входной вектор в порядке возрастания значений. Следовательно, поскольку существует только два значения, а именно 1и 5(mod 6), это как раз та функция, которая нам нужна numbers::Primes, которая возвращает все простые числа между 4входными данными и между ними .

Попробуйте онлайн!

База R , 97 91 89 86 65 байт

здесь тоже куча байтов, сохраненных Ярко

function(n)table((5:n)[sapply(5:n,function(x)all(x%%2:x^.5))]%%6)

Это почти идентично приведенному выше, за исключением того, что оно вычисляет все простые числа в базе R, а не использует пакет, и возвращает результат путем вывода функции, а не распечатывает ее. Вы можете увидеть в выводе, что он возвращает таблицу с именами 1и 5со счетчиками ниже.

Попробуйте онлайн!



(Деннис добавил номера в TIO, так что теперь это работает :))
JAD


all(x%%2:x^.5>0)все, что не равно нулю, уже является правдой, поэтому all(x%%2:x^.5)тоже работает
JAD

@JarkoDubbeldam очень мило! Оказывается, поскольку все значения больше, чем 4мы можем избавиться, >4поскольку мы больше не будем использовать 2их как простое число, так что вместо этого получается до 40 байт.
Джузеппе


0

JavaScript (SpiderMonkey) , 151 , 140 , 131 байт

n=>[...Array(n+1).keys()].splice(5).filter(a=>!/^1?$|^(11+?)\1+$/.test("1".repeat(a))).reduce((r,a)=>(a%6<2?r[1]++:r[0]++,r),[0,0])

Попробуйте онлайн!

Спасибо Shaggy за помощь в исправлении ошибок и игре в гольф.

Объяснение:

n=>                                                   // Create a lambda, taking n
    [...Array(n+1).keys()]                            // Create a list from 0 to n+1
        .splice(5)                                    // remove first five elements
        .filter(a=>                                   // filter the list to get primes
             !/^1?$|^(11+?)\1+$/.test("1".repeat(a))) // using the famous regex here: https://stackoverflow.com/questions/2795065/how-to-determine-if-a-number-is-a-prime-with-regex 
        .reduce((r,a)=>                               // reduce the list
           (a%6<2?r[1]++:r[0]++,r),                   // by counting plus primes
           [0,0])                                     // and minus primes

1
Возврат 17,15за 149 (должно быть 18,15). Вам нужно увеличить размер вашего массива на 1: TIO . Кстати, это просто «ванильная» ES6, ничего особенного для SpiderMonkey в ней нет. Кроме того, вы можете использовать фрагменты стека для JS, а не TIO. И у вас есть много пробелов, которые вы можете удалить.
Лохматый

1
Еще пара быстрых сбережений для вас, чтобы сократить до 131 байта .
Лохматый

@ Shaggy Я не понимал, что ты можешь использовать уменьшение, как это.
Pureferret
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.