太棒了...几乎


30

如果您曾经在数学课上学习过素数,则可能必须要确定一个数是否是素数。当您仍在学习它们时,您可能已经搞砸了,例如,误以为是39。好吧,不用担心,因为39是一个半素数,即它是两个素数的乘积。

类似地,我们可以将k个几乎素数定义为k个素数的乘积。例如,40是第4个4素数;40 = 5 * 2 * 2 * 2,是4个因子的乘积。

你的任务是写一个程序/函数接受两个整数ñķ作为输入和输出/返回ñķ -almost素数。这是一个代码高尔夫球,因此以字节为单位的最短程序获胜。

测试用例

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

如果存在封闭形式,则您必须通过简单封闭形式以外的任何方式自己生成素数。


在第一个示例中检查数学:40不等于5 * 2 * 2 * 2 * 2。
GamrCorps '16

@GamrCorps啊,是的,谢谢。
科纳·奥布莱恩

您如何定义第n个 k-素数?是什么决定k个几乎素数的顺序?
GamrCorps '16

3
我不认为你的表达了f在条款f[n,1]是正确的,因为几乎素数的列表包含奇数(例如,最近的两个例子,这是不表达为二的幂和黄金的产品)。(并且也说了这一点f[n,1] == 2*f[n,1]。)
2012rcampion,2016年

1
为什么禁止使用简单的封闭式表格?
CalculatorFeline

Answers:



5

Brachylog,9个字节

通过使用一半的字节来击败@sundar

{~l~ḋ}ᶠ⁽t

说明

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

在线尝试!


4

Pyke(提交29),8个字节(非竞争性)

.fPlQq)e

说明:

         - 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]

4

朱莉娅84 78 59 57字节

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

这是一个递归函数,它接受两个整数并返回一个整数。这里的方法是检查素数分解中的指数和k

取消高尔夫:

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

4

果冻,9个字节

ÆfL=³
ç#Ṫ

在线尝试!

怎么运行的

Ç#Ṫ    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).

1
我不知道可以将这9个字符另存为9个字节的任何编码。
Oleh Prypin '16

1
Jelly使用自定义编码,该编码表示单个字节可以理解的256个字符。
丹尼斯

3

Brachylog,18个字节

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

在线尝试!

                      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

1

Mathematica,56 51字节

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

警告:这是理论上的。不要为任何> 4的值运行。用更有效的表达式替换2 ^ ##。


这不适用于n=1
IPoiler '16

同样由于PrimeOmega[1]求值为0,因此&&#>1是多余的。
IPoiler '16

1

Mathematica,53 49字节

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

根据宽松的上限生成整数列表。PrimeOmega计算具有多重性的素数因子,从列表中选取第k个素数Cases,并返回该子集的第n个成员。


2 ^(0 + ##),或仅2 ^ ##起作用。
CalculatorFeline

@CatsAreFluffy尝试2^Sequence[1,2]查看为什么后者失败。
IPoiler '16

1

Haskell,88个字节

可以打更多的高尔夫球,因为我还是Haskell的新手。该函数q返回其自变量的因子数量,并f使用该函数获取nth由具有k因子的所有数字组成的列表元素。

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

1

MATL,14个字节

:YqiZ^!XpSu1G)

在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

0

Python 3,100个字节

这是一个非常简单的蛮力函数。它使用sympyfactorint功能检查从2开始的每个数字,直到找到n k- 几乎为质数为止,此时,该功能将返回n这些数的th。

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

取消高尔夫:

我用sum(factorint(a).values())因为factorint返回一factor: exponent对字典。掌握字典(指数)的值并将它们相加可以告诉我有多少素数,因此k这几乎是k素数。

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.