Số nguyên tố liên kết


26

Thử thách:

Bạn được cung cấp một chuỗi chỉ chứa các chữ số. Nhiệm vụ của bạn là xuất ra số lượng số nguyên tố tối thiểu phải được nối để tạo thành chuỗi. Nếu điều này là không thể, đầu ra 0.

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

Đầu vào -> Đầu ra:

252 -> 3
235 -> 2
92 -> 0
31149 -> 2


Có thể có số không hàng đầu?
Zgarb

Vâng, có thể có số không hàng đầu.
poi830

Chúng ta có thể lấy một danh sách các chữ số?
LegionMammal978

1
Điều gì xảy ra nếu có các số 0 đứng đầu?
Dennis

Câu trả lời:


6

JavaScript (ES6), 123 121 120 byte

f=(s,v)=>(p=n=>--n-1?s%n&&p(n):1)(s)||[...s].map((_,i)=>!(n=i&&(a=f(s.slice(0,i)))&&(b=f(s.slice(i)))&&a+b)|n>v?0:v=n)|v

Đã lưu một byte nhờ @Neil!

Giải trình

Lấy một chuỗi đơn làm đầu vào. Do phương pháp kiểm tra chính (phân chia thử nghiệm đệ quy), số lượng lớn nhất có thể được kiểm tra an toàn là 13840. Một số số ở trên này sẽ không thành công do kích thước ngăn xếp cuộc gọi tối đa bị vượt quá. Nó, tuy nhiên, kết thúc ngay lập tức cho mọi trường hợp nó có thể xử lý.

f=(s,v)=>
  (p=n=>--n-1?s%n&&p(n):1)(s) // if s is prime, return 1
  ||[...s].map((_,i)=>        // else for each index in s, split s into 2
    !(n=i&&                   // v = return value (initialised to undefined)
      (a=f(s.slice(0,i)))&&
      (b=f(s.slice(i)))&&
      a+b
    )|n>v?0:v=n               // if i, a, b and n are all > 0 and !(n > v), v = n
  )|v                         // cast v to an integer and return it

// Test
var testCases = [ "252", "235", "92", "3149", "24747" ];
document.write("<pre>" + testCases.map(c => c + ": " + f(c)).join("\n"));


Là tôi hay bạn có thể đổi i?(a=...)&&(b=...)&&a+b:0thành i&&(a=...)&&(b=...)&&a+b?
Neil

5

MATL , 26 24 byte

0in:"GUtZq@Z^V10ZA=a?x@.

Phải mất vài giây cho một số trường hợp thử nghiệm.

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

Giải trình

0       % Push 0
in:     % Take input. Generate array [1,2,...,N] where N is input length
"       % For each. In each iteration the number of used primes is increased
  GU    %   Push input. Convert to number
  tZq   %   Duplicate. Array of primes smaller than the input
  @     %   Push number of primes to bes tested in this iteration
  Z^    %   Cartesian power
  V     %   Convert to 2D array. Each row is a combination of primes
  10ZA  %   Convert each row to base 10, disregarding spaces
  =a    %   Do any of the results equal the input number? 
  ?     %   If so
    x   %     Remove the 0 that's at the bottom of the stack
    .   %     Break for each loop
        %   Implicitly end if
        % Implicitly end for each
        % Implicitly display



2

Bash + coreutils, 169 158 149 byte

c()
{
test $1||echo a
for i in `seq ${#1}`
do factor ${1::$i}|grep -q ': \w*$'&&printf b%s\\n `c ${1:$i}`
done
}
c $1|sort|sed '/a/!d;s/..//;q'|wc -c

Chúng tôi tính bằng unary, xuất ra một dòng với một bcho mỗi số nguyên tố và chấm dứt aở cuối dòng (để printfcó mã thông báo hoạt động).

Kiểm tra tính nguyên thủy là factor $n | grep -q ': \w*$', xác định xem số có chính xác một yếu tố chính hay không.

Chúng tôi phân vùng đệ quy đầu vào; nếu nửa bên trái là số nguyên tố, chúng tôi lọc kết quả của nửa bên phải bằng cách thêm một cho mỗi giá trị. Trở lại acho đầu vào có độ dài bằng không chấm dứt đệ quy.

Cuối cùng, chúng tôi lấy tất cả các kết quả và sắp xếp để tìm ra kết quả ngắn nhất (bỏ qua bất kỳ kết quả nào không có anghĩa là thành công); chúng ta phải xóa hai (cho chèn avà cho dòng mới), sau đó đếm các ký tự để đưa ra kết quả.

Xét nghiệm

$ for i in 252 235 92 31149 111; do echo "$i:"$'\t'"$(./77623.sh $i)"; done
252:    3
235:    2
92:     0
31149:  2
111:    0

Tôi đã thêm 111vào các bài kiểm tra để cho thấy rằng 1được coi là không chính xác.


Tôi sẽ đề nghị điều này . Hầu hết các sửa đổi của tôi có lẽ đã lỗi thời, nhưng những người khác vẫn nên làm việc.
Dennis

@Dennis - Tôi thích ctạo ra trận chung kết 0. Mặc dù vậy, không quan tâm đến stderr nhiều. Bạn có thể sử dụng (phiên bản) câu trả lời của tôi làm cơ sở cho riêng bạn nếu bạn muốn.
Toby Speight

2

Toán học, 142 135 byte

Min[Length/@Select[Join@@@Permutations/@IntegerPartitions@Length[a=#],And@@PrimeQ@*FromDigits/@a~Internal`PartitionRagged~#&]]/.∞->0&

Như bạn có thể thấy, Mathicala không được xây dựng cho nhiệm vụ này. Đưa ra một danh sách các chữ số.


Bạn có thể sử dụng And@@thay vì AllTrue? Nên tiết kiệm 4-5 byte.
Máy

Flatten[#,1]=Join@@@#
Máy

Ừm ... đưa ra lỗi và trả lời sai trên 133 ... bạn đã sử dụng tất cả các trường hợp kiểm tra, phải không?
Máy

@CatsAreFluffy Chơi gôn và làm rõ.
LegionMammal978
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.