Quantos números primos exclusivos?


14

Uma maneira de representar um número natural é multiplicando expoentes de números primos. Por exemplo, 6 podem ser representados por 2 ^ 1 * 3 ^ 1 e 50 podem ser representados por 2 ^ 1 * 5 ^ 2 (onde ^ indica exponência). O número de primos nessa representação pode ajudar a determinar se é mais curto usar esse método de representação, em comparação com outros métodos. Mas como não quero calculá-las manualmente, preciso de um programa para fazer isso por mim. No entanto, como terei que me lembrar do programa até chegar em casa, ele deve ser o mais curto possível.

Sua tarefa:

Escreva um programa ou função para determinar quantos primos distintos existem nessa representação de um número.

Entrada:

Um número inteiro n tal que 1 <n <10 ^ 12, obtido por qualquer método normal.

Resultado:

O número de primos distintos necessários para representar a entrada, conforme descrito na introdução.

Casos de teste:

24      -> 2 (2^3*3^1)
126     -> 3 (2^1*3^2*7^1)
1538493 -> 4 (3^1*11^1*23^1*2027^1)
123456  -> 3 (2^6*3^1*643^1)

Este é o OEIS A001221 .

Pontuação:

Isso é , a menor pontuação em bytes ganha!


3
Tantas perguntas importantes recentemente! Eu amo isso.
Giuseppe


3
A razão por trás do voto negativo pode ser sua trivialidade. Até onde pude ver, existem 3 situações em idiomas de golfe: 1. embutido 2. cadeia de dois embutidos 3. cadeia de 3 embutidos (eu pessoalmente tenho três respostas de 2 bytes); Eu não sei se isso é uma razão sólida para uma downvote, mas é uma possível causa
Mr. Xcoder

1
Poderia ser, mas eu apreciaria se um dos três rebaixadores tivesse comentado me dizendo isso. Embora seja trivial em idiomas de golfe, existem algumas soluções interessantes em idiomas que não são de golfe, que eu queria ver quando publiquei esse desafio. Afinal, existem muitos desafios no site que são triviais para golflangs, mas produzem soluções interessantes que não são golflang.
Gryphon

1
Seria benéfico incluir um prime nos casos de teste. Além disso, algumas linguagens / abordagens são difíceis de testar para grandes números. Alguns casos de teste menores seriam bons.
Dennis

Respostas:


6

MATL , 4 3 bytes

-1 byte graças a Luis Mendo

YFz

Experimente online!

YF         Exponents of prime factors
  z        Number of nonzeros

Resposta original:

Yfun

Experimente online!

Uma Yfunresposta ver .

          (Implicit input)
Yf         Prime factorization
  u        Unique
   n       Numel
           (Implicit output)

1
Por que diversão? - ;-)
Adám

1
Riscado 4 ainda é regular 4
Gryphon

5

05AB1E , 2 bytes

outra resposta muito chata ...

fg

Um programa completo que aceita uma entrada numérica e imprime o resultado

Experimente online!

Quão?

fg - implicitly take input
f  - get the prime factors with no duplicates
 g - get the length
   - implicit print

5

Mathematica, 7 bytes

PrimeNu

Sim, há um embutido.

Mathematica, 21 bytes

Length@*FactorInteger

O longo caminho.


Qual o motivo do asterisco? Não é Length@FactorIntegero mesmo?
numbermaniac

1
Length@*FactorIntegerproduz uma função pura: a composição de Lengthe FactorInteger. Eu posso definir fun=Length@*FactorIntegere depois ligar fun[1001]. Por outro lado, Length@FactorIntegersignificaria Length[FactorInteger]e avaliaria 0.
Misha Lavrov


4

Python 2, 56 bytes

f=lambda n,p=2,k=1:n/p and[f(n,p+1),k+f(n/p,p,0)][n%p<1]

Este é um porto da resposta de Dennis aqui por acaso?
Jonathan Allan

1
@ JonathanAllan Sim, modificado para contar fatores primos únicos.
orlp

4

Retina , 31 30 bytes

&`(?!(11+)\1+$)(11+)$(?<=^\2+)

A entrada está unária.

Obrigado a @MartinEnder pelo golfe de 1 byte!

Experimente online! (inclui conversor decimal para unário)

Como funciona

Como o programa consiste em uma única regex com o &modificador, o Retina simplesmente conta a quantidade de correspondências sobrepostas . Supõe-se que a entrada consiste em n repetições de 1 e nada mais.

O lookahead negativo

(?!(11+)\1+$)

partidas em locais entre 1 's que são não seguidos por duas ou mais 1 ' s ( 11+), seguido por uma ou mais repetições da mesma quantidade de 1 's ( \1+), seguindo-se a extremidade de entrada ( $).

Qualquer número composto ab com a, b> 1 pode ser escrito como b repetições de uma repetição de 1 ; portanto, o lookahead corresponde apenas a locais seguidos de p repetições de 1 , onde p = 1 ou p é primo.

O regex

(11+)$

torna-se p> 1 , exigindo que pelo menos dois 1 's ( 11+) e armazena a cauda de 1 está no segundo grupo de captura ( \2).

Finalmente, o olhar positivo por trás

(?<=^\2+)

verifica se a entrada inteira consiste em ocorrências de kp ( k ≥ 1 ) de 1 , verificando se p divide a entrada.

Assim, cada correspondência corresponde a um divisor principal exclusivo p .


4

Utilitários Bash + GNU, 33

  • 1 byte salvo graças a @Dennis
factor|grep -Po ' \d+'|uniq|wc -l

Experimente online .

Explicação

factor|                            # Split input into prime factors
       grep -Po ' \d+'|            # group factors onto lines
                       uniq|       # remove duplicates
                            wc -l  # count the lines

1
grep -Po ' \d+'salva um byte tr \ \\n|sed 1d.
Dennis

Infelizmente, grep -Po '( \d+)\1*'falha na entrada 46 .
Dennis

@ Dennis graças - Eu fixo-lo usando a sua sugestão original
Trauma Digital

3

Geléia , 3 bytes

uma resposta bastante chata ...

ÆFL

Um link monádico pegando um número e retornando um número

Experimente online!

Quão?

ÆFL - Link: number, n
ÆF  - prime factorisation as a list of prime, exponent pairs
  L - length

1
Como você perdeu Æv?
meu pronome é monicareinstate

Foi fácil - nunca usei isso e não procurei na lista no wiki.
Jonathan Allan

Como você digita caracteres de geléia sem lista de átomos e lista rápida?
meu pronome é monicareinstate

1. Æé o código alt 0198. 2. Você pode configurar um teclado (não o tenho). 3. A página de código.
Jonathan Allan



3

Alice , 10 bytes

/o
\i@/Dcd

Experimente online!

Explicação

/o
\i@/...

Essa é apenas a estrutura padrão para programas aritméticos pesados ​​lineares que precisam de E / S decimal. O programa atual é então apenas:

Dcd

O que faz:

D    Deduplicate prime factors. Does what it sounds like: for every p^k which
     is a divisor n, this divides n by p^(k-1).
c    Push the individual prime factors of n. Since we've deduplicated them
     first, the number of factors is equal to the value we're looking for.
d    Push the stack depth, i.e. the number of unique prime factors.

3

JavaScript 45 bytes

* Para o @SEJPM, solicite uma explicação: o que estou fazendo aqui é passar de 2 - n (que muda e, eventualmente, será o maior fator primordial) - agora, se a divisão do número atual ni quiser contar apenas uma vez (mesmo embora possa ser um fator de 2 * 2 * 2 * 3-2 é contado uma vez) - então o "j" aparece na imagem, quando j não é especificado na chamada da função - j receberá o valor de " undefined ", e quando n% i == 0, chamo a função com j = 1 na próxima chamada) - e adiciono apenas 1 quando j é igual a undefined, que é! j + Function (n / i, i, ( j = 1 ou apenas 1)). não mudo i nesse assunto, pois ainda pode ser divisível por i novamente (2 * 2 * 3), mas j será igual a 1 e não será considerado um fator. Espero que eu tenha explicado bem o suficiente.

P=(n,i=2,j)=>i>n?0:n%i?P(n,i+1):!j+P(n/i,i,1)

console.log(P(1538493)==4);
console.log(P(24)==2);
console.log(P(126)==3);
console.log(P(123456)==3);

Se o último primo for muito grande, ele terá uma pilha máxima de chamadas - se for um problema, eu posso criar um iterativo


Você se importaria de escrever uma explicação para esta resposta? Parece usar uma abordagem usual do restante das respostas.
SEJPM

@SEJPM eu adicionei algumas explicações lá
DanielIndie 8/17/17

1
Para sua informação, podemos assumir pilhas de chamadas infinitas / recursos infinitos para a maioria dos desafios do código-golfe (basicamente, a menos que a pergunta indique o contrário).
Jonathan Allan








2

Números R +, 30 14 bytes

16 bytes removidos graças a @Giuseppe

numbers::omega

Além disso, aqui está o Experimente online !! link para @ Giuseppe.


Você pode omitir o f=function(x)eo (x)quanto numbers::omegaé uma função já. No entanto, como numbersnão é padrão para R, você deve responder "números R +". Além disso, você deve incluir um link TIO . Ainda assim, +1, muito bom.
Giuseppe

@ Giuseppe, você é muito legal. Obrigado pela ajuda. BTW, além de algumas de suas respostas perspicazes, consultei Dicas para jogar golfe no R , como você sugeriu. Existem algumas verdadeiras jóias lá. Qualquer pessoa, atualizarei minha resposta com suas recomendações. Além disso, sua MATLsolução é muito boa (+1 ontem).
9757 Joseph Wood

NP, sinta-se à vontade para me enviar um bate-papo ou comentar uma resposta minha, se você tiver perguntas.
Giuseppe

@ Giuseppe, existe um meta consenso sobre a necessidade de declarar explicitamente "números R +"? Parece que se declararmos o pacote adicional, poderemos salvar os bytes de chamá-lo explicitamente numbers::. Caso contrário, para mim é o mesmo que usar um importem qualquer outro idioma.
BLT

(rola para baixo e vê um exemplo em python disso ...) Acho que estou pensando em um meta consenso mais amplo, então. Isso meio que parece bobagem para mim.
BLT



1

Haskell , 58 bytes

-4 bytes graças a @Laikoni

f n=sum[1|x<-[2..n],gcd x n>1,all((>)2.gcd x)[2..x-1]]

Experimente online!

Explicação

Essencialmente, gera todos os números primos no máximo ne os filtra por serem um fator de n e, em seguida, leva a duração do resultado.

f n=                                                   -- main function
    sum[                                             ] -- output the length of the list
        1|x<-[2..n],                                   -- consider all potential primes <=n
                                                       -- and insert 1 into the list if predicates are satisfied
                    gcd x n>1,                         -- which are a factor of n
                              all(          )[2..x-1]  -- and for which all smaller numbers satisfy
                                  (>)2.                -- 2 being larger than
                                       gcd x           -- the gcd of x with the current smaller number

Você pode usar em sum[1|x<- ... ]vez de length.
Laikoni

1

Japt, 5 4 bytes

â èj

Tente

Obtenha os divisores ( â) e conte ( è) os primos ( j).


1

ARBLE , 28 bytes

len(unique(primefactors(n)))

Experimente online!

Esta é uma solução muito literal


Eu estava olhando para isso e dizendo "Ei, espere um minuto, isso é um trecho!" E então eu vejo ... isso deveria ser uma linguagem não esotérica com E / S implícita ?!
totallyhuman

@icrieverytim Parabéns, você descobriu um dos principais motivos pelos quais esse idioma existe.
ATaco


0

Python 2 ,  63  55 bytes

Uma resposta muito mais interessante ...

-8 bytes graças a Jonathan Frech (use um argumento com um padrão para o pós-ajuste do resultado de primos de 0para 1- muito melhor que um lambda de empacotamento !!)

f=lambda n,o=1:sum(n%i+f(i,0)<1for i in range(2,n))or o

Uma função recursiva que pega um número inteiro positivo ne retorna um número inteiro positivo, a contagem.

Experimente online! Realmente ineficiente, nem se preocupe com os outros casos de teste.



@ JonathanFrech Obrigado, isso é muito mais limpo.
Jonathan Allan

0

J, 12 bytes

{:@$@(__&q:)

q:é a função de expoentes primários de J, fornecendo a ele o argumento que __produz uma matriz cuja primeira linha é todos os fatores primos diferentes de zero e cuja segunda linha é seus expoentes.

Tomamos a forma $dessa matriz - linhas por colunas - o número de colunas é a resposta que buscamos.

{: nos fornece o último item desses dois itens (num linhas, num colunas) e, portanto, a resposta.

Experimente online!



0

Javascript ES6, 56 caracteres

n=>eval(`for(q=2,r=0;q<=n;++q)n%q||(n/=q,r+=!!(n%q--))`)

Teste:

f=n=>eval(`for(q=2,r=0;q<=n;++q)n%q||(n/=q,r+=!!(n%q--))`)
console.log([24,126,1538493,123456].map(f)=="2,3,4,3")

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.