Asal olarak ayrışmak


14

Bir tamsayı verildiğinde n, n'nin asal sayıların bir listesi olarak yazılabileceği yolların sayısını döndürün. Örneğin, 2323şu şekilde yazılabilir (2,3,23), (23,23)ya (2,3,2,3)ya (23,2,3)çıkış olur, böylece 4. Bu şekilde yazılamıyorsa çıktı almalısınız 0.

Bir asal sayı gibi 019ya 00000037bu sorun için geçerli bir asal olduğunu.

Test senaryoları:

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)

Bu , bu yüzden her dilde bayt en kısa cevap kazanır!

Düzenleme: Şimdi neden sandbox'ı bir dahaki sefere kullanmam gerektiğini biliyorum


Yanıtlar:


7

Haskell , 96 89 bayt

H.PWiz'in öncelik testi sayesinde 5 bayt tasarruf

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]

Çevrimiçi deneyin!

açıklama

Yapılan ilk şey, prime tanımını kullanarak Wilson teoremini kullanarak bir prime test fonksiyonu oluşturmaktır .

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

Sonra tanımlamaya başlayın f. Bu sorunu gördüğümde düşündüğüm ilk şey dinamik programlama kullanmaktı. Bununla birlikte, dinamik programlama, bayt maliyeti dolayısıyla bir "psuedo-dinamik programlama" algoritması kullanır. Dinamik programlamada, Yönlendirilmiş Bir Asiklik grafiği burada bellekte saklarsınız, burada sadece özyineleme kullanırız ve her düğüme ihtiyacımız olduğunda yeniden hesaplarız. Dinamik programlamanın her zaman faydalarını kaybeder, ancak bu bu yüzden kimin umurunda. (yine de kaba kuvvet aramasından daha iyi)

Algoritma aşağıdaki gibidir, her bir düğümün sayının bir alt dizesini temsil ettiği bir Yönlendirilmiş Asiklik Grafiği, L oluşturuyoruz . Özellikle L i , girdimizin son i basamaklarını temsil eder ( n olarak adlandıralım ).

Bu tanımlar L 0 1 bir değer ve birbirlerine değere sahip L , her biri bir miktar olması L j şekilde J <i ve alt dize n den i için j asal.

Veya bir formülde:

formül

Daha sonra değeri en büyük L indeksine döndürürüz . ( L k burada k n'nin basamak sayısıdır )


6

Jöle , 8 bayt

ŒṖḌÆPẠ€S

Çevrimiçi deneyin!

Leaky Nun
sayesinde -1 bayt Dennis sayesinde -1 bayt

açıklama

ŒṖḌÆ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'nin bunu kolayca yapamayacağını fark ettim. Bölümler harika bir komut gibi görünüyor.
Sihirli Ahtapot Urn

5

Brachylog , 10 bayt

ṫ{~cịᵐṗᵐ}ᶜ

Çevrimiçi deneyin!

Önce girdiyi bir dizeye dönüştürür. {…}ᶜİçin olası çıkışların sayısını sayar .

İçinde {…}çıkış beslenir ~c. Bu yüklemin çıktısı, bir araya getirildiğinde girdiye eşit olduğunu tatmin eder. Bu içine verilir ịᵐ, bu da çıktısının her dize bir tamsayıya dönüştürülmüş olarak girdi olduğunu belirtir. ṗᵐgirdisinin asal sayılardan oluştuğunu belirtir


1
Sen dize ve geri dönüştürmek gerekmez, o 7 bayt yeterlidir: {~cṗᵐ}ᶜ. Bu gerçekten yavaştır, çünkü ~ctamsayılarda kısıt aritmetiği ile çalışır, ancak teoride çalışır.
17'de

@Fatalize Sanırım önde gelen sıfırları hesaba
katmıyor

4

Pyth , 13 bayt

lf.AmP_sdT./`

Test odası.


Pyth'i o kadar iyi bilmiyorum ama filtrelemek ve sonra uzunluğu almak yerine, filtre ve sonra toplam yerine for_each yapabilir misiniz?
HyperNeutrino

@HyperNeutrino bu bir fark yaratıyor mu?
Leaky Nun

Emin değilim, test etmedim. Jelly için yapar (muhtemelen iki baytlı filtre nedeniyle hızlı) ama emin değilim.
HyperNeutrino

@HyperNeutrino filtre burada bir bayt ...
Leaky Nun


2

Python 2 , 161 bayt

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

Çevrimiçi deneyin!

İşlev gbölümleri özyinelemeli olarak oluşturur (bir dizeyi girdi olarak alır ancak girdi listelerinin listesini çıkarır). Geri kalan kodların çoğu sadece ' dasal mı?'



1

Temiz , 199 141 131 bayt

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]

Çevrimiçi deneyin!



Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.