Có bao nhiêu số nguyên tố độc đáo?


14

Một cách để biểu diễn số tự nhiên là nhân số mũ của số nguyên tố. Ví dụ: 6 có thể được biểu thị bằng 2 ^ 1 * 3 ^ 1 và 50 có thể được biểu thị bằng 2 ^ 1 * 5 ^ 2 (trong đó ^ biểu thị số mũ). Số lượng các số nguyên tố trong biểu diễn này có thể giúp xác định xem có ngắn hơn khi sử dụng phương pháp biểu diễn này hay không, so với các phương pháp khác. Nhưng vì tôi không muốn tính toán những thứ này bằng tay, tôi cần một chương trình để làm điều đó cho tôi. Tuy nhiên, vì tôi sẽ phải nhớ chương trình cho đến khi về nhà, nên nó cần phải ngắn nhất có thể.

Nhiệm vụ của bạn:

Viết chương trình hoặc hàm để xác định có bao nhiêu số nguyên tố khác nhau trong biểu diễn số này.

Đầu vào:

Một số nguyên n sao cho 1 <n <10 ^ 12, được lấy bởi bất kỳ phương thức bình thường nào.

Đầu ra:

Số lượng các số nguyên tố riêng biệt được yêu cầu để thể hiện đầu vào, như được nêu trong phần giới thiệu.

Các trường hợp thử nghiệm:

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)

Đây là OEIS A001221 .

Ghi điểm:

Đây là , điểm số thấp nhất tính bằng byte!


3
Vì vậy, nhiều câu hỏi chính gần đây! Tôi thích nó.
Giuseppe


3
Lý do đằng sau downvote có thể là tầm thường của nó. Theo như tôi có thể thấy, có 3 tình huống khi nói về ngôn ngữ chơi gôn: 1. tích hợp 2. chuỗi gồm hai chuỗi tích hợp 3. chuỗi 3 tích hợp (cá nhân tôi có ba câu trả lời 2 byte); Tôi không biết đó có phải là lý do vững chắc cho một downvote không, nhưng đó là một nguyên nhân có thể
Ông Xcoder

1
Có thể, nhưng tôi sẽ đánh giá cao nếu một trong ba người hạ lưu đã bình luận nói với tôi điều đó. Mặc dù nó tầm thường trong các ngôn ngữ chơi gôn, có một vài giải pháp thú vị trong các ngôn ngữ không chơi gôn, đó là những giải pháp tôi muốn thấy khi tôi đăng bài thử thách này. Rốt cuộc, có rất nhiều thách thức trên trang web này là tầm thường đối với golflang, nhưng tạo ra các giải pháp phi golflang thú vị.
Gryphon

1
Nó sẽ có lợi để bao gồm một nguyên tố trong các trường hợp thử nghiệm. Ngoài ra, một số ngôn ngữ / phương pháp khó kiểm tra với số lượng lớn. Một vài trường hợp thử nghiệm nhỏ hơn sẽ tốt đẹp.
Dennis

Câu trả lời:



5

05AB1E , 2 byte

một câu trả lời khá nhàm chán ...

fg

Một chương trình đầy đủ chấp nhận đầu vào số và in kết quả

Hãy thử trực tuyến!

Làm sao?

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

5

Toán học, 7 byte

PrimeNu

Yup, có tích hợp sẵn.

Toán học, 21 byte

Length@*FactorInteger

Con đường dài xung quanh.


Lý do cho dấu hoa thị là gì? Không Length@FactorIntegergiống nhau sao?
numbermaniac

1
Length@*FactorIntegertạo ra một hàm thuần túy: thành phần của LengthFactorInteger. Tôi có thể định nghĩa fun=Length@*FactorIntegervà sau đó gọi fun[1001]. Mặt khác, Length@FactorIntegersẽ có nghĩa Length[FactorInteger]và đánh giá 0.
Misha Lavrov


4

Python 2, 56 byte

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

Đây có phải là một câu trả lời của Dennis ở đây không?
Jonathan Allan

1
@Jonathan ALLan Có, được sửa đổi để đếm các yếu tố chính duy nhất thay thế.
orlp

4

Võng mạc , 31 30 byte

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

Đầu vào là đơn nhất.

Cảm ơn @MartinEnder vì đã chơi golf 1 byte!

Hãy thử trực tuyến!(bao gồm bộ chuyển đổi thập phân sang đơn vị)

Làm thế nào nó hoạt động

Vì chương trình bao gồm một regex duy nhất với công cụ &sửa đổi, Retina chỉ cần đếm số lượng trùng khớp. Đầu vào được giả sử bao gồm n lần lặp lại là 1 và không có gì khác.

Cái nhìn tiêu cực

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

khớp tại các vị trí giữa 1 ' không được theo sau bởi hai hoặc nhiều hơn 1 ' ( 11+), theo sau là một hoặc nhiều lần lặp lại với cùng số lượng 1 's ( \1+), theo sau là kết thúc đầu vào ( $).

Bất kỳ số tổng hợp ab nào với a, b> 1 đều có thể được viết dưới dạng b lặp lại của một lần lặp lại 1 , vì vậy giao diện chỉ khớp với các vị trí theo sau là p lặp lại 1 , trong đó p = 1 hoặc p là số nguyên tố.

Cuộc thi

(11+)$

đảm bảo p> 1 bằng cách yêu cầu ít nhất hai 1 's ( 11+) và lưu đuôi của 1 trong nhóm chụp thứ hai ( \2).

Cuối cùng, cái nhìn tích cực

(?<=^\2+)

xác minh rằng toàn bộ đầu vào bao gồm các lần xuất hiện kp ( k 1 ) của 1 , xác minh rằng p chia đầu vào.

Do đó, mỗi trận đấu tương ứng với một ước số nguyên tố duy nhất p .


4

Tiện ích Bash + GNU, 33

  • Lưu 1 byte nhờ @Dennis
factor|grep -Po ' \d+'|uniq|wc -l

Hãy thử trực tuyến .

Giải trình

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+'tiết kiệm một byte hơn tr \ \\n|sed 1d.
Dennis

Thật không may, grep -Po '( \d+)\1*'thất bại cho đầu vào 46 .
Dennis

@Dennis cảm ơn - Tôi đã sửa nó bằng đề xuất ban đầu của bạn
Chấn thương kỹ thuật số

3

Thạch , 3 byte

một câu trả lời khá nhàm chán ...

ÆFL

Một liên kết đơn âm lấy một số và trả về một số

Hãy thử trực tuyến!

Làm sao?

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

1
Làm thế nào bạn bỏ lỡ Æv?
đại từ của tôi là monicareinstate

Thật dễ dàng - Tôi chưa bao giờ sử dụng nó và không tìm kiếm danh sách trên wiki.
Jonathan Allan

Làm thế nào để bạn gõ các ký tự thạch mà không có danh sách nguyên tử và danh sách nhanh?
đại từ của tôi là monicareinstate

1. Ælà mã alt 0198. 2. Bạn có thể thiết lập bàn phím (Tôi chưa). 3. Trang mã.
Jonathan Allan



3

Alice , 10 byte

/o
\i@/Dcd

Hãy thử trực tuyến!

Giải trình

/o
\i@/...

Đây chỉ là khung tiêu chuẩn cho các chương trình nặng số học tuyến tính cần I / O thập phân. Chương trình thực tế sau đó chỉ là:

Dcd

Mà không:

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 byte

* Đối với @SEJPM yêu cầu một lời giải thích: những gì tôi đang làm ở đây là - tôi sẽ đi từ 2 - n (thay đổi và cuối cùng sẽ là yếu tố chính lớn nhất) - bây giờ nếu số hiện tại chia ni chỉ muốn đếm nó một lần (thậm chí mặc dù nó có thể là hệ số 2 * 2 * 2 * 3 - 2 được tính một lần) - vì vậy "j" xuất hiện trong ảnh, khi j không được chỉ định trong lệnh gọi của funcion - j sẽ nhận giá trị của " không xác định "và khi n% i == 0 thì tôi gọi hàm với j = 1 trong cuộc gọi tiếp theo) - và sau đó tôi chỉ thêm 1 khi j bằng không xác định đó là! j + Hàm (n / i, i, ( j = 1 hoặc chỉ 1)). Tôi không thay đổi tôi trong vấn đề này vì nó vẫn có thể chia hết cho tôi một lần nữa (2 * 2 * 3) nhưng sau đó j sẽ bằng 1 và nó sẽ không được tính là một yếu tố. hy vọng tôi giải thích nó đủ tốt.

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

nếu số nguyên tố cuối cùng rất lớn hơn nó sẽ có ngăn xếp cuộc gọi tối đa - nếu đó là một vấn đề tôi có thể thực hiện một lần lặp


Bạn có phiền khi viết một lời giải thích cho câu trả lời này? Nó dường như sử dụng một cách tiếp cận thông thường từ phần còn lại của câu trả lời.
SEJPM

@SEJPM tôi đã thêm một số lời giải thích ở đó
DanielIndie

1
FYI chúng tôi có thể giả định ngăn xếp cuộc gọi vô hạn / tài nguyên vô hạn cho phần lớn các thách thức golf-code (về cơ bản trừ khi câu hỏi có quy định khác).
Jonathan Allan



2

Bình thường, 3 byte

l{P

Bộ kiểm tra

Độ dài ( l) của tập hợp ( {) của các thừa số nguyên tố ( P) của đầu vào.






2

Số R +, 30 14 byte

16 byte bị xóa nhờ @Giuseppe

numbers::omega

Ngoài ra, đây là bản dùng thử trực tuyến !! liên kết trên mỗi @Giuseppe.


Bạn có thể bỏ qua f=function(x)(x)như numbers::omegalà một chức năng đã có. Tuy nhiên, vì numberskhông phải là tiêu chuẩn cho R, bạn nên đưa ra câu trả lời của mình "số R +". Ngoài ra, bạn nên bao gồm một liên kết TIO . Tuy nhiên, +1, rất đẹp.
Giuseppe

@Giuseppe, bạn đẹp quá. Cảm ơn bạn đã giúp đỡ. BTW, ngoài một số câu trả lời sâu sắc của bạn, tôi đã kiểm tra Mẹo chơi golf trong R , như bạn đề xuất. Có một số đá quý thực sự ở đó. Dù sao, tôi sẽ cập nhật câu trả lời của tôi với các khuyến nghị của bạn. Ngoài ra, MATLgiải pháp của bạn rất hay (+1 ngày hôm qua).
Joseph Wood

NP, vui lòng ping tôi trong trò chuyện hoặc nhận xét về câu trả lời của tôi nếu bạn có thắc mắc.
Giuseppe

@Giuseppe có sự đồng thuận meta về việc cần phải nêu rõ "số R +" không? Có vẻ như nếu chúng ta nêu gói bổ sung thì chúng ta sẽ có thể lưu các byte bằng cách gọi nó một cách rõ ràng numbers::. Mặt khác, với tôi nó giống như sử dụng một importngôn ngữ khác.
BLT

(cuộn xuống và thấy một ví dụ về con trăn về điều này ...) Tôi đoán tôi đang tự hỏi về một sự đồng thuận meta rộng hơn, sau đó. Nó chỉ có vẻ ngớ ngẩn với tôi.
BLT



1

Haskell , 58 byte

-4 byte nhờ @Laikoni

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

Hãy thử trực tuyến!

Giải trình

Về cơ bản tạo ra tất cả các số nguyên tố lớn nhất bằng nvà lọc chúng thành hệ số của n và sau đó lấy độ dài của kết quả.

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

Bạn có thể sử dụng sum[1|x<- ... ]thay vì length.
Laikoni

1

Japt, 5 4 byte

â èj

Thử nó

Lấy các ước số ( â) và đếm ( è) các số nguyên tố ( j).


1

CẠNH , 28 byte

len(unique(primefactors(n)))

Hãy thử trực tuyến!

Đây là một giải pháp rất đúng nghĩa


Tôi đã nhìn vào điều này và nói "Này, đợi một chút, đây là một đoạn trích!" Và rồi tôi thấy ... đây có phải là một ngôn ngữ không bí truyền với IO ngầm?!
hoàn toàn là

@icrieverytim Xin chúc mừng, bạn đã phát hiện ra một trong những lý do chính khiến ngôn ngữ này tồn tại.
ATaco


0

Python 2 ,  63  55 byte

Một câu trả lời thú vị hơn nhiều ...

-8 byte nhờ Jonathan Frech (sử dụng một đối số với mặc định cho việc điều chỉnh sau kết quả của các số nguyên tố từ 0đến1 - tốt hơn nhiều so với một gói lambda !!)

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

Hàm đệ quy lấy một số nguyên dương nvà trả về một số nguyên dương, số đếm.

Hãy thử trực tuyến! Thực sự không hiệu quả, thậm chí không bận tâm với các trường hợp thử nghiệm khác.



@JonathanFrech Cảm ơn, điều đó sạch sẽ hơn nhiều.
Jonathan Allan

0

J, 12 byte

{:@$@(__&q:)

q: là hàm số mũ nguyên tố của J, đưa ra đối số __ tạo ra một ma trận có hàng đầu tiên là tất cả các thừa số nguyên tố khác không và hàng thứ 2 là số mũ của chúng.

Chúng tôi có hình dạng $ của ma trận đó - hàng theo cột - số lượng cột là câu trả lời chúng tôi tìm kiếm.

{: cung cấp cho chúng tôi mục cuối cùng của danh sách hai mục này (num hàng, cột num) và từ đó trả lời.

Hãy thử trực tuyến!



0

Javascript ES6, 56 ký tự

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

Kiểm tra:

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.