Inspirada nas raízes digitais, a raiz fatorial primária de um número é o número que surge quando você pega os fatores primos de um número, os soma e repete o processo no número resultante, continuando até que você termine com um número primo ( que tem a si próprio como seu único fator primo e, portanto, é sua própria raiz fatorial primordial). A raiz fatorial primária de 4 é 4, como 2 * 2 = 2 + 2, e esta é a única raiz fatorial primária não primária de um número inteiro maior que 1 (que é outro caso especial, pois não possui fatores primos). A sequência OEIS formada por raízes fatoriais primárias é A029908 .
Por exemplo, a raiz fatorial primária de 24 é:
24=2*2*2*3
2+2+2+3=9=3*3
3+3=6=2*3
2+3=5, and the only prime factor of 5 is 5. Therefore, the prime factoral root of 24 is 5.
Sua tarefa:
Escreva um programa ou função que encontre a raiz fatorial primária de um número inteiro de entrada.
Entrada:
Um número inteiro, inserido através de qualquer método razoável, entre 2 e o número inteiro maior suportado pelo seu idioma (inclusive). Não é permitido escolher especificamente um idioma que tenha um tamanho inteiro máximo excessivamente baixo (e também viole essa brecha padrão )
Resultado:
Um número inteiro, a raiz fatorial primária da entrada.
Casos de teste:
4 -> 4
24 -> 5
11 -> 11
250 -> 17
Pontuação:
Isso é código-golfe , a menor pontuação em bytes ganha!
4
nos casos de teste, já que é uma exceção e é fácil esquecê-la ao testar uma resposta?Respostas:
05AB1E , 3 bytes
Experimente online!
Explicações:
fonte
4
.Haskell , 61 bytes
Experimente online!
Explicação
until=<<((==)=<<)
pega uma funçãof
e aplica-a à entradax
até que um ponto fixo seja alcançado, ou seja,f x
igualx
.primeFactors
retorna a lista de fatores primos de um número,sum
produz a soma de uma lista de números.Mas espere, por que
until=<<((==)=<<)
o trabalho e parece tão estranho?Se assumirmos
f=sum.primeFactors
, uma definição mais natural seriauntil(\x->f x==x)f
, porqueuntil
leva um predicado (uma função que retorna um booleano), uma função que tem o mesmo tipo de entrada e retorno (por exemploInt -> Int
) e valor desse tipo e, em seguida, aplica a função ao valor até que o predicado seja cumprido.until(\x->f x==x)f
é o mesmo queuntil(\x->(==)(f x)x)f
, e como ele sustenta,g (h x) x
é o mesmo(g=<<h)x
que obtemosuntil(\x->((==)=<<f)x)f
. Após a conversão do Eta , isso se tornauntil((==)=<<f)f
. Mas se agora tratamos(==)=<<
como uma função aplicadaf
, podemos ver que elauntil(((==)=<<)f)f
está novamente na formag (h x) x
, comg=until
,h=((==)=<<)
ex=f
, portanto, pode ser reescrita para(until=<<((==)=<<))f
. Usando o$
operador para se livrar dos parênteses externos e substituindof
porsum.primeFactors
produz a solução de cima.fonte
=<<((==)=<<)$
Whaaaaaat.Casca , 4 bytes
Experimente online!
Explicação:
fonte
Pitão , 3 bytes
Experimente aqui.
Explicação:
fonte
The trailing GQ is implicit
Python 2 , 84 bytes
Experimente online!
fonte
f=lambda n,d=2:n>1and(n%d and f(n,d+1)or d+f(n/d))
funciona? Eu nunca programei em Python (principalmente Java e C #), por isso não tenho certeza qual é o resultado dessa função. Essa função modifica a entradan
e a retorna depois, ou é semelhante a um booleano emn>1and(n%d and f(n,d+1)or d+f(n/d))
que 0 ou 1, 0 ou 0n
ou algo mais? Estou tentando visualizar como uma porta disso seria em Java / C #, mas não consigo porque realmente não entendo lambdas do Python como esta em geral.n>1 ? (n%d!=0 ? f(n, d+1) : d+f(n/d)) : n>1
. Em termos geraisx and y
é equivalente ax ? y : x
.x and y or z
é equivalente ax ? y : z
na maioria dos casos.f=(n,d=2)->n>1?n%d>0?f(n,d+1):d+f(n/d):0
.x and y
serx ? y : x
do JavaScript. Obrigado!Java 8,
175144142141 bytes-1 byte graças a @Nevay .
Ao contrário de bytes únicos em algumas das linguagens do golfe, o Java é bastante detalhado para verificações primárias, fatores primos, somas de dígitos e assim por diante, então acho que menos de 200 não é muito ruim.
É provável que ainda seja possível jogar golfe combinando loops
e não usando um método recursivo separado para a soma dos dígitos.Explicação:
Experimente aqui.
fonte
i,t=n,x
parece que pertence em Python, hahaint
(ao contrário do Python). ;)i++<n
vez de++i<=n
.Gelatina , 5 bytes
Explicações:
Experimente online!
fonte
Retina , 30 bytes
Entrada e saída em unário .
Experimente online!(Executa conversão decimal / unária por conveniência.)
Explicação
o
{
instrui o Retina a executar o programa inteiro em um loop até que uma passagem completa falhe na modificação da string, ou seja, até que um ponto fixo seja alcançado. Consequentemente, o próprio programa calcula uma etapa da soma dos fatores primos do valor atual.Esse estágio calcula a fatoração principal da entrada. O
+
é semelhante a,{
mas faz um loop apenas neste estágio até que ele pare de alterar a string. O regex tenta corresponder à execução final de1
s correspondendo repetidamente à mesma substring (isto é, o fator). A maneira como isso é feito é um pouco complicada devido à referência direta\1
. Na primeira iteração, agrupe ) para garantir que capturamos o divisor real. O benefício de usar essa abordagem um tanto complicada é que o grupo será usado exatamente n / d vezes, ou seja, o que resta depois de dividir o divisor1
ainda não capturou nada, portanto\1
falha incondicionalmente. Em vez disso, temos que combinar\b11+?\B
qual é a menor substring possível que começa no início da execução, contém pelo menos dois1
se não cobre a execução inteira. As iterações subseqüentes não poderão usar essa alternativa novamente, devido ao\b
. Então, em todas as iterações adicionais, estamos combinando\1
, ou seja, a mesma substring repetidamente. Esse processo precisa atingir o final da string exatamente ( d .$
1
Substituímos essa correspondência por d (
$1
), uma separação;
e n / d ($#1$*
, que insere$#1
cópias de1
, onde$#1
é o número de capturas feitas por grupo1
).Esse processo é interrompido quando a execução final da sequência é, por si só, primária, porque a regex não corresponde mais.
Tudo o que precisamos fazer para somar os números primos é remover todos os separadores.
fonte
Ohm v2 , 4 bytes
Experimente online!
Explicação:
fonte
Na verdade , 7 bytes
Experimente online!
Explicação:
fonte
R + pracma , 53 bytes
Experimente online! (r-violino)
R não têm fatores primos embutidas, mas inúmeros pacotes (
pracma
,numbers
, etc.) fazer, então eu escolhi uma convenientemente curto.fonte
Gelatina , 6 bytes
Esta resposta usa um dos muitos principais fatores de fatoração da Jelly, e o mais rápido possível
repeat until the results are no longer unique
.Experimente online!
fonte
1
é o único caso em que o número de etapas necessárias é igual an
(o que é bom;1
só precisamos executá-lo uma vez), e não parece haver casos em que o número de etapas seja maior quen
(ou seja, parece não haver contra-exemplos). Ah, bem, eu tenho outgolfed: DMATL , 6 bytes
Usa a idéia do escoteiro de fazer um loop mais vezes do que o necessário. Agradeço também a Shaggy por apontar um erro, agora corrigido.
Experimente online!
Explicação
fonte
4
.PowerShell , 124 bytes
Experimente online!
O PowerShell não possui nenhum fator de fatoração principal incorporado, portanto, ele usa o código da minha resposta no Prime Factors Buddies (a linha superior) para executar os cálculos de fatoração.
A segunda linha é a carne deste programa. Tomamos a entrada de
$args
para$x
, em seguida,for
loop até que$l
é-n
ote
qua a$x
. (A primeira iteração$l
é$null
e$x
é um número inteiro, portanto, repetiremos pelo menos uma vez).Dentro do loop, definimos nosso
$l = $x
para determinar se atingimos o final do loop ou não. Em seguida, obtemos os fatores de$x
comf($x)
,-join
aqueles com+
e com|iex
eles (abreviaçãoInvoke-Expression
e semelhante aeval
). Isso é armazenado de volta$x
. Assim, chegamos ao "fim" em que a fatoração primária resumida volta a si mesma. Então, simplesmente colocamos$x
no pipeline e a produção está implícita.fonte
Mathematica, 35 bytes
Experimente online!
(O Mathics não suporta
Tr
. Eu tenho que implementá-lo manualmente)fonte
1##&
é curtoTimes
eFixedPoint
quase sempre pode ser reduzido com//.
:#//.x_:>Tr[1##&@@@FactorInteger@x]&
Times
, mas não sabia sobre oFixedPoint
truque.Tr
à matemática um tempo atrás .Ruby , 63 bytes
Experimente online!
Usa o
-rprime
sinalizador para +6 bytes para usar o Prime # prime_division .prime_division
retorna pares de[prime, exponent]
(por exemplo, para 24, temos os fatores[2, 2, 2, 3]
que ele fornece[[2, 3], [3, 1]]
); portanto, em cada etapa, apenas multiplicamos os membros desses pares e somamos os resultados.fonte
Javascript (ES6), 63 bytes
Ungolfed:
fonte
Java 8, 101 bytes
Porto da incrível resposta Python 2 do @ovs .
Explicação:
Experimente aqui.
fonte