A fórmula
Tomemos, por exemplo, o número 300
- Os fatores primos de 300 são
[2, 3, 5]
(números únicos que são fatores de 300 e primos) - Ao quadrado de cada um desses números, você
[4, 9, 25]
- Somando essa lista, você terá
4 + 9 + 25 = 38
- Finalmente subtraia essa soma (38) do seu número original
300-38 = 262
(este é o resultado)
Entrada
Sua entrada será um número inteiro positivo maior que 2. Você deve verificar todos os números de 2 ao valor de entrada (inclusive) e encontrar o número que produz o melhor resultado com a fórmula acima.
Resultado
Sua saída será dois números separados por um espaço, vírgula, nova linha ou o que o idioma permitir (a separação é necessária para distinguir os dois números). Eles podem ser enviados para um arquivo, stdout ou o que o seu idioma usar. Seu objetivo é encontrar o número no intervalo que produz a saída máxima ao executar a fórmula acima. O primeiro número exibido deve ser o número inicial (como 300) e o segundo número deve ser a saída que a fórmula produziu (como 262)
Casos de teste
Input: 3 Output: 2, -2
Input: 10 Output: 8, 4
Input: 50 Output: 48, 35
Input: 1000 Output: 1000, 971
Input: 9999 Output: 9984, 9802
Exemplo Trabalhado
Considere a entrada 10, devemos executar a fórmula para todos os números de 2 a 10 (inclusive)
Num PrimeFacs PrimeFacs^2 SumPrimeFacs^2 Result
2 [2] [4] 4 -2
3 [3] [9] 9 -6
4 [2] [4] 4 0
5 [5] [25] 25 -20
6 [2, 3] [4, 9] 13 -7
7 [7] [49] 49 -42
8 [2] [4] 4 4
9 [3] [9] 9 0
10 [2, 5] [4, 25] 29 -19
Como você pode ver, o melhor resultado é o 4
resultado da inserção do valor 8
na fórmula. Isso significa que a saída para uma entrada de 10
deve ser8, 4
Pontuação e Regras
As regras padrão para entradas e saídas se aplicam: Padrão para Code Golf: Métodos de entrada / saída
As brechas padrão são proibidas: Brechas que são proibidas por padrão Os
envios podem ser funções ou programas completos
O menor código em bytes ganha
50
:35, 48
?Respostas:
Pitão,
1715 bytesSuíte de teste.
fonte
Java 8 lambda,
247239233225224219198161 caracteresEu pensei que isso deveria ser possível em menos de 300 caracteres porque ... você sabe ... Java!
E é realmente possível mesmo em menos de 200 caracteres!
Não sei se esse uso de importações é legítimo, mas presumo que esteja tudo bem.Aqui está o lambda ungolfed em uma classe:A descoberta do primefator é baseada nesta resposta . O código usa a funcionalidade de conjuntos, pois eles salvam cada valor apenas uma vez, portanto, não preciso me preocupar com duplicatas adicionadas posteriormente. O restante do código é bastante direto, apenas seguindo a pergunta.
Atualizações
Removida a nova linha da saída.
Graças a @ogregoire por jogar golfe o Integer.MIN_VALUE para 1 << 31!
Depois de analisar o código novamente, encontrei mais alguns lugares onde as coisas podiam ser jogadas no golfe.
Obrigado a @Blue pelo truque == 0 a <1!
Removido algum espaço em branco restante. Também para a separação, é necessário apenas um caractere, para que não seja necessário desperdiçar um caractere.
Mais uma vez obrigado a @ogregoire por apontar que eu posso retornar o valor em vez de imprimi-lo e reunir as declarações! Isso economizou muito!
Descobri que posso usar um ternário em vez do segundo para salvar mais um caractere.
Obrigado a @AstronDan pelo impressionante uso de uma matriz que salva a importação. Isso também me deu a possibilidade de encurtar o primeiro caso para um ternário.
fonte
Integer.MIN_VALUE
pode ser reduzido como1<<31
.int
s no mesmo local para evitar repetiçõesint
várias vezes e atribua a eles seu valor, se possível.System.out.println(...)
e retorne um valor em vez de imprimi-lo: como o OP menciona, o método de E / S padrão está em uso.Na verdade, 21 bytes
Experimente online!
Explicação:
fonte
Actually Programming Language
e não encontrei nada, mesmo depois de navegar na 5ª página dos resultados do Google. Qual é esse idioma?MATL , 18 bytes
Experimente online!
O último caso demora muito para o compilador online, mas produz o resultado correto (leva cerca de 11 segundos no meu computador, rodando no Matlab):
Explicação
Aplicação direta do procedimento descrito.
fonte
C #, 194 bytes
Meu primeiro Code Golf :). Eu usei meu idioma favorito apesar de sua verbosidade. Comecei isso como uma porta de função C # do Java do @ Frozn, mas encontrei várias maneiras de reduzir ainda mais o código com otimizações.
Isso usa uma matriz para armazenar os principais fatores. Por ser indexado pelo fator, substituirá os fatores repetidos por cópias do fator. Isso permite que a função não tenha importações. Isso nem sequer requer sistema.
fonte
Utilitários Bash + GNU, 74
seq
gera todos os números inteiros 2 para nfactor
fornece o número seguido de dois pontos e, em seguida, uma lista separada por espaços de todos os fatores primos, incluindo duplicatas. por exemplo, o resultado para 12 é12: 2 2 3
sed
remove o cólon e os fatores duplicados e gera a expressão aritmética necessária. por exemplo, para 12:12- 2* 2- 3* 3
bc
avalia issonl
prefixos n de volta (começando em 2)sort
pela segunda coluna, numericamente, em ordem decrescenteseq
imprime a primeira linha e sai.Ideone.
fonte
Braquilog , 48 bytes
Explicação
fonte
Gelatina , 13 bytes
Experimente online! ou verifique todos os casos de teste .
Como funciona
fonte
05AB1E,
191716 bytesCódigo:
Explicação:
Experimente online
fonte
Julia, 56 bytes
Experimente online!
Como funciona
Dada uma entrada n , para cada número inteiro k tal que 2 ≤ k ≤ n , geramos a tupla (f (k), k) , onde f (k) é a diferença entre k e a soma dos quadrados de seus fatores primos .
O próprio f (k) é calculado com
k-sumabs2(k|>factor|>keys)
quais fatores k em um Dict de chaves primas e valores de expoente, extrai todas as chaves (fatores primos), pega a soma de seus quadrados e subtrai o número inteiro resultante de k .Finalmente, pegamos o máximo lexicográfico das tuplas geradas e o revertemos acessando-o nos índices 2 e 1 .
fonte
Clojure, 215 bytes
Apenas segue as regras. Calcula os fatores primos de cada número, coloque-os no quadrado e some-os. Depois disso, gere uma lista de vetores de 2 elementos: número inicial e seu resultado e encontre o elemento com o valor máximo do segundo elemento.
Você pode vê-lo online aqui: https://ideone.com/1J9i0y
fonte
R 109 bytes
Eu trapacei e usei um pacote
gmp
.fonte
CJam, 32 bytes
Experimente online!
fonte
Pyke, 17 bytes
Experimente aqui!
fonte
PowerShell v2 +,
124120117 bytesA primeira linha calcula os valores, a segunda é apenas a saída.
Começamos com a criação de um intervalo
2
até o argumento da linha de comando$args[0]
e fazemos um loop|%{...}
. Cada loop definimos variáveis auxiliares iguais ao nosso valor atual com$y=$z=$_
. Em seguida, percorreremos todos os números2
até o número atual. A cada loop interno, verificamos se esse número é um divisor!($z%$_)
e se é primo('1'*$_-match'^(?!(..+)\1+$)..')
, e se os dois subtraímos o quadrado de$y
(as verificações são feitas usando a multiplicação booleana).Depois de passar por todos os divisores primos e subtrair os quadrados, se o número restante for o maior que vimos até agora
$y-gt$o
, definimos nossas variáveis de saída$o=$y;$p=$_
. Depois de percorrer todo o intervalo, simplesmente produzimos um espaço entre eles.fonte
Haskell, 91 bytes
Exemplo de uso:
f 50
->[48,35]
.As funções de fator principal estão disponíveis apenas através do
import Data.Numbers.Primes
qual custa muitos bytes, por isso estou usando o verificador principal do @ Lynn . O resto é simples: para a entrada dem
circuiton
através de[2..m]
e num ciclo internop
através[2..n]
. Mantenha tudo op
que é primo e dividan
, quadrado e soma.fonte
Python 2,
108105100 bytesTeste em Ideone .
fonte
JavaScript (ES6),
111105 bytesNão faço ideia por que não pensei em fazer isso recursivamente antes.
fonte
J, 44 bytes
Abordagem direta. Também retorna todos os valores
n
desse resultado em um valor máximo.Uso
fonte