Encontrar primos es un rito de paso de programación y, con mucha frecuencia, un primer programa serio que alguien crea (generalmente con división de prueba).
Pero los primos solos ya están desgastados. Una próxima cosa mucho más interesante es obtener las brechas principales: las brechas hasta ahora más largas entre primos consecutivos. Estos son bastante raros y "preciosos". Los primeros pares y sus diferencias son:
2 3 1
3 5 2
7 11 4
23 29 6
89 97 8
113 127 14
...
Mi padre solía calcularlos a mano para divertirse hasta 10k. Veamos qué tan corto puede ser un código.
Reglas:
- sin funciones integradas para pruebas principales, generación primaria o brechas principales
- no recuperar http://oeis.org/A002386 o similar (puedo oler a tramposos desde muy lejos :))
- sin matrices precalculadas
- siga imprimiendo hasta que su tipo entero interno le falle
El conteo de personajes más bajo gana. +10 caracteres si solo imprime los espacios sin los números primos.
También puede mostrar versiones con funciones integradas si son interesantes. Ser creativo.
Aclaración: revisa los números primos e informa cada vez que ve una brecha que es más grande que cualquier brecha que haya visto antes. Por ejemplo, entre 3 y 5, hay un espacio de 2 unidades de ancho. La brecha entre 5 y 7 también es 2, pero esa es una noticia vieja, ya no nos importa. Solo cuando ve una nueva brecha más grande, la informa. Esto refleja cómo los números primos son cada vez menos frecuentes, a medida que las brechas se hacen cada vez más amplias.
EDITAR : La mayoría de las respuestas son brillantes y merecen más reconocimiento. Sin embargo, hasta ahora, una entrada de GolfScript con 48 caracteres es la más corta.
Respuestas:
GolfScript
6659574948Aunque tengo problemas para ejecutarlo aquí http://golfscript.apphb.com/ (¿tal vez a ese sitio no le gusta el bucle infinito?) Pero funciona bien cuando lo ejecuto en mi computadora con golfscript.rb. Soy bastante nuevo en GolfScript, por lo que probablemente esto pueda reducirse aún más. ACTUALIZACIÓN: No creo que esto pueda reducirse mucho más sin cambiar el algoritmo de alguna manera.
Primeras pocas líneas impresas (si no le gusta el "" que se está imprimiendo, puede agregarlo; al comienzo del guión, pero eso lo sube a 49 caracteres):
Idea general legible por humanos de cómo funciona esto (algunas cosas ligeramente diferentes ya que no estoy usando una pila en esta versión):
fuente
Python,
121110109108104103 caracteresLa primera vez que traté de responder aquí, espero haberlo hecho bien ... no estoy seguro de haber contado bien los caracteres.
Hmmm, podría guardar otro personaje en la impresión bajando a Python 2.x ...
fuente
#
, en serio no cuenta los caracteres a mano, ¿verdad? javascriptkit.com/script/script2/charcount.shtmlif all(n%x>0for x in p):
es un poco más corto. También puede guardar algunos caracteres moviendo las declaraciones en la misma línea (por ejemploa=1;b=2;f()
).JavaScript,
90857874 caracteresCódigo corto (compilador de cierre de Google: optimizaciones avanzadas; algunas ediciones manuales; más ediciones de @ MT0 )
Código largo
Salida
Prueba bastante ineficiente para números primos, pero de esa manera usa menos caracteres.
Primero publique aquí, así que disculpe cualquier error.
fuente
for(a=b=2,c=0;b++;){for(d=b;b%--d;);1==d&&(c<b-a&&console.log(a,b,c=b-a),a=b)}
for(a=b=2,c=0;b++;)for(d=b;b%--d;)d<3&&(c<b-a&&console.log(a,b,c=b-a),a=b)
Mathematica,
114108Permite una salida infinita, aunque después de un cierto punto en la secuencia, el ventilador gira y comienza a sospechar que su CPU está jugando Freecell mientras hace todo lo posible para parecer ocupado.
Muestra de salida (Estas son las que recoge en los primeros 30 segundos):
Código sin golf:
fuente
≠
?Haskell -
122116114112110Expresión de lista principal (ineficiente) robada de Will Ness .
-editar- Nunca supe
x|y=z|w=q
que sería válido.fuente
MATLAB
10489Acaba de implementar el método básico marcando cada división posible.
Salida:
fuente
octave
y estoinf
no funciona (y la impresión se difiere hasta que finaliza el bucle). ¿Matlab tiene evaluación de rango diferido?76 caracteres, dogelang
Convertido de mi versión de Python :
Salida:
fuente
Golfscript,
595150 caracteresHombre, cada personaje es extremadamente difícil de perder:
Salida :
Explicacion :
La pila está configurada para que cada iteración comience con la pila de esta manera, la parte superior a la derecha. El
[
indica que el actual marcador de matriz, es decir, cuando el intérprete se encuentra con una]
, todo en la pila desde la marca hasta la parte superior se pone en una matriz.g
es la brecha máxima hasta ahora. De arriba para abajo:Dentro del bucle:
¿Cómo pone todos los divisores en una lista? Hagámoslo paso a paso
¿Qué hace si los divisores están vacíos?
Dos caminos: sí y no. En caso afirmativo (tenga en cuenta que
if
consume el valor superior en la pila):Si no:
Tenga en cuenta en cualquier caso, nuestra pila ahora está en la forma
... | g [ c | c | c
.Ahora
do
aparece el valor superior de la pila, siemprec
, y se repite si es positivo. Comoc
siempre aumenta, esto siempre es cierto, por lo que hacemos un bucle para siempre.Una vez que aparece, la parte superior de la pila es
g [ c | c
, lo que significa que se actualizó por última vezc
, la marca de matriz está en el mismo lugar yg
todavía está donde la esperamos.Estas son las operaciones complicadas de GolfScript. ¡Espero que hayas disfrutado seguirlo!
fuente
Ruby, 110
Solo para Ruby 2.0 debido al
lazy
método:Salida:
fuente
Perl, 105 bytes
Sin golf:
El algoritmo es simple,
$p
recuerda el número primo anterior. Luego$i
pasa de3
arriba a arriba, cuando el tipo $ i "falla en mí" o se vuelve negativo debido al desbordamiento.$i
se prueba de forma cruda comprobando todos los divisores de 2 a$i-1
. Se imprime una línea, si la diferencia actual es mayor que la diferencia impresa anterior$d
.Con algunos bytes más, el tiempo de ejecución se puede mejorar:
El resultado comienza con:
fuente
Python,
9391 caracteresComprobación primitiva ingenua (verifique si es divisible por algo de 2 a
n
(menos caracteres que an/2
)):El segundo nivel de sangría es un carácter de tabulación.
Salida:
fuente
n
solo cheques hastan-1
Bash y algo de Perl para expresiones regulares principales (
167 157 143112 bytes)alguna salida:
fuente
test
protesta bastante y no me funciona. También se podría utilizar un poco delet n++
ylet f=c-p
y reemplazartest
con[
. O posiblemente pruebe en(())
donde no necesita$
o espacios.test -n $d
devuelto verdadero para una cadena vacía.test -n "$d"
estuvo bien pero por más tiempo. Sin embargo, la página de manual dice que -n es opcional, y resulta quetest $d
estaba bien. Y por[ $d ]
lo tanto también. Y g = 0 tuvo que ser inicializado.Perl
9590 bytesversión anterior sin golf:
Esto es similar a mi otra presentación, sans bash.
fuente
for($n=$c=2;$p=$c;$c-$p>$g&&printf"$p $c %d\n",$g=$c-$p){$c=$n if(1x++$n)!~/^(11+?)\1+$/}
C (100)
Mi propia contribución, ningún algoritmo especial, solo golf:
fuente
r
yp
tendrá menos caracteres y obtendrá la bonificación :)Haskell, 134C
Golfizado:
Sin golf:
fuente
C:
493302272246Utilicé la recursión, no el bucle habitual de
for
owhile
.Salida:
fuente
leaking
en la parte superior, porque no está probando isPrime (n2), está dejando números primos entre n1 y n2. Y esto realmente no se puede solucionar, porque no se puede aumentar n2 sin cumplir primos.return
en principal. Salta el últimoelse
. Reemplazar&&
->&
ynum%i==0
connum%i<1
. Y según los antiguos estándares c (habrá advertencias), no necesita especificar valores de retorno para las funciones void e int (sus argumentos también son predeterminados para int).int
) y una función de prueba principal muy reducida:e(j,i){while(j%++i);return i==j;}f(a,b,c){int A=e(a,1),B=e(b,1);if(A&B&&c<b-a)printf("%d %d %d\n",a,b,c=b-a);f(a+(B|!A),b+(A|!B),c);}main(){f(2,3,0);}
Oracle SQL,
216202196172 + 10 = 182Acabo de notar esto en la pregunta:
Como se trata de SQL y las palabras clave son tan largas, en realidad es mejor tomar la penalización, dando lo siguiente. Es la misma idea que la original.
que embellece a:
Respuesta anterior (196)
y en un formato legible:
Esto crea un generador de números
c
, la sub-selección más interna crea los números primos usando un Tamiz de Eratóstenes, el externo resuelve el primo anterior y finalmente la última selección resta uno del otro.Esto no devolverá nada porque está realizando 1 x 10 124 consultas recursivas ... Entonces, si desea que funcione, reduzca este número a algo razonable.
fuente
D - 153 + 10 = 163
Estoy dispuesto a aceptar la penalización de +10 aquí, porque el recuento de caracteres aún es más bajo de lo que hubiera sido si hubiera impreso también los números primos.
Golfizado :
Versión legible :
fuente
JAVASCRIPT 174 char
version corta:
fuente
Javascript 138
Copie este código a la consola de su navegador. Será por siempre como el número máximo es algo alrededor
1.79*10^308
.Sin golf:
fuente
C #
162161 caracteres151 caracteres + 10 caracteres de penalización = 161 caracteres
Version corta:
Versión larga:
En realidad, era mejor tomar 10 caracteres de penalización, ya que es una escritura más corta
g
(11 caracteres con penalización) quep+" "+i+" "+g
(13 caracteres sin penalización).fuente
Ruby
90868483 caracteresAlgunos cortocircuitos booleanos, evaluación de abuso de expresión, etc.
fuente
C 248
El código compara los números primos consecutivos a, by luego comprueba si los espacios son mayores que g y luego encuentra el siguiente par de números primos.
fuente
Haskell,
154 144 137123Los primos
p
se generan usando el tamiz de erasthotenes#
, y luego se filtran e imprimen usando%
.La salida se ve como
que espero que esté bien
fuente
Game Maker Language, 85
Asumiendo todas las variables no inicializadas como
0
(este es el valor predeterminado con algunas versiones de Game Maker).fuente
Game Maker Language, 74 + 55 = 129
Asumiendo todas las variables no inicializadas como
0
(este es el valor predeterminado con algunas versiones de Game Maker).La secuencia de comandos
p
está a continuación:fuente
Perl, 87 bytes ( usando un módulo )
Escribí el módulo, pero tendríamos que agregar 565,000 caracteres adicionales a la cuenta. Principalmente publicando por diversión, pero también para dar una alternativa de rendimiento ya que hasta ahora no veo ninguno usando builtins. 4.6s para huecos a 1e9, 36s para huecos a 1e10, 6.5min para 1e11.
Pari / GP 2.8 se puede hacer básicamente de la misma manera, aunque más de 2 veces más lento:
fuente
Perl 153
Código corto:
fácil de leer:
fuente