Mengurai menjadi bilangan prima

14

Diberikan bilangan bulat n, kembalikan jumlah cara yang dapat ditulis sebagai daftar bilangan prima. Misalnya, 2323dapat ditulis sebagai (2,3,23), (23,23)atau (2,3,2,3)atau (23,2,3), sehingga Anda akan output 4. Jika tidak dapat ditulis dengan cara ini, Anda harus menampilkan 0.

Bilangan prima seperti 019atau 00000037adalah bilangan prima yang valid untuk masalah ini.

Kasus uji:

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)

Ini adalah , jadi jawaban terpendek dalam byte di setiap bahasa menang!

Sunting: sekarang saya tahu mengapa saya harus menggunakan kotak pasir lain kali

dicurangi
sumber
Terkait
Peter Taylor

Jawaban:

7

Haskell , 96 89 byte

5 byte disimpan berkat uji primality H.PWiz

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]

Cobalah online!

Penjelasan

Hal pertama yang dilakukan adalah menciptakan fungsi uji prime menggunakan teorema Wilson menggunakan definisi prime.

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

Kemudian mulailah mendefinisikan f. Hal pertama yang saya pikirkan ketika saya melihat masalah ini adalah menggunakan pemrograman dinamis. Namun biaya pemrograman dinamis byte jadi ini menggunakan algoritma "pemrograman psuedo-dinamis". Sedangkan dalam pemrograman dinamis Anda akan menyimpan grafik Directed Acyclic dalam memori di sini kita hanya menggunakan rekursi dan menghitung ulang setiap node setiap kali kita membutuhkannya. Ini kehilangan semua manfaat waktu dari pemrograman dinamis, tetapi ini adalah jadi siapa yang peduli. (masih lebih baik daripada pencarian brute force)

Algoritma adalah sebagai berikut, kami membangun Grafik Acyclic Diarah, L , di mana setiap node mewakili substring dari angka. Secara khusus L i mewakili digit i terakhir dari input kami (sebut saja n ).

Kami mendefinisikan L 0 untuk memiliki nilai 1 dan masing-masing nilai lainnya di L memiliki jumlah masing-masing L j sehingga j <i dan substring n dari i ke j adalah prima.

Atau dalam formula:

Rumus

Kami kemudian mengembalikan nilai pada indeks L terbesar terbesar . ( L k dimana k adalah jumlah digit n )

Posting Rock Garf Hunter
sumber
6

Jelly , 8 byte

ŒṖḌÆPẠ€S

Cobalah online!

Terima kasih -1 byte untuk Leaky Nun
-1 byte terima kasih untuk Dennis

Penjelasan

ŒṖḌÆ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
HyperNeutrino
sumber
Saya perhatikan bahwa 05AB1E tidak bisa melakukan ini dengan mudah. Partisi tampak seperti perintah yang hebat.
Magic Gurita Guci
5

Brachylog , 10 byte

ṫ{~cịᵐṗᵐ}ᶜ

Cobalah online!

Pertama-tama, ubah input menjadi string. {…}ᶜMenghitung jumlah kemungkinan keluaran untuk .

Di {…}dalam output diumpankan ke ~c. Output dari predikat ini memuaskan bahwa, ketika digabungkan, itu sama dengan input. Ini dimasukkan ke dalam ịᵐ, yang menentukan bahwa outputnya adalah inputnya dengan setiap string dikonversi menjadi integer. ṗᵐmenetapkan bahwa inputnya terdiri dari bilangan prima

H.Piz
sumber
1
Anda tidak perlu mengkonversi string dan kembali, mereka 7 byte cukup: {~cṗᵐ}ᶜ. Ini sangat lambat karena ~cpada bilangan bulat bekerja dengan aritmatika kendala, tetapi secara teori itu bekerja.
Fatalkan
@Fatalize Saya pikir itu gagal untuk memperhitungkan nol terkemuka
H.PWiz
4

Pyth , 13 byte

lf.AmP_sdT./`

Suite uji.

Biarawati Bocor
sumber
Saya tidak tahu Pyth dengan baik tetapi alih-alih memfilter dan kemudian mengambil panjangnya, bisakah Anda melakukan for_each alih-alih filter dan kemudian menjumlahkan?
HyperNeutrino
@HyperNeutrino apakah ada bedanya?
Bocor Nun
Saya tidak yakin, saya belum menguji. Itu untuk Jelly (mungkin karena filter dua byte cepat) tapi saya tidak yakin.
HyperNeutrino
@HyperNeutrino filter satu byte di sini ...
Leaky Nun
3

Python 2 , 105 95 91 byte

f=lambda n:sum(0**k|f(n%10**k)for k in range(n)if sum(n/10**k%j<1for j in range(1,n+2))==2)

Ini sangat lambat.

Cobalah online!

Dennis
sumber
2

Python 2 , 161 byte

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

Cobalah online!

Fungsi ini gmembuat partisi secara rekursif (dibutuhkan string sebagai input tetapi mengeluarkan daftar daftar int). Sebagian besar kode yang tersisa hanya untuk mengimplementasikan 'is da prime?'.

Chas Brown
sumber
1

Bersih , 199 141 131 byte

import StdEnv
?n|n<2=0|and[gcd n i<2\\i<-[2..n-1]]=1=0
@n#s=toString n
#f=toInt o(%)s
= ?n+sum[@(f(0,i))\\i<-[0..n]| ?(f(i+1,n))>0]

Cobalah online!

Suram
sumber
1

J , 65 64 byte

(1#.[:*/"1*/@>)@(#`(1,.[:#:[:i.2^#-1:)@.(1<#)(1:p:&.>".);.1])@":

Cobalah online!

Galen Ivanov
sumber
0

Pyth, 12 byte

lf*FmP_sdT./    

Mengambil input sebagai integer, output TrueatauFalse

Cobalah online!

Dave
sumber