La mayoría de nosotros sabemos ...
que todos los números primos p>3
son de la forma
Pero, ¿cuántos son los Primos más ( 6n+1
) y cuántos son los Primos menos ( 6n-1
) en un rango determinado?
El reto
Dado un número entero k>5
, cuente cuántos primes<=k
son PlusPrimes y cuántos son MinusPrimes .
Ejemplos
porque k=100
tenemos
[5, 11, 17, 23, 29, 41, 47, 53, 59, 71, 83, 89]
12 MinusPrimes
y
[7, 13, 19, 31, 37, 43, 61, 67, 73, 79, 97]
11 PlusPrimes
porque k=149
tenemos
[5, 11, 17, 23, 29, 41, 47, 53, 59, 71, 83, 89, 101, 107, 113, 131, 137, 149]
18 MinusPrimes
y
[7, 13, 19, 31, 37, 43, 61, 67, 73, 79, 97, 103, 109, 127, 139]
15 PlusPrimes
Reglas
Su código debe generar 2 enteros : uno para MinusPrimes y otro para PlusPrimes en el orden que desee (especifique cuál es cuál).
Este es el código de golf : ¡la respuesta más corta en bytes gana!
Casos de prueba
Entrada -> Salida [ 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
es un múltiplo de 6,1%6
no se puede determinar,2%6
es un múltiplo de 2,3%6
es un múltiplo de 3,4%6
es un múltiplo de 2 y5%6
no se puede determinar.Respuestas:
05AB1E ,
109 bytesGuardado 1 byte gracias a Erik el Outgolfer
Salidas como
[PlusPrimes, MinusPrimes]
Pruébalo en línea! o como un conjunto de pruebas
Explicación
fuente
MATL , 10 bytes
Pruébalo en línea! O verificar todos los casos de prueba .
Explicación
fuente
Python 2 , 77 bytes
-2 bytes gracias a Neil
Pruébalo en línea!
Solución anterior,
838179 bytes-1 byte gracias al Sr. Xcoder
-2 bytes gracias a Halvard Hummel
Pruébalo en línea!
Tanto la salida como [MinusPrimes, PlusPrimes]
fuente
[]
s.Jalea , 7 bytes
Más, luego menos.
Pruébalo en línea!
Cómo funciona
fuente
Mathematica, 51 bytes
Pruébalo en línea!
@ngenisis lo bajó, ahorrando 4 bytes
Mathematica, 47 bytes
fuente
Mod
También puede ser infija, y si usted va a nombrar el primer argumentos
, sólo tiene que utilizar un argumento con nombre:sPrime~Array~PrimePi@s~Mod~6~Count~#&/@{5,1}
Japt ,
151311 bytesEl orden de salida es
[+,-]
.Pruébalo
ë
a mi atención el método previamente desconocido para matrices.Explicación
Entrada implícita de entero
U
.Genere una matriz de enteros (
õ
) de 1 aU
y compruebe si cada uno es un primo (j
), dando una matriz de booleanos.Particionar la matriz en sub-matrices de longitud 6.
Transponer (
y
) y sumar las columnas.Obtenga cada 4to elemento de la matriz y explíquelos implícitamente.
Original,
19171615 bytesPruébalo
fuente
J , 23 bytes
Pruébalo en línea!
fuente
Retina ,
5351 bytesPruébalo en línea! Explicación:
Convierte a unario.
Cuenta desde 1 hasta
n
.Eliminar números menores que 4.
Eliminar números compuestos.
Tome el resto del módulo 6.
Imprima el número de números con un resto entre 3 y 5.
Imprima el número de números con un resto de 1.
fuente
Ruby,
6160 bytes(52 bytes + 8 para la
-rprimes
bandera)Devuelve una matriz de la forma [primos más, primos menos].
¡Guardado 1 byte gracias a GB!
Pruébalo en línea.
fuente
count
en el rango sin el operador splat (guardar 1 byte).Perl 6 , 42 bytes
Se guardó 1 byte al eliminar un espacio inútil ...
Ahorré 2 bytes al reorganizar la
map
llamada, gracias a @Joshua.Guardado 3 bytes porque
.round
es igual.round: 1
.En realidad, el exponencial complejo es genial pero muy costoso en cuanto a caracteres. Ahorró 10 bytes simplemente abandonándolo ...
Pruébalo en línea!
Esta era la versión con el exponencial complejo. (Me gusta demasiado como para eliminarlo). La nueva versión funciona exactamente de la misma manera, solo el exponencial complejo se reemplaza por el operador ternario mucho más corto.
Pruébalo en línea!
La salida es un número complejo
(PlusPrimes) + (MinusPrimes)i
. Espero que no sea demasiado en contra de las reglas.Explicación: Es una función que toma un argumento entero. Repetimos todos los enteros desde 5 hasta el argumento (
(5..$_)
). Para cada uno de estos, evaluamos.is-prime
(se llama a esto$_
, el argumento del bloque mapeado), lo multiplicamos (si se numeraTrue == 1, False == 0
) con un exponencial complejo que se convierte enexp(0) = 1
(para$_%6 = 1
) oexp(iπ/2) = i
(para$_%6 = 5
), y finalmente lo redondeamos a El entero más cercano. Sumarlos con[+]
da el resultado.Finalmente: es realmente eficiente, por lo que no estoy seguro de si TIO no excederá el tiempo de espera antes de que obtenga su salida para números más altos (para 1e5, toma 26 segundos en mi máquina, y TIO tiende a ser algo más lento).
fuente
map
ogrep
algunas veces le puede costar algunos caracteres. Esto ahorra 2 caracteres:{[+] map {.is-prime*exp(π*($_%6-1)i/8).round: 1},5..$_}
En realidad , 21 bytes
Pruébalo en línea!
Imprime primero los PlusPrimes, seguidos por los MinusPrimes
Explicación:
fuente
Apilado , 37 bytes
Pruébalo en línea!
Más bien lento, las pruebas de primalidad para cada K < N . Funciona de manera similar a mi respuesta J.
fuente
MATLAB 2017a, 29 bytes
Explicación:
primes(k)
obtiene todos los números primos hasta k inclusive.mod(primes(k),6)'
toma el módulo 6 de todos los números primos y lo transpone para que la suma se ejecute a lo largo de la dimensión correcta.==[5,1]
establece todos los cinco (minusPrimes) en 1 en la primera columna y todos los (plusPrimes) en 1 en la segunda columna.sum()
suma cada columna.Esto salidas
[minusPrime, plusPrime]
fuente
Japt ,
1816 bytes-2 bytes gracias a @Oliver
Pruébalo en línea!
Salidas en el formato
[PlusPrimes, MinusPrimes]
.fuente
[5,1]
para obtener los recuentos y llegar allí primero.f
ILTER y una cadena; Usé la función de mapeoõ
y una matriz. Además, tuve la[5,1]
idea de otra respuesta.5â
para obtener[1,5]
C #,
202179174 Bytes-23 Bytes gracias al Sr. Xcoder
-5 Bytes gracias a Cyoce
Función que devuelve una matriz de longitud 2,
[MinusPrimes, PlusPrimes]
Ejecutar llamandoa(n)
.Código correctamente formateado en Pruébelo en línea: aquí
fuente
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 bytesPruébalo en línea!
La primera solución fue:
Pero leí la respuesta de w0lf en Ruby ...
fuente
Pyth , 15 bytes
Banco de pruebas.
Pyth , 16 bytes
Banco de pruebas.
¿Cómo?
Explicación # 1
Explicación # 2
Alternativas:
fuente
Jalea ,
12 1110 bytesGracias a @cairdcoinheringaahing por algunos consejos en el chat. Gracias a @Dennis por guardar un byte en el chat.
Pruébalo en línea!
Jalea , 11 bytes
Pruébalo en línea!
Jalea , 11 bytes
Pruébalo en línea!
¿Como funciona esto?
Explicación # 1
Explicación # 2
Explicación # 3
fuente
Java 8,
141140138106101100969481 bytesDevuelve un entero-array con dos valores, en orden inverso en comparación con la descripción reto:
[plusPrime, minusPrime]
.Puerto de @Xynos C # respuesta ' , después de que Jugamos al golf
394042 bytes.Enorme ayuda de @Nevay para otro enorme -55 bytes.
Explicación:
Pruébalo aquí (El caso de prueba final
4000000
excede ligeramente el límite de tiempo de 60 segundos).fuente
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 gracias a tuj++,++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 bytesResultó que una solución totalmente recursiva era mucho más corta que mapear una matriz.
El orden de salida es
[-,+]
. Craps con un error de desbordamiento en algún lugar alrededor de 3490.Intentalo
fuente
CJam , 19 bytes
Programa que toma la entrada de STDIN y emite los dos números separados por nueva línea a través de STDOUT.
Pruébalo en línea!
Explicación
fuente
Números R + ,
66605840 bytes-16 bytes gracias a Jarko Dubbeldam! Posteriormente jugué otros dos bytes.
Imprime
PlusPrimes MinusPrimes
en stdout; lee de stdin.table
tabulates the count of each occurrence of the values in its input vector, in ascending order of value. Hence, since there are only two values, namely1
and5
(mod 6), this is exactly the function we need, along withnumbers::Primes
, which returns all primes between4
and the input.Try it online!
Base R,
9791898665 bytesa bunch of bytes saved by Jarko here, too
This is nearly identical to the above, except it calculates all the primes in base R rather than using a package, and it returns by function output rather than printing it out. You can see in the output that it returns a table with names
1
and5
, with the counts below.Try it online!
fuente
all(x%%2:x^.5>0)
, anything nonzero is already truthy, soall(x%%2:x^.5)
works too4
we can get rid of the>4
since we won't have2
in there anymore as a prime, so this golfs to 40 bytes instead.Pari/GP, 41 bytes
Try it online!
fuente
JavaScript (SpiderMonkey),
151,140, 131 bytesTry it online!
Thanks to shaggy for helping with a bug fix and golfing.
Explanation:
fuente
17,15
for 149 (Should be18,15
). You need to increase the size of your array by 1: TIO. Incidentally, this is just "vanilla" ES6, nothing specific to SpiderMonkey in it. Also, you can use Stack Snippets for JS, rather than TIO. And, you have a lot of spaces you can remove.