プライムへの分解


14

整数nを指定すると、nが素数のリストとして記述できるウェイの数を返します。例えば、2323のように書くことができ(2,3,23)(23,23)または(2,3,2,3)あるいは(23,2,3)あなたが出力だろうので、4。この方法で記述できない場合は、を出力する必要があります0

019またはなどの素数00000037は、この問題の有効な素数です。

テストケース:

5 -> 1
55 -> 1 
3593 -> 4 (359 and 3, or 3 and 593, or 3 and 59 and 3, or 3593)
3079 -> 2 (3 and 079, or 3079)
119 -> 0 
5730000037 -> 7 (5,7,3,000003,7, 5,7,3,0000037, 5,73,000003,7, 5,73,0000037, 5,73000003,7, 5,7,30000037, 5730000037)
0-> undefined (you do not have to handle this case)

これはなので、各言語のバイト単位の最短回答が勝ちです!

編集:次回サンドボックスを使用する理由がわかりました


回答:


7

Haskell96 89バイト

H.PWizの素数テストのおかげで5バイト節約

p x=[1|0<-mod x<$>[2..x]]==[1]
f[]=1
f b=sum[f$drop i b|i<-[1..length b],p$read$take i b]

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

説明

最初に行うことは、素数の定義を使用してウィルソンの定理使用して素数テスト関数作成することです。

p x=[1|0<-mod x<$>[2..x]]==[1]

次に、定義を開始しますf。この問題を見たときに最初に考えたのは、動的プログラミングを使用することでした。ただし、動的プログラミングにはバイト単位のコストがかかるため、「擬似動的プログラミング」アルゴリズムを使用します。動的プログラミングでは、ここにメモリ内の有向非巡回グラフを保存しますが、再帰を使用し、必要なたびに各ノードを再計算します。動的プログラミングのすべての時間の利点を失いますが、これはので誰も気にしません。(ただし、ブルートフォース検索よりも優れています)

アルゴリズムは次のとおりです。各ノードが数値の部分文字列を表す有向非巡回グラフLを作成します。特に、L iは入力の最後のi桁を表します(nと呼びます)。

我々は定義L 0を 1の値とで互いに値有するようにLそれぞれの和有するようにLのJようJ <IとのサブNからIjは素数です。

または式で:

式

次に、Lの最大の最大インデックスで値を返します。(L kここで、knの桁数です)


6

ゼリー、8バイト

ŒṖḌÆPẠ€S

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

Leaky Nunの
おかげで-1バイトDennisのおかげで-1バイト

説明

ŒṖḌÆPẠ€S  Main Link
ŒṖ        List Partitions (automatically converts number to decimal digits)
  Ḍ       Convert back to integers (auto-vectorization)
   ÆP     Are they primes? (auto-vectorization)
     Ạ€   For each, are they all truthy (were the numbers all primes?); 1/0 for truthy/falsy
       S  Sum; gets number of truthy elements

05AB1Eではこれを簡単に行えないことに気付きました。パーティションは素晴らしいコマンドのようです。
魔法のタコUr

5

Brachylog、10バイト

ṫ{~cịᵐṗᵐ}ᶜ

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

最初に入力を文字列に変換します。{…}ᶜの可能な出力の数をカウントします

{…}の出力内はに送られ~cます。この述部の出力は、連結されたときに入力と等しいことを満たします。これはに渡されịᵐ、その出力が入力になり、各文字列が整数に変換されることを指定します。ṗᵐ入力が素数で構成されることを指定します


1
文字列に変換して戻す必要はありません{~cṗᵐ}ᶜ。これらの7バイトで十分です。~c整数では制約演算を使用するため、これは非常に遅くなりますが、理論的には機能します。
17

私が先頭にゼロを考慮するために失敗したことだと思い@Fatalize
H.PWiz

4

Pyth、13バイト

lf.AmP_sdT./`

テストスイート。


私はPythをよく知らないが、フィルタリングしてから長さを取る代わりに、filterの後にfor_eachをしてから合計することはできますか?
HyperNeutrino

@HyperNeutrinoは何か違いがありますか?
リーキー修道女

よくわかりませんが、テストしていません。これはJellyに対応しています(おそらく2バイトのフィルターが速いためです)が、わかりません。
HyperNeutrino

@HyperNeutrinoフィルターはここに1バイトです...
Nun


2

Python 2、161バイト

lambda n:sum(all(d>1and all(d%i>0for i in range(2,d))for d in v)for v in g(`n`))
g=lambda s:[[int(s[:i])]+t for i in range(1,len(s))for t in g(s[i:])]+[[int(s)]]

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

この関数gは、パーティションを再帰的に作成します(入力として文字列を受け取りますが、intのリストのリストを出力します)。残りのコードのほとんどは、「d素数ですか?」を実装するだけです。





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