Tiene las funciones: h1 (f, * args) y h2 (f, * args)
Ambos son métodos que ya están definidos para usted (aquí el asterisco indica un número variable de argumentos)
f es una función, * args es una lista de parámetros que se pasarán a esa función
h1 devuelve un valor booleano: Verdadero si la función f se detiene cuando se invoca * args y Falso si no lo hace (suponiendo que la máquina en ejecución tenga tiempo y memoria infinitos y que el intérprete / compilador para el idioma en el que está escribiendo sabe cómo manejar el tiempo y la memoria infinitos).
Si f (* args) realizara una llamada a h1 o h2, h1 arroja una excepción
h2 se comporta exactamente como h1, excepto que si f hace llamadas a h1, entonces h2 no arrojará una excepción
En la menor cantidad de caracteres posible, escriba un programa que no tenga entrada y que debería mostrar:
The Collatz Conjecture is {True/False}
Goldbach's Conjecture is {True/False}
The Twin Primes Conjecture is {True/False}
basado en la validez de cada una de esas conjeturas.
Aquí hay enlaces de Wikipedia que explican cada una de las conjeturas:
http://en.wikipedia.org/wiki/Collatz_conjecture
http://en.wikipedia.org/wiki/Goldbach%27s_conjecture
http://en.wikipedia.org/wiki/Twin_prime
Puede suponer que cualquier biblioteca de enteros grandes en cualquier idioma que elija utilizar representará con éxito enteros grandes arbitrarios. En otras palabras, asumiremos que cualquier lenguaje / biblioteca que sea capaz de expresarse 3**(3**10)
también es capaz de expresarse 3**(3**(3**10))
en una máquina lo suficientemente robusta.
Obviamente, dado que es imposible ejecutar su programa, proporcione una explicación de cómo funciona junto con el código
Respuestas:
J 207
Elegí usar
f
yg
en lugar deh1
yh2
, según la recompensa; dos líneas adicionales con 10 caracteres en total antes son suficientes para cambiar:f=:h1
,g=:h2
.Y la lógica real:
Collatz
((-:`>:@*&3)^:(~:&1))^:_
es la carne de eso; Es esencialmente un bucle que lo hacewhile (x != 1) x = collatz(x)
. Si llamamos a esa oraciónreduce
:reduce&f
está destinado a ser un verbo monádico (ver final), dondereduce&f n
es cierto iff sereduce(n)
detiene. Los otros bits de bucle-y>:^:()^:_
, son esencialmente un bucle infinito (>:
es incremental,^:
se puede usar como un condicional y un iterador) que se rompe al encontrar una reducción de Collatz que no se detiene. Finalmenteg
se llama para ver si el ciclo infinito termina alguna vez.Goldbach
La misma lógica, en su mayor parte, la diferencia obvia es que el cálculo central es ahora
+./@1&p:@(-p:@_1&p:)
.-p:@_1&p:
calcula la diferencia entre un número y todos los primos menores que ese número,1&p:
es unaisPrime
función y+./
es OR lógico. Por lo tanto, si la diferencia entre un número y cualquier primo menor que ese número también es primo, entonces se cumple la conjetura de Goldbach y el ciclo infinito continúa. Nuevamente,f
se usa en una prueba final de si dicho bucle infinito es realmente infinito.Primes gemelos
Igual que el anterior, excepto
(4&p:)^:(2&~:@(-~4&p:))
.4&p:
devuelve el siguiente primo más grande después de un número dado.-~4&p:
devuelve la diferencia entre un número y el siguiente primo más grande después de él.2&~:
es!= 2
. Entonces el bucle más interno es análogo awhile (nextPrimeAfter(p) - p != 2) p = nextPrimeAfter(p)
.Notas
Puede haber errores sintácticos, ya que no he probado con dummy
f
yg
todavía. Además, asumí esof
yg
tomaría algún tipo de forma que se puede componer con un verbo a la izquierda y un sustantivo a la derecha, que no estoy completamente seguro de que se adhiera a la gramática J de ninguna manera. Son funciones inherentemente de orden superior, y estoy demasiado cansado para buscar una construcción adecuada como adverbios / conjunciones / lo que sea que tengas en este momento, incluso si existe una construcción tan apropiada.Realmente no utilicé la concatenación de cadenas adecuada, y en su lugar opté por dejar cadenas individuales en caja. El resultado (suponiendo que todo lo demás sea correcto) sería, por lo tanto, una tabla de 3 columnas, con la columna izquierda como "The Collatz", etc., la columna central es "Conjetura es" y la columna derecha "Verdadero" / "Falso" .
También estoy bastante seguro de que J no convierte enteros a precisión arbitraria por defecto, y la función de utilidad de número primo crucial
p:
no tiene un dominio arbitrariamente grande. Por otro lado, dado que J admite un tipo de número de precisión arbitrario estándar, no estoy seguro de cuánto esfuerzo se necesitaría para poner este código a la par.fuente
Haskell, 242
porque en Haskell las variables pueden contener no solo valores, sino también cálculos (esto se llama pereza). Me permití
h1, h2
tomar un solo argumento y devolver el clima o no, su evaluación se detendrá.código un tanto descuidado:
Un poco de explicación:
cuando
all
se aplica a una lista infinita, se detendrá si uno de los elementos de la lista esFalse
, debido a la pereza (cortocircuito, para todas las personas que no son de Haskell). usamos esto para calcular la conjetura de collatz y la conjetura de primos gemelos.!
empaqueta este truco junto con la impresión. el resultado esTrue
cuandof
termina en todos los números4..
. (esto no importa para la conjetura de collatz o la conjetura de primos gemelos, porque ya sabemos que son verdaderas para números tan pequeños).el código para la conjetura de collatz es
"The Collatz"!c
. imprime "La conjetura de Collatz es" y el resultado, que es el clima,c
termina en todos los números4..
.El código para la conjetura de Goldbach es
"Goldbach's"! \n->or[p$n-r|r<-[2..n-2],p r]
.\n->or[p$n-r|r<-[2..],p r,r<n+1]
es una función quen
, si es una suma de dos primos, devuelveTrue
, pero de lo contrario se repite indefinidamente. por lo tanto, si se detiene porque cada4..
conjetura de goldbach es cierta.el código para la conjetura de primos gemelos es
"The Twin Primes"! \n->or[p$r+2|r<-[n..],p r]
.\n->or[p$r+2|r<-[n..],p r]
es una función que dadan
, si hay primos gemelos mayores quen
, devuelve True, pero de lo contrario se repite indefinidamente. así, si se detiene por cada4..
conjetura de primo gemelo, es verdad.fuente
Python (965 caracteres)
Ya que mi pregunta es no recibir amor. Estoy publicando mi solución (sin código de golf) en Python:
Es bastante simple.
numCollatzSteps (n) dice cuántos pasos toma la secuencia de Collatz para un n particular. Se ejecuta infinitamente si dicha secuencia de Collatz no termina.
findNonHaltingN () cuenta hacia arriba comprobando que numCollatzSteps termina para cada n. findNonHaltingN termina si y solo si existe una n para la cual numCollatzSteps no termina.
Entonces podemos verificar si la conjetura de Collatz es verdadera al verificar que findNonHaltingN () no se detiene
isPrime (n) verifica si un número es primo al ver que ningún número entero positivo de 1 a n-1 lo divide
isSumOf2Primes (n) itera sobre todos los enteros positivos entre 2 y n-2 y comprueba que al menos uno es primo junto con su complemento
findNonSum () cuenta números pares hacia arriba desde 4 hasta que alcanza el primer número que no es una suma de 2 primos y luego lo devuelve. Si no existe tal número, entonces continuará infinitamente.
Podemos verificar si la conjetura de Goldbach es cierta al ver que findNonSum no se detiene.
isSmallTwinPrime (n) devuelve verdadero si y solo si n y n + 2 son primos
nextSmallTwinPrime (n) devuelve el siguiente número> = n para el cual isSmallTwinPrime es verdadero
greatestTwinPrimes () cuenta hacia arriba desde 2 comprobando que nextSmallTwinPrime se detiene para todos los n. Si alguna vez nextSmallTwinPrime no se detiene por algún n, entonces se deduce que los primos gemelos más grandes son n-1 yn + 1 y nos detenemos allí
Entonces podemos verificar la validez de la conjetura de primos gemelos comprobando que el más grandeTwinPrimes nunca se detiene.
fuente
APL (234)
Obviamente no se ha probado, pero la lógica parece sólida. Todos los comandos de impresión están incluidos, la salida son
104
caracteres y la lógica real es130
.Sin golf:
fuente
3**(3**10)
(3*3*10
en APL), lo que da un ERROR DE DOMINIO en tryapl.org.