Isso é ótimo ... quase

30

Se você já aprendeu sobre números primos na aula de matemática, provavelmente já teve que, a certa altura, determinar se um número é primo. Você provavelmente errou enquanto ainda os estava aprendendo, por exemplo, confundindo 39 com um primo. Bem, não se preocupe, pois 39 é um semiprime, ou seja, que é o produto de dois números primos.

Da mesma forma, podemos definir um k- quase primo como sendo o produto de k números primos. Por exemplo, 40 é o quarto 4-quase primo; 40 = 5 * 2 * 2 * 2, o produto de 4 fatores.

Sua tarefa é escrever um programa / função que aceita dois inteiros n e k como entrada e saída / retorno do n º k -quase número primo. Este é um código de golfe, portanto o programa mais curto em bytes vence.

Casos de teste

n, k => output
n, 1 => the nth prime number
1, 1 => 2
3, 1 => 5
1, 2 => 4
3, 2 => 9
5, 3 => 27

Diversos

Você deve gerar os primos por qualquer outro meio que não seja um simples formulário fechado, se esse formulário existir.

Conor O'Brien
fonte
Verifique sua matemática no seu primeiro exemplo: 40 não é igual a 5 * 2 * 2 * 2 * 2.
GamrCorps
@GamrCorps Ah, sim, obrigado.
Conor O'Brien
Como você define o enésimo k-quase primo? O que determina em que ordem os primos k-quase estão?
GamrCorps
3
Não acho que a sua expressão fem termos de f[n,1]seja correta, uma vez que as listas de quase-números primos contêm números ímpares (por exemplo, os dois últimos exemplos, que não são expressáveis ​​como o produto de uma potência de dois e de um primo). (E também diz isso f[n,1] == 2*f[n,1].)
2012rcampion
1
Por que um simples formulário fechado é proibido?
CalculadoraFeline

Respostas:

5

Braquilog , 9 bytes

Derrotar @sundar usando metade do número de bytes

{~l~ḋ}ᶠ⁽t

Explicação

                    --  Input like [n,k]
{    }ᶠ⁽            --      Find the first n values which
   ~ḋ               --          have a prime decomposition
 ~l                 --          of length k
        t           --      and take the last one

Experimente online!

Kroppeb
fonte
4

Pyke (confirmação 29), 8 bytes (não competitivo)

.fPlQq)e

Explicação:

         - autoassign Q = eval_or_not(input())
.f    )  - First eval_or_not(input) of (^ for i in range(inf))
  P      -    prime_factors(i)
   l     -   len(^)
     q   -  ^==V
    Q    -   Q
       e - ^[-1]
Azul
fonte
4

Julia, 84 78 59 57 bytes

f(n,k,i=1)=n>0?f(n-(sum(values(factor(i)))==k),k,i+1):i-1

Esta é uma função recursiva que aceita dois números inteiros e retorna um número inteiro. A abordagem aqui é verificar a soma dos expoentes na fatoração primária contra k.

Ungolfed:

function f(n, k, i=1)
    # We initialize a counter i as a function argument.

    # Recurse while we've encountered fewer than n k-almost primes
    if n > 0
        # If the sum of the exponents in the prime factorization of i is
        # equal to k, there are k prime factors of i. We subtract a boolean
        # from n, which is implicitly cast to an integer, which will
        # decrement n if i is k-almost prime and leave it as is otherwise.
        return f(n - (sum(values(factor(i))) == k), k, i + 1)
    else
        # Otherwise we return i-1 (i will have been incremented one too
        # many times, hence the -1)
        return i - 1
    end
end
Alex A.
fonte
4

Geléia, 9 bytes

ÆfL=³
ç#Ṫ

Experimente online!

Como funciona

Ç#Ṫ    Main link. Left input: k. Right input: n.

Ç      Apply the helper link to k, k + 1, k + 2, ... until...
 #       n matches are found.
  Ṫ    Retrieve the last match.


ÆfL=³  Helper link. Left argument: k (iterator)

Æf     Yield the prime factors of k.
  L    Compute the length of the list, i.e., the number of prime factors.
   =³  Compare the result with k (left input).
Dennis
fonte
1
Não conheço nenhuma codificação que possa salvar esses 9 caracteres como 9 bytes.
27616 Oleh Prypin
1
O Jelly usa uma codificação personalizada que representa os 256 caracteres que entende com bytes únicos.
Dennis
3

Braquilog , 18 bytes

,1{hH&t<NḋlH;N}ⁱ⁽t

Experimente online!

                      Implicit input, say [5, 3]
,1                    Append 1 to the input list. [5, 3, 1]
  {           }ⁱ⁽     Repeat this predicate the number of times given by
                        the first element of the list (5),
                        on the rest of the list [3, 1]
   hH&                Let's call the first element H
      t<N             There is a number N greater than the second element
         ḋ            Whose prime factorization's
          l           length
           H          is equal to H
            ;N        Then, pair that N with H and let that be input for
                      the next iteration
                 t    At the end of iterations, take the last N
                      This is implicitly the output
sundar - Restabelecer Monica
fonte
1

Mathematica, 56 51 bytes

Last@Select[Range[2^##],PrimeOmega@#==n&/.n->#2,#]&

Aviso: Isso é teórico. Não execute para nenhum valor> 4. Substitua 2 ^ ## por uma expressão mais eficiente.

CalculatorFeline
fonte
Isso não funciona n=1.
IPoiler
Também desde que PrimeOmega[1]avalia para 0, &&#>1é redundante.
IPoiler
1

Mathematica, 53 49 bytes

Cases[Range[2^(#2+#)],x_/;PrimeOmega@x==#2][[#]]&

Gera uma lista de números inteiros com base em um limite superior flexível. PrimeOmegaconta os fatores primos com multiplicidades, os primos k- quase Casessão retirados da lista e o n- ésimo membro desse subconjunto é retornado.

IPoiler
fonte
2 ^ (0 + ##) ou apenas 2 ^ ## funciona.
CalculatorFeline
@CatsAreFluffy Tente 2^Sequence[1,2]ver por que o último falha.
IPoiler
1

Haskell, 88 bytes

Provavelmente pode ser jogado muito mais, pois ainda sou um novato em Haskell. A função qretorna o número de fatores de seu argumento e fusa isso para obter o nthelemento de uma lista feita de todos os números que possuem kfatores.

q n|n<2=0|1>0=1+q(div n ([x|x<-[2..],mod n x<1]!!0))
f n k=filter(\m->q m==k)[1..]!!n-1
flawr
fonte
1

MATL, 14 bytes

:YqiZ^!XpSu1G)

Experimente no MATL Online

:               % Take first input n implicitly, make range 1 to n
 Yq             % Get corresponding prime numbers (1st prime to nth prime)
   i            % Take the second input k
    Z^          % Take the k-th cartesian power of the primes list 
                % (Getting all combinations of k primes)
      !Xp       % Multiply each combination (2*2*2, 2*2*3, 2*2*5, ...)
         Su     % Sort and unique
           1G)  % Take the n-th element of the result
sundar - Restabelecer Monica
fonte
0

Python 3, 100 bytes

Esta é uma função muito simples de força bruta. Ele verifica todos os números que começam com 2 com sympya factorintfunção s até encontrar n kquase primos; nesse ponto, a função retorna o nth destes.

import sympy
def a(n,k):
 z=1;c=0
 while c<n:z+=1;c+=(sum(sympy.factorint(z).values())==k)
 return z

Ungolfed:

Eu uso sum(factorint(a).values())porque factorintretorna um dicionário de factor: exponentpares. Agarrar os valores do dicionário (os expoentes) e somar eles me diz quantos fatores primos existem e, portanto, qual é kesse kprimo quase primário.

from sympy import factorint
def almost(n, k):
    z = 1
    count = 0
    while count < n: 
        z += 1
        if sum(factorint(a).values()) == k:
            count += 1
    return z
Sherlock9
fonte
0

Python 2 , 76 bytes

f=lambda n,k,p=2,c=0:c==k if p>n else f(n,k,p+1,c)if n%p else f(n/p,k,p,c+1)

Experimente online!

Chas Brown
fonte