Kaç tane benzersiz asal?


14

Doğal bir sayıyı temsil etmenin bir yolu asal sayıların üslerini çoğaltmaktır. Örneğin, 6, 2 ^ 1 * 3 ^ 1 ile temsil edilebilir ve 50, 2 ^ 1 * 5 ^ 2 ile temsil edilebilir (burada ^, üstel değeri gösterir). Bu gösterimdeki prim sayısı, bu temsil yöntemini kullanmanın diğer yöntemlere kıyasla daha kısa olup olmadığını belirlemeye yardımcı olabilir. Ama bunları elle hesaplamak istemediğim için, bunu benim için yapacak bir programa ihtiyacım var. Ancak, eve dönene kadar programı hatırlamam gerektiğinden, olabildiğince kısa olması gerekir.

Senin görevin:

Bir sayının bu gösteriminde kaç farklı asal sayı olduğunu belirlemek için bir program veya işlev yazın.

Giriş:

Herhangi bir normal yöntemle 1 <n <10 ^ 12 olacak şekilde n tamsayısı.

Çıktı:

Girişte ana hatlarıyla belirtildiği gibi, girdiyi temsil etmek için gereken farklı primerlerin sayısı.

Test Durumları:

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)

Bu OEIS A001221 .

puanlama:

Bu , bayt kazanır en düşük puan!


3
Son zamanlarda pek çok asal soru! Onu seviyorum.
Giuseppe


3
Downvote'un arkasındaki neden önemsiz olabilir. Görebildiğim kadarıyla, golf dilleri söz konusu olduğunda 3 durum vardır: 1. yerleşik 2. iki yerleşik zincir 3. 3 yerleşik zincir (şahsen üç 2 bayt cevap var); Bu bir düşüş için sağlam bir neden olup olmadığını bilmiyorum, ama olası bir neden
Bay Xcoder

1
Olabilirdi, ama üç düşüşten birinin bana bunu söylediği yorumunu yaparsa sevinirim. Golf dillerinde önemsiz olsa da , golf dillerinde birkaç ilginç çözüm var, bunlar bu zorluğu gönderdiğimde görmek istediğim şeyler. Sonuçta, sitede golf langları için önemsiz olan, ancak ilginç golflang dışı çözümler üreten birçok zorluk var.
Gryphon

1
Test örneklerine bir asal dahil etmek faydalı olacaktır. Ayrıca, bazı dilleri / yaklaşımları çok sayıda test etmek zordur. Birkaç küçük test durumu iyi olurdu.
Dennis

Yanıtlar:



5

05AB1E , 2 bayt

bir başka oldukça sıkıcı cevap ...

fg

Sayısal bir girişi kabul eden ve sonucu yazdıran tam bir program

Çevrimiçi deneyin!

Nasıl?

fg - implicitly take input
f  - get the prime factors with no duplicates
 g - get the length
   - implicit print

5

Mathematica, 7 bayt

PrimeNu

Evet, bir yerleşik var.

Mathematica, 21 bayt

Length@*FactorInteger

Uzun yol.


Yıldız işaretinin nedeni nedir? Length@FactorIntegerAynı değil mi?
numbermaniac

1
Length@*FactorIntegerkompozisyonu: saf işlevi üreten Lengthve FactorInteger. Tanımlayabilir fun=Length@*FactorIntegerve sonra arayabilirim fun[1001]. Öte yandan, Length@FactorIntegerdemek Length[FactorInteger]ve değerlendirmek 0.
Misha Lavrov


4

Python 2, 56 bayt

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

Bu Dennis'in cevabın bir liman mı burada belki?
Jonathan Allan

1
@JonathanAllan Evet, bunun yerine benzersiz asal faktörleri sayacak şekilde değiştirildi.
orlp

4

Retina , 31 30 bayt

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

Giriş tekli.

1 baytlık golf için @MartinEnder'a teşekkürler!

Çevrimiçi deneyin! (ondalık-tekli dönüştürücü içerir)

Nasıl çalışır

Program &değiştiriciyle tek bir regex içerdiğinden, Retina üst üste binen eşleşmelerin miktarını sayar . Girdinin 1 n'lik n tekrarından oluştuğu ve başka hiçbir şeyin olmadığı varsayılmaktadır .

Olumsuz bakış

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

1 's arasında iki veya daha fazla 1 ' ( ) gelmeyen konumlarda eşleşir , ardından aynı miktarda 1 '( ) bir veya daha fazla tekrar gelir , ardından girdi ( ) gelir.11+\1+$

Herhangi bir bileşik sayı ab ile a, b> 1 olarak yazılabilir b tekrarlarının bir tekrarları 1 ileri yönlü ardından yalnızca konumları eşleşecek şekilde, s tekrarı 1 , p = 1 ya da p asal.

Normal ifade

(11+)$

kesinleştirir p> 1 en az iki gerektirerek 1 'in ( 11+) ve kuyruk depolar 1 ' ikinci yakalama grubunda s ( \2).

Son olarak, olumlu bakış

(?<=^\2+)

tüm giriş oluşur doğrular kp oluşumları ( k ≥ 1 arasında) 1 doğrulayarak, s böler girişi.

Böylece, her maç benzersiz bir ana bölme p'ye karşılık gelir .


4

Bash + GNU yardımcı programları, 33

  • @Dennis sayesinde 1 bayt kaydedildi
factor|grep -Po ' \d+'|uniq|wc -l

Çevrimiçi deneyin .

açıklama

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+'bir bayt kaydeder tr \ \\n|sed 1d.
Dennis

Ne yazık ki, grep -Po '( \d+)\1*'giriş 46 başarısız .
Dennis

@Dennis teşekkürler - Orijinal önerinizi kullanarak düzelttim
Digital Trauma

3

Jöle , 3 bayt

oldukça sıkıcı bir cevap ...

ÆFL

Sayı alan ve sayı döndüren monadik bağlantı

Çevrimiçi deneyin!

Nasıl?

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

1
Nasıl kaçırdın Æv?
benim zamirim monicareinstate

Kolaydı - hiç kullanmadım ve wiki'de arama yapmadı.
Jonathan Allan

Atom listesi ve hızlı listesi olmayan jöle karakterlerini nasıl yazıyorsunuz?
Benim zamirim monicareinstate

1. Æalt kodu 0198'dir. 2. Bir klavye ayarlayabilirsiniz (henüz bilmiyorum). 3. Kod sayfası.
Jonathan Allan



3

Alice , 10 bayt

/o
\i@/Dcd

Çevrimiçi deneyin!

açıklama

/o
\i@/...

Bu, ondalık G / Ç'ye ihtiyaç duyan doğrusal aritmetik ağır programlar için standart bir çerçevedir. Gerçek programın kendisi sadece:

Dcd

Hangisi:

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 bayt

* @SEJPM için bir açıklama isteyin: burada yaptığım şey 2 - n'den (bu değişen ve nihayetinde en büyük ana faktör olacak) - şimdi geçerli sayı bölme ni sadece bir kez saymak istiyorsa (hatta ancak bir kez 2 * 2 * 2 * 3 - 2 faktör sayılabilir) - bu nedenle "j" resim gelir, işlev çağrısında j belirtilmediğinde - j " undefined "ve n% i == 0 olduğunda bir sonraki çağrıda j = 1 ile fonksiyonu çağırırım) - ve sonra j sadece undefined olan 1 j + Function (n / i, i, ( j = 1 veya sadece 1)). i yine de i tarafından bölünebilir (2 * 2 * 3) ama sonra j 1 eşit ve bir faktör olarak sayılmaz çünkü bu konuda i değişmez. Umarım yeterince iyi açıklamıştım.

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

son asal maksimum çağrı yığını olacak daha büyükse - bu bir sorun varsa ben yinelemeli bir yapabilirsiniz


Bu cevap için bir açıklama yazabilir misiniz? Cevapların geri kalanından olağan bir yaklaşım kullanıyor gibi görünüyor.
SEJPM

@SEJPM orada bazı açıklamalar ekledim
DanielIndie

1
FYI, kod-golf zorluklarının çoğu için sonsuz çağrı yığınları / sonsuz kaynaklar kabul edebiliriz (temelde soru aksini belirtmedikçe).
Jonathan Allan

3

CJam , 7 5 bayt

2 bayt kapalı Martin Ender için teşekkürler!

{mF,}

Yığındaki girdi numarasını bekleyen ve çıktı numarasıyla değiştiren anonim blok (işlev).

Çevrimiçi deneyin! Veya tüm test senaryolarını doğrulayın .

açıklama

{   }   e# Define block
 mF     e# List of (prime, exponent) pairs
   ,    e# Length







2

R + sayıları, 30 14 bayt

@Giuseppe sayesinde 16 bayt kaldırıldı

numbers::omega

Ayrıca, İşte çevrimiçi deneyin !! @Giuseppe başına bağlantı.


Atlayabilir f=function(x)ve (x)as numbers::omegazaten bir işlevdir. Ancak, numbersR için standart olmadığı için, cevabınızı "R + numaraları" yapmalısınız. Ayrıca, bir TIO bağlantısı da eklemelisiniz . Yine de +1, çok güzel.
Giuseppe

@Giuseppe, çok iyisin. Yardımın için teşekkürler. BTW, bazı sezgisel cevaplarınıza ek olarak , önerdiğiniz gibi , R'de golf için ipuçları'nı kontrol ettim . Orada bazı gerçek taşlar var. Her neyse, cevabımı önerilerinizle güncelleyeceğim. Ayrıca, MATLçözümünüz çok güzel (dün +1).
Joseph Wood

NP, sohbette bana ping atmaktan çekinmeyin veya sorularınız varsa cevabımı yorumlayın.
Giuseppe

@Giuseppe, "R + sayılarını" açıkça belirtme ihtiyacı konusunda bir meta mutabakat var mı? Ek paketi belirtirsek, açıkça çağırmanın baytlarını kaydedebilmeliyiz gibi görünüyor numbers::. Aksi takdirde, bu benim için importbaşka bir dilde kullanmakla aynıdır .
BLT

(aşağı kaydırır ve bunun bir python örneği görür ...) Sanırım daha geniş bir meta konsensüs merak ediyorum. Bana biraz aptalca geliyor.
BLT



1

Haskell , 58 bayt

@Laikoni sayesinde -4 bayt

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

Çevrimiçi deneyin!

açıklama

Esasen tüm primerleri en fazla büyüklükte üretir nve n faktörü olduğu için filtreler ve daha sonra sonucun uzunluğunu alır.

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

Bunun sum[1|x<- ... ]yerine kullanabilirsiniz length.
Laikoni


1

ARBLE , 28 bayt

len(unique(primefactors(n)))

Çevrimiçi deneyin!

Bu çok gerçek bir çözüm


Buna bakıyordum ve "Hey, bir dakika, bu bir pasaj!" Ve sonra anlıyorum ... bu, örtük IO ile ezoterik olmayan bir dil mi olmalı ?!
totallyhuman

@icrieverytim Tebrikler, bu dilin ana nedenlerinden birini keşfettiniz.
ATaco


0

Python 2 ,  63  55 bayt

Çok daha ilginç bir cevap ...

Jonathan Frech sayesinde -8 bayt ( primerlerin sonucunun 0ila sonrasının ayarlanması için varsayılan olan bir argüman kullanın 1- bir sarma lambdadan çok daha iyi !!)

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

Pozitif bir tamsayı alan ve pozitif bir tamsayı ndöndüren özyinelemeli işlev sayılır.

Çevrimiçi deneyin! Gerçekten verimsiz, diğer test durumlarıyla bile uğraşmayın.



@JonathanFrech Teşekkürler, bu çok daha temiz.
Jonathan Allan

0

J, 12 bayt

{:@$@(__&q:)

q:J'nin asal üsleri işlevidir, bağımsız değişken __ilk satırı sıfır olmayan asal faktörler ve 2. satırı üsleri olan bir matris üretir.

Bu $matrisin şeklini alıyoruz - satır sütunlar - sütun sayısı aradığımız cevaptır.

{: bize bu iki öğenin (num satır, num sütun) listesinin son öğesini ve dolayısıyla cevabı verir.

Çevrimiçi deneyin!



0

Javascript ES6, 56 karakter

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

Ölçek:

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

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.