Phân rã thành số nguyên tố


14

Cho một số nguyên n, trả về số cách mà n có thể được viết dưới dạng danh sách các số nguyên tố. Ví dụ, 2323có thể được viết như sau (2,3,23), (23,23)hay (2,3,2,3)hay (23,2,3), vì vậy bạn sẽ ra 4. Nếu nó không thể được viết theo cách này, bạn nên xuất ra 0.

Một số nguyên tố như 019hoặc 00000037là một số nguyên tố hợp lệ cho vấn đề này.

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

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)

Đây là , vì vậy câu trả lời ngắn nhất tính bằng byte trong mỗi ngôn ngữ sẽ thắng!

Chỉnh sửa: bây giờ tôi biết tại sao tôi nên sử dụng hộp cát vào lần tới


Câu trả lời:


7

Haskell , 96 89 byte

5 byte được lưu nhờ vào kiểm tra tính nguyên thủy của 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]

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

Giải trình

Điều đầu tiên được thực hiện là tạo ra một hàm kiểm thử nguyên tố bằng định lý Wilson sử dụng định nghĩa nguyên tố.

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

Sau đó bắt đầu xác định f. Điều đầu tiên tôi nghĩ khi tôi thấy vấn đề này là sử dụng lập trình động. Tuy nhiên, lập trình động chi phí byte vì vậy điều này sử dụng thuật toán "lập trình động psuedo". Trong khi đó, trong lập trình động, bạn sẽ lưu trữ đồ thị Acected Acyclic trong bộ nhớ ở đây, chúng ta chỉ sử dụng đệ quy và tính toán lại mỗi nút mỗi khi chúng ta cần. Nó mất tất cả các lợi ích về thời gian của lập trình động, nhưng đây là nên ai quan tâm. (vẫn tốt hơn so với tìm kiếm vũ phu)

Thuật toán như sau, chúng tôi xây dựng một đồ thị theo chu kỳ có hướng, L , trong đó mỗi nút đại diện cho một chuỗi con của số. Cụ thể L i đại diện cho các chữ số i cuối cùng của đầu vào của chúng tôi (hãy gọi nó là n ).

Chúng tôi xác định L 0 có giá trị 1 và mỗi giá trị khác trong L để có tổng của mỗi L j sao cho j <i và chuỗi con của n từ i đến j là số nguyên tố.

Hoặc trong một công thức:

Công thức

Sau đó chúng tôi trả về giá trị ở các chỉ số lớn nhất lớn nhất của L . ( L k trong đó k là số chữ số của n )


6

Thạch , 8 byte

ŒṖḌÆPẠ€S

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

-1 byte nhờ Leaky Nun
-1 byte nhờ Dennis

Giải trình

ŒṖḌÆ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

Tôi đã nhận thấy rằng 05AB1E không thể làm điều này một cách dễ dàng. Phân vùng có vẻ như một lệnh tuyệt vời.
Bạch tuộc ma thuật Urn

5

Brachylog , 10 byte

ṫ{~cịᵐṗᵐ}ᶜ

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

Đầu tiên chuyển đổi đầu vào thành một chuỗi. {…}ᶜĐếm số lượng đầu ra có thể cho .

Bên trong {…}đầu ra của được đưa đến ~c. Đầu ra của vị từ này thỏa mãn rằng, khi được nối, nó bằng với đầu vào. Điều này được đưa vào ịᵐ, trong đó xác định rằng đầu ra của nó là đầu vào với mỗi chuỗi được chuyển đổi thành một số nguyên. ṗᵐxác định rằng đầu vào của nó bao gồm các số nguyên tố


1
Bạn không cần phải chuyển đổi thành chuỗi và ngược lại, 7 byte đó là đủ : {~cṗᵐ}ᶜ. Điều này thực sự chậm vì ~ctrên số nguyên hoạt động với số học ràng buộc, nhưng trên lý thuyết nó hoạt động.
Gây tử vong

@Firthize Tôi nghĩ rằng không thể giải thích cho các số 0 hàng đầu
H.PWiz

4

Bình thường , 13 byte

lf.AmP_sdT./`

Bộ thử nghiệm.


Tôi không biết rõ về Pyth nhưng thay vì lọc và sau đó lấy độ dài, bạn có thể thực hiện for_each thay vì lọc và sau đó tính tổng không?
HyperNeutrino

@HyperNeutrino có làm nên sự khác biệt không?
Nữ tu bị rò rỉ

Tôi không chắc chắn, tôi đã không thử nghiệm. Nó làm cho Jelly (có thể là do bộ lọc hai byte nhanh) nhưng tôi không chắc chắn.
HyperNeutrino

Bộ lọc @HyperNeutrino là một byte ở đây ...
Leaky Nun


2

Con trăn 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)]]

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

Hàm gtạo các phân vùng theo cách đệ quy (nó lấy một chuỗi làm đầu vào nhưng xuất ra một danh sách các danh sách các số nguyên). Hầu hết các mã còn lại chỉ để thực hiện 'là dsố nguyên tố?'.





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.