Escriba un programa que solicite al usuario un número entero mayor que 2.
Dada la conjetura de Goldbach de que cada número entero mayor que 2 puede expresarse como la suma de dos números primos, imprime dos números primos que, cuando se suman, proporcionan el número par solicitado. Editar: el programa solo tiene que imprimir UN PAR de primos, no todos. Por ejemplo:
4: 2 + 2
6: 3 + 3
8: 3 + 5
10: 5 + 5 o 3 + 7
Respuestas:
APL, 34 o 44 bytes
La primera versión tiene una longitud de 34 símbolos y está restringida a los caracteres de los conjuntos de caracteres APL de un solo byte originales, como el que aún se admite en Dyalog APL:
Explicación:
La segunda versión tiene solo 22 símbolos de largo, porque explota la
π
función para verificar los números primos, pero eso solo está disponible en NARS2000 que usa Unicode, por lo que el recuento de bytes es 44 en UCS-2:Explicación:
Ejemplos
(⎕: es el mensaje que solicita un número)
fuente
¯2π⍳2πn
Funcionaría como un generador principal?π
exactamente el operador?π
cambia con⍺
:¯2πx
calcula el xth primo,¯1πx
es el primer primo menor que x,0πx
prueba x para primalidad,1πx
es el primer primo mayor que x,2πx
es el número de primos menor que x,10πx
es el número de divisores de x,11πx
es la suma de todos los divisores de x,12πx
y13πx
son la función de Möbius y totient, respectivamente. Por último, pero no menos importante, la monádicaπx
devuelve la factorización prima de x.Python 2,
7571 bytesPruébelo en Ideone .
Cómo funciona
Usamos un corolario del teorema de Wilson :
En todo momento, la variable m es igual al cuadrado del factorial de k - 1 ; k comienza en el valor 1 y m a valor 0! ² = 1 . El conjunto p consistirá en 0 y todos los números primos hasta el valor actual de k .
En cada iteración, primero verificamos si n - k y k pertenecen a p , lo cual es cierto si y solo si la diferencia establecida de {nk, k} y p está vacía. Si es así, la condición es falsa y el ciclo continúa.
Tenga en cuenta que k> 0 y {n - k, k} satisfarán la condición de algún valor positivo de n - k (suponiendo que la conjetura de Goldbach sea verdadera), por lo que el 0 en p no dará lugar a falsos positivos.
En el bucle, actualizamos k y m . El nuevo valor de m es m × k² = (k - 1)! ² × k² = k! ² , y el nuevo valor de k es k + 1 , entonces m = (k - 1)! ² aún se mantiene antes y después la actualización.
Luego, realizamos la unión de conjunto para agregar el valor de m% k × k a p . Según el corolario del teorema de Wilson, esto agregará 1 × k = k si k es primo y 0 × k = 0 si no.
Cuando finaliza el ciclo, imprimimos los últimos valores de n - k y k , que serán primos con suma n .
fuente
Rubí 2.0 (65)
fuente
PHP - 73 bytes
La entrada se toma como un argumento de línea de comando.
Uso de la muestra:
fuente
GolfScript
413332Acepta argumentos de la línea de comandos, por ejemplo
Encuentra todas las particiones relevantes del número de entrada con:
y luego encuentra la primera partición donde ningún número NO es primo con:
donde el bloque de comprobación compuesto
np
es:Este bloque se filtra a todos los números que dividen uniformemente un número dado. Si no hay tales números (entonces el número es primo), el resultado es
[]
, que es falsey en GolfScript.fuente
perl 6: 69
fuente
R,
17011283 caracteresSangrado:
Uso:
Antigua solución a 112 caracteres, para posteridad
Sangrado:
fuente
Python - 107
Básicamente, una mejora en la segunda parte de la respuesta de Nutria (ejecuté esto en 2.7 pero creo que también debería funcionar para 3.x)
fuente
:
?JavaScript (ES6) (Regex), 105
Ahora tiene una expresión regular que prueba la conjetura de Goldbach, que tiene un bajo requerimiento de características especiales (soporte básico de referencia, retroalimentación positiva y negativa).
Esto utiliza
String.prototype.repeat()
, que es parte de la propuesta de EcmaScript sexta edición. Actualmente, este código solo funciona en Firefox.Realmente necesito un lenguaje mejor que tenga un comando breve cuando trabajo con expresiones regulares ...
fuente
Scala,
286192172148 caracteresNo es el más rápido pero funciona. Llame a g (10) para obtener la lista de pares de goldbach para 10.
La conversión a C ++ es sencilla.
fuente
C -
139129 caracteresfuente
int
declaraciones en su funcióni
. Puede guardar otros 2 caracteres eliminandoif
y agregando otro doble ampersand:i(b,2)&&i(a-b,2)&&printf(...)
&&
. (Nunca me acostumbraré a silenciar el tipo de argumento ...)newLISP -
169148 caracteresincluye el código para ejecutarlo. Los resultados son demasiado generosos ...
fuente
Sabio, 60
Similar en puntaje y sensación a la solución de res , pero creo que es lo suficientemente diferente como para publicar.
fuente
Salvia ,
6562Con lo anterior en el archivo
goldbach.sage
, ejecútelo con Sage ejecutándose en una terminal:Gracias a @boothby por la
p=is_prime
idea.fuente
p=is_prime
.Haskell, 97C
Explicación:
g
es la función "goldbach". Llamarg n
te da el par de números primos que se sumann
.p
es una función que genera una lista de primos menores quen
.c
es la función de verificación principal utilizada para definirp
.Ejecuciones de ejemplo:
fuente
Mathematica 56
Esto devuelve todas las soluciones para el entero de entrada.
Por ejemplo, cuando se ingresa 1298 ...
Tal como está escrito, devuelve cada solución dos veces.
fuente
Julia, 62 caracteres (85 con aviso)
fuente
g(int(readline(STDIN)))
GTB , 31
Para su calculadora TI-84
Sin funciones integradas principales.
Ejecuciones de ejemplo
fuente
JavaScript
139137136fuente
return;
lugar dereturn 0;
Python 3 -
150143 caracteresVersión anterior (150 caracteres):
Nueva versión (gracias a ProgramFOX):
Imprime todas las combinaciones, por ejemplo:
4 2 + 2
10 7 + 3 5 + 5 3 + 7
fuente
|
se puede usar de forma segura con el tipo booleano, por lo que(a+b!=n)|p(a)|p(b)
print([(a,b)for b in range(2,n)for a in range(2,n)if not((a+b!=n)|p(a)|p(b))])
(imprime una lista de tuplas, cuya suma es n). Ahorra 8 bytes.r=range(2,n)
y la referencia tambiénr
ahorran algunos más.q [116 caracteres]
Sin función incorporada para encontrar el número primo.
Entrada
Salida
fuente
Python - 206
Un poco tarde para la fiesta, pero estoy practicando mis habilidades de golf.
¡Realmente codifiqué esto antes de encontrar esta pregunta! Entonces el mío no incluye la hermosa lambda que usan las otras soluciones de Python.
fuente
J -
3532 char"Preguntar al usuario" es la ruina de cada golfista J. ¡Ahí van todos mis personajes ganados con esfuerzo!
Explicado:
".1!:1]1
- Leer en una cadena (1!:1
) desde la entrada (identificador de archivo1
) y convertirlo en un número (".
).p:i.n=:
- Asigne este número a la variablen
y luego tome los primerosn
números primos.+/~
- Hacer una tabla de suma,n
ancha yn
alta.i.&n,
- Convierta la tabla en una lista única, y luego encuentre el índice de la primera aparición den
, que existe si la conjetura de Goldbach es verdadera.p:(n,n)#:
- Recupere la fila y la columna del índice, y tome los números primos correspondientes.Uso:
Si el aviso no hubiera sido un requisito, aquí hay un verbo de 25 caracteres:
fuente
Jalea , 8 bytes (no competitiva)
Pruébalo en línea!o verificar todos los casos de prueba .
Cómo funciona
fuente
Julia,
5049 bytesPruébalo en línea!
Si una función fuera aceptable, el código podría acortarse a 32 bytes :
Cómo funciona
~=primes
crea un alias para la función de primos incorporada que devuelve una lista de todos los números primos hasta su argumento.n=ARGS[]|>int
analiza el primer argumento de la línea de comandos como lo guarda en n .Para encontrar un par adecuado de primos, primero calculamos el rango de primos antes mencionado con
~n
. Luego,n-~n
produce todas las diferencias de estos números primos y n .Al intersecar (
∩
) el resultado con el rango primo en sí mismo, nos aseguramos de que los primos restantes p sean tales que n - p también sea primo.Finalmente,
extrema
toma el primo más bajo y más alto en la intersección, por lo que su suma debe ser n .fuente
SQL
295284En postgresql:
Sin embargo, debería poder hacerlo en la mitad del espacio, si no fuera por cosas como "sin unión externa izquierda en la recursión", "sin subconsulta en la recursión" ...
Aquí está la salida:
fuente
Lote - 266
Salir ordenadamente
fuente
Perl 5, 58 bytes
57, más 1 para
-nE
La entrada y la salida están en unario. Ejemplo:
Punta de sombrero.
fuente
Oracle SQL 11.2, 202 bytes
Sin golf
fuente
Python 3, 107 bytes
b (x) es una prueba de primalidad para x, y g (x) recurre a través de números para encontrar dos primos que se ajusten.
fuente