Você recebe as funções: h1 (f, * args) e h2 (f, * args)
Ambos são métodos já definidos para você (aqui o asterisco indica um número variável de argumentos)
f é uma função, * args é uma lista de parâmetros a serem passados para essa função
h1 retorna um valor booleano: True se a função f for interrompida quando chamada * args e False, se não existir (supondo que a máquina esteja com tempo e memória infinitos e que o intérprete / compilador do idioma em que está escrevendo) sabe como lidar com tempo e memória infinitos).
Se f (* args) telefonar para h1 ou h2, h1 lançará uma exceção
h2 se comporta exatamente como h1, exceto que se f fizer chamadas para h1, então h2 não emitirá uma exceção
Com o menor número de caracteres possível, escreva um programa que não aceita entrada e deve gerar:
The Collatz Conjecture is {True/False}
Goldbach's Conjecture is {True/False}
The Twin Primes Conjecture is {True/False}
com base na validade de cada uma dessas conjecturas.
Aqui estão os links da Wikipedia explicando cada uma das conjecturas:
http://en.wikipedia.org/wiki/Collatz_conjecture
http://en.wikipedia.org/wiki/Goldbach%27s_conjecture
http://en.wikipedia.org/wiki/Twin_prime
Você pode assumir que qualquer grande biblioteca de números inteiros, independentemente do idioma que escolher, representará com êxito números inteiros grandes arbitrários. Em outras palavras, assumiremos que qualquer linguagem / biblioteca capaz de expressar 3**(3**10)
também é capaz de expressar 3**(3**(3**10))
em uma máquina suficientemente robusta.
Obviamente, como é impossível executar seu programa, forneça uma explicação de como ele funciona junto com o código
Respostas:
J, 207
Eu escolhi usar
f
eg
no lugar deh1
eh2
, conforme a recompensa; duas linhas adicionais com 10 caracteres no total anteriores são suficientes para alternar:f=:h1
,g=:h2
.E a lógica real:
Collatz
((-:`>:@*&3)^:(~:&1))^:_
é a carne disso; é essencialmente um loop que fazwhile (x != 1) x = collatz(x)
. Se chamarmos essa frasereduce
:reduce&f
deve ser um verbo monádico (ver final), ondereduce&f n
é verdadeiro se sereduce(n)
parar. Os outros bits de loop-y,,>:^:()^:_
são essencialmente um loop infinito (>:
é incremento,^:
pode ser usado como condicional e como iterador) que interrompe ao encontrar uma redução de Collatz que não é interrompida. Finalmente, og
é chamado para ver se o loop infinito termina.Goldbach
A mesma lógica, na maior parte, a diferença óbvia sendo o cálculo principal é agora
+./@1&p:@(-p:@_1&p:)
.-p:@_1&p:
calcula a diferença entre um número e todos os números primos menores que esse número,1&p:
é umaisPrime
função e+./
é OR lógico. Portanto, se a diferença entre um número e qualquer primo menor que esse número também for um primo, a conjectura de Goldbach é satisfeita e o loop infinito continua. Novamente,f
é usado em um teste final para determinar se o referido loop infinito é realmente infinito.Twin Primes
O mesmo que acima, exceto
(4&p:)^:(2&~:@(-~4&p:))
.4&p:
retorna o próximo maior número primo após um determinado número.-~4&p:
retorna a diferença entre um número e o próximo maior número primo depois dele.2&~:
é!= 2
. Portanto, o loop mais interno é análogo awhile (nextPrimeAfter(p) - p != 2) p = nextPrimeAfter(p)
.Notas
Pode haver erros sintáticos, desde que eu não testei com manequim
f
eg
ainda. Além disso, eu assumi issof
eg
assumiria algum tipo de forma que pode ser composta com um verbo à esquerda e um substantivo à direita, que não tenho certeza absoluta de que adere à gramática J de forma alguma. São funções inerentemente de ordem superior, e estou cansado demais para procurar uma construção adequada como advérbios / conjunções / o que você tem no momento, se houver uma construção tão apropriada.Eu realmente não usei a concatenação adequada de strings e, em vez disso, optei por deixar as strings individuais em caixas. A saída (supondo que tudo o mais esteja correto) seria, portanto, uma tabela de 3 colunas, com a coluna da esquerda sendo "The Collatz" etc., a coluna do meio sendo "A conjectura é" e a coluna da direita "True" / "False" .
Também tenho certeza de que J não converte números inteiros em precisão arbitrária por padrão, e a função crucial do utilitário número primo
p:
não possui um domínio arbitrariamente grande. Por outro lado, dado que J suporta um tipo de número de precisão arbitrário padrão, não tenho certeza de quanto esforço seria necessário para obter esse código no mesmo nível.fonte
Haskell, 242
porque, em Haskell, as variáveis podem conter não apenas valores, mas também cálculos (isso é chamado de preguiça). Eu me permito usar
h1, h2
um único argumento e retornar o clima, ou a avaliação será interrompida.código um pouco não destruído:
um pouco de explicação:
quando
all
aplicado a uma lista infinita, ele será interrompido se um dos elementos da lista forFalse
devido à preguiça (curto-circuito, para todos os que não pertencem a Haskell por aí). usamos isso para calcular a conjectura de collatz e a conjectura de primos gêmeos.!
empacota esse truque junto com a impressão. o resultado éTrue
quandof
termina em todos os números4..
. (isso não importa para a conjectura de collatz ou a conjectura de primos gêmeos, porque já sabemos que elas são verdadeiras para números tão pequenos).o código para a conjectura de collatz é
"The Collatz"!c
. imprime "A conjectura de Collatz é" e o resultado, que é o clima,c
termina em todos os números4..
.o código para a conjectura de goldbach é
"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]
é uma função quen
, se for uma soma de dois números primos, retornaTrue
, mas faz um loop indefinidamente. assim, se4..
parar para cada conjectura de goldbach é verdadeiro.o código para a conjectura de primos gêmeos é
"The Twin Primes"! \n->or[p$r+2|r<-[n..],p r]
.\n->or[p$r+2|r<-[n..],p r]
é uma função quen
, se houver primos gêmeos maiores quen
, retorna True, mas, de outra forma, faz um loop indefinidamente. assim, se parar para todas4..
as conjecturas primárias gêmeas é verdade.fonte
Python (965 caracteres)
Desde que minha pergunta está ficando sem amor. Estou postando minha solução (sem código de golfe) em Python:
É bem simples.
numCollatzSteps (n) diz quantas etapas a sequência Collatz para um n específico leva. Ele roda infinitamente se a sequência Collatz não terminar.
findNonHaltingN () conta para cima, verificando se numCollatzSteps termina para cada n. findNonHaltingN termina se, e somente se, existe um n para o qual numCollatzSteps não termina.
Portanto, podemos verificar se a conjectura de Collatz é verdadeira, verificando se findNonHaltingN () não interrompe
isPrime (n) verifica se um número é primo, observando que nenhum número inteiro positivo de 1 a n-1 o divide
isSumOf2Primes (n) itera sobre todos os números inteiros positivos entre 2 e n-2 e verifica se pelo menos um é primo junto com seu complemento
findNonSum () conta números pares acima de 4 até atingir o primeiro número que não é uma soma de 2 números primos e depois o retorna. Se esse número não existir, ele continuará infinitamente.
Podemos verificar se a conjectura de Goldbach é verdadeira ao ver que findNonSum não pára.
isSmallTwinPrime (n) retorna true se e somente se n e n + 2 forem primos
nextSmallTwinPrime (n) retorna o próximo número> = n para o qual isSmallTwinPrime é verdadeiro
largestTwinPrimes () conta mais de 2, verificando se nextSmallTwinPrime pára para todos os n. Se alguma vez nextSmallTwinPrime não parar por algum n, então os maiores números primos gêmeos são n-1 e n + 1 e paramos por aí
Então, podemos verificar a validade da conjectura dos primos gêmeos, verificando se o maiorTwinPrimes nunca pára.
fonte
APL (234)
Obviamente, não foi testado, mas a lógica parece sólida. Os comandos de impressão estão todos incluídos, a saída são
104
caracteres e a lógica real é130
.Ungolfed:
fonte
3**(3**10)
(3*3*10
em APL), o que gera um ERRO DE DOMÍNIO em tryapl.org.