それは素晴らしかった…ほとんど


30

数学のクラスで素数について学んだことがあるなら、おそらく、ある時点で、数が素数かどうかを判断しなければならなかったでしょう。まだ39をプライムと間違えているなど、まだ学習している最中に混乱している可能性があります。39は半素数、つまり、2つの素数の積であるため、心配する必要はありません。

同様に、我々は定義することができ、Kの生成物であるとしてプライム-almost K素数。たとえば、40は4番目のほぼ4つの素数です。40 = 5 * 2 * 2 * 2、4つの因子の積。

あなたの仕事は、2つの整数nkを入力として受け入れ、n番目のk-ほぼ素数を返す/返すプログラム/関数を書くことです。これはコードゴルフであるため、バイト単位の最短プログラムが優先されます。

テストケース

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

@GamrCorpsああ、はい、ありがとう。
コナーオブライエン

n番目の kほぼ素数をどのように定義しますか?kに近い素数の順序を決定するものは何ですか?
GamrCorps

3
ほぼ素数のリストには奇数が含まれているため(たとえば、最後の2つの例は2のべき乗と素数の積として表現できないため)f、の表現f[n,1]は正しいとは思いません。(そして、それも言いf[n,1] == 2*f[n,1]ます。)
2012rcampion

1
単純な閉じたフォームが禁止されているのはなぜですか?
CalculatorFeline

回答:




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

これは、2つの整数を受け入れて整数を返す再帰関数です。ここのアプローチは素因数分解の指数の合計をチェックすること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バイトとして保存できるエンコーディングは知りません。
オレPrypin

1
Jellyは、1バイトで理解できる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

また、とPrimeOmega[1]評価されるため0&&#>1冗長です。
IPoiler

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

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バイト

これは非常に単純なブルートフォース関数です。これは、と2から始まるすべての番号チェックsympyfactorintそれが見出されるまで機能n k、-almost素数をその時点で、関数が返すnこれらの目を。

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。辞書の値(指数)を取得し、それらを合計することでkk素因数がいくつあるか、つまりこのほぼ素数が何であるかがわかります。

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.