一意の素数はいくつですか?


14

自然数を表す1つの方法は、素数の指数を乗算することです。たとえば、6は2 ^ 1 * 3 ^ 1で表すことができ、50は2 ^ 1 * 5 ^ 2(^は指数を表す)で表すことができます。この表現の素数の数は、他の方法と比較して、この表現方法を使用する方が短いかどうかを判断するのに役立ちます。しかし、これらを手動で計算したくないので、それを行うためのプログラムが必要です。ただし、家に帰るまでプログラムを覚えておく必要があるため、できるだけ短くする必要があります。

あなたのタスク:

プログラムまたは関数を作成して、この数値表現に異なる素数がいくつあるかを判断します。

入力:

通常の方法で取得される、1 <n <10 ^ 12のような整数n。

出力:

はじめに概説したように、入力を表すために必要な個別の素数の数。

テストケース:

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)

これはOEIS A001221です。

得点:

これは、バイト単位の最低スコアが勝ちです!


3
最近たくさんの素朴な質問があります!大好きです。
ジュゼッペ


3
downvoteの背後にある理由は、その自明性かもしれません。私が見る限り、ゴルフ言語に関しては、次の3つの状況があります。それはdownvoteのための強固な理由である場合、私は知りませんが、それは可能な原因である
氏Xcoder

1
可能性がありますが、3人のdownvotersの1人が私にそれを言ってコメントしてくれたら幸いです。ゴルフ言語で些細なことですが、非ゴルフ言語ではいくつかの興味深い解決策があります。これは、このチャレンジを投稿したときに見たかったものです。結局のところ、ゴルフラングにとっては些細なことですが、興味深いゴルフラングではないソリューションを生み出しているサイトには多くの課題があります。
グリフォン

1
テストケースに素数を含めると有益です。また、一部の言語/アプローチでは、多数をテストするのが困難です。いくつかの小さなテストケースがいいでしょう。
デニス

回答:




5

Mathematica、7バイト

PrimeNu

うん、組み込みがあります。

Mathematica、21バイト

Length@*FactorInteger

長い道のり。


アスタリスクの理由は何ですか?Length@FactorInteger同じじゃない?
numbermaniac

1
Length@*FactorIntegerLengthとの合成である純関数を生成しFactorIntegerます。定義fun=Length@*FactorIntegerしてから呼び出すことができますfun[1001]。一方、Length@FactorIntegerを意味しLength[FactorInteger]、評価し0ます。
ミシャラヴロフ


4

Python 2、56バイト

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

これはデニスの答えのポートでここに恐らく?
ジョナサンアラン

1
@JonathanAllanはい、代わりに一意の素因数をカウントするように変更されました。
-orlp

4

網膜31 30バイト

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

入力は単項です。

1バイトのゴルフをしてくれた@MartinEnderに感謝します!

オンラインでお試しください!(10進から単進へのコンバーターを含む)

使い方

プログラムは&修飾子を持つ単一の正規表現で構成されているため、Retinaは重複する一致の数を単純にカウントします。入力は1n回の繰り返しで構成されると想定されますそれ以外は何もません。

ネガティブな先読み

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

2つ以上の1()が続かない1の間の位置で一致し、その後に同じ量の1の1つ以上の繰り返しが続きます(11+\1+)が続き、その後に入力の終わり($ます。

任意の合成数AB、B> 1のように書くことができるのbの繰り返しの繰り返し1先読みマッチのみ位置が続くように、p個のの繰り返し1P = 1又は pは素数です。

正規表現

(11+)$

少なくとも2つの1を必要とすることでp> 1を確認し()、1のテールを格納します11+の 2番目のキャプチャグループに(\2)。

最後に、肯定的な後読み

(?<=^\2+)

全体の入力で構成されていることを検証KP出現(K≥1の)1ことを確認し、pが入力を分割します。

したがって、各一致は一意の素数因子pに対応します。


4

Bash + GNUユーティリティ、33

  • @Dennisのおかげで1バイト節約
factor|grep -Po ' \d+'|uniq|wc -l

オンラインで試す

説明

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+'バイトを1つ節約しますtr \ \\n|sed 1d
デニス

残念ながら、grep -Po '( \d+)\1*'入力46で失敗します。
デニス

@デニスのおかげで-私はあなたの元の提案を使用してそれを修正
デジタル外傷

3

ゼリー、3 バイト

かなり退屈な答え...

ÆFL

数値を受け取り、数値を返すモナドリンク

オンラインでお試しください!

どうやって?

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

1
いかがでしたÆvか?
私の代名詞はモニカレインステート

簡単でした-一度も使用したことがなく、ウィキのリストを検索しませんでした。
ジョナサンアラン

原子リストとクイックリストなしでゼリー文字を入力するにはどうすればよいですか?
私の代名詞はモニカレインステート

1. Æは代替コード0198です。2.キーボードをセットアップできます(まだ持っていません)。3.コードページ。
ジョナサンアラン



3

アリス、10バイト

/o
\i@/Dcd

オンラインでお試しください!

説明

/o
\i@/...

これは、10進数のI / Oを必要とする線形演算が多いプログラムの標準フレームワークです。実際のプログラム自体は次のとおりです。

Dcd

どちらが:

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

* @SEJPMリクエストの説明:ここでやっていることは、これは2-n(これは変化し、最終的に最大の素因数になる)から行くことです-現在、現在の数がniを除算する場合は1回だけカウントします(偶数ただし、2 * 2 * 2 * 3の係数である可能性があります-2が1回カウントされます)-関数の呼び出しでjが指定されていない場合、「j」が画像に表示されます-jは「 undefined」、およびn%i == 0の場合、次の呼び出しでj = 1の関数を呼び出します)-そして、jがundefinedである場合にのみ1を追加します(!j + Function(n / i、i、( j = 1または1)のみ)。この問題でiを変更することはできません。再びiで割り切れる可能性があるため(2 * 2 * 3)、jは1になり、係数としてカウントされません。私はそれを十分に説明したと思います。

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);

最後の素数が最大呼び出しスタックを持つよりも非常に大きい場合-その問題が反復的なものを作成できる場合


この答えの説明を書いていただけますか?残りの回答から通常のアプローチを使用しているようです。
SEJPM

@SEJPM私はそこにいくつかの説明を追加しました
-DanielIndie

1
参考までに、ほとんどのコードゴルフの課題に対して無限のコールスタック/無限のリソースを想定する場合があります(基本的に質問で特に明記しない限り)。
ジョナサンアラン








2

R +数字、 30 14バイト

@Giuseppeのおかげで16バイトが削除されました

numbers::omega

また、こちらがオンラインでお試しください!! @Giuseppeごとのリンク。


を省略してもかまいませんf=function(x)し、(x)as numbers::omegaは既に関数です。ただし、numbersRの標準ではないため、「R +数字」と答える必要があります。また、TIOリンクを含める必要があります。それでも、+ 1、とてもいい。
ジュゼッペ

@ジュゼッペ、あなたはあまりにもいいです。ご協力いただきありがとうございます。ところで、あなたの洞察に満ちた答えのいくつかに加えて、私はあなたが提案したようにRでのゴルフのヒントをチェックしました。そこにはいくつかの本当の宝石があります。誰でも、私はあなたの提案で私の答えを更新します。また、あなたのMATLソリューションは非常に優れています(昨日は+1)。
ジョセフウッド

NP、チャットで私にpingを送ったり、質問があれば私の答えにコメントしてください。
ジュゼッペ

@Giuseppeは、明示的に「R +数字」を述べる必要があるというメタコンセンサスがありますか?追加のパッケージを記述すると、明示的にそれを呼び出すバイトを節約できるはずnumbers::です。それ以外の場合、私にとってimportは、他の言語でを使用するのと同じです。
BLT

(下にスクロールして、このpythonの例を参照してください...)それでは、より広範なメタコンセンサスについて疑問に思っていると思います。それはちょっと馬鹿げているように思えます。
BLT



1

ハスケル、58バイト

@Laikoniのおかげで-4バイト

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

オンラインでお試しください!

説明

基本的に最大で最大ですべての素数を生成しn、それらをnの係数でフィルタリングしてから結果の長さを取得します。

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

sum[1|x<- ... ]代わりに使用できますlength
ライコニ


1

ARBLE、28バイト

len(unique(primefactors(n)))

オンラインでお試しください!

これは非常に文字通りの解決策です


私はこれを見て、「ちょっと待ってください、これはスニペットです!」そして、私は...これは暗黙のIOを持つ非難解な言語であるはずですか?!
完全に人間の

@icrieverytimおめでとうございます。この言語が存在する主な理由の1つを発見しました。
-ATaco


0

Pythonの2 63  55バイト

もっと面白い答え...

-8のおかげバイトジョナサンFRECHを(から素数の結果の調整後にデフォルトで引数を使用0する1-より良いラッピングラムダよりもはるかに!)

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

正の整数を取り、n正の整数であるカウントを返す再帰関数。

オンラインでお試しください!本当に非効率的です。他のテストケースを気にしないでください。



@JonathanFrechありがとう、もっときれいです。
ジョナサンアラン

0

J、12バイト

{:@$@(__&q:)

q: Jの素数指数関数であり、引数を与える __を最初の行がすべて非ゼロの素因数であり、2行目がそれらの指数である行列を生成します。

形を取る $はその行列ます-行ごとの列-列の数が私たちが求める答えです。

{: この2つの項目(行数、列数)のリストの最後の項目、したがって答えが得られます。

オンラインでお試しください!



0

Javascript ES6、56文字

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

テスト:

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")

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