JavaScript (ES6), 153 142 139 byte
n=>([...n].map((c,i,[...a])=>[...''+1e9].map((u,j)=>s+=j+i&&j!=c?p((a.splice(i,1,j),a.join``)):0),s=0,p=q=>eval('for(k=q;q%--k;);k==1')),s)
Chấp nhận đầu vào dưới dạng một chuỗi. Hành vi không xác định cho đầu vào không hợp lệ, mặc dù nó sẽ chấm dứt mà không có lỗi trên bất kỳ chuỗi nào tôi có thể nghĩ đến. Không nhất thiết là trước cái chết nóng của vũ trụ, đặc biệt là đối với các chuỗi dài.
Bản giới thiệu
f=
n=>([...n].map((c,i,[...a])=>[...''+1e9].map((u,j)=>s+=j+i&&j!=c?p((a.splice(i,1,j),a.join``)):0),s=0,p=q=>eval('for(k=q;q%--k;);k==1')),s)
console.log([...''+1e19].map((_,i)=>f(i+1+'')).join())
i.onchange=()=>console.log(f(i.value))
<input id=i>
Cải tiến
Đã lưu 11 byte bằng cách cấu trúc lại các reduce()cuộc gọi thành map()các cuộc gọi và bằng cách sao chép ngầm định mảng atrong tham số hàm, thay vì trong ngữ cảnh của splice()cuộc gọi.
Đã lưu 3 byte nhờ đề xuất của @Neil để chuyển đổi [...Array(10)]sang [...''+1e9].
Mã chưa hoàn thành
input => (
[...input].map(
(char, decimal, [...charArray]) =>
[...'' + 1e9].map(
(unused, digit) => sum +=
digit + decimal && digit != char ?
prime(
(
charArray.splice(decimal, 1, digit)
, charArray.join``
)
) :
0
)
, sum = 0
, prime = test => eval('for(factor = test; test % --factor;); factor == 1')
)
, sum
)
Giải trình
Hàm sử dụng hai cấp độ map()để tổng số lượng hoán vị vượt qua bài kiểm tra tính nguyên thủy, được mượn và sửa đổi từ câu trả lời này .
(Câu trả lời gốc)
reduce((accumulator, currentValue, currentIndex, array) => aggregate, initialValue)
Vì vậy, ví dụ, để tính tổng của một mảng, bạn sẽ vượt qua một initialValuesố 0, và trả về một aggregateđến bình đẳng accumulator + currentValue. Thay đổi cách tiếp cận này một chút, thay vào đó, chúng tôi tính toán số lượng hoán vị vượt qua bài kiểm tra nguyên thủy:
reduce(
(passedSoFar, currentDecimal, currentIndex, digitArray) =>
isValidPermutation() ?
passedSoFar + prime(getPermutation()) :
passedSoFar
, 0
)
Đó thực chất là phần bên trong reduce(), lặp đi lặp lại tất cả các hoán vị của digitArraybằng cách thay đổi từng decimalphần cụ thể permutatedDigit. Sau đó, chúng ta cần một cái bên ngoài reduce()để lặp lại tất cả những gì có thể permutatedDigitđể thay thế từng cái decimal, chỉ là 0-9.
Bất thường trong thực hiện
[...''+1e9].map((u,j)=>...là con đường ngắn nhất @Neil có thể nghĩ ra để lặp một cuộc tranh cãi 0qua 9. Nó là tốt hơn để làm như vậy với u, nhưng ukhông hữu ích cho từng phần tử trong mảng, trong trường hợp này.
i+jtrong điều kiện ternary kiểm tra để đảm bảo rằng đó 0không phải là một hoán vị có thể có của chữ số hàng đầu, theo thông số kỹ thuật thách thức. j!=cđảm bảo rằng bản gốc nkhông phải là một ứng cử viên để trải qua bài kiểm tra nguyên thủy.
(a.splice(i,1,j),a.join``)là một mớ hỗn độn. splice()thay thế chữ số tại decimal == ibằng permutatedDigit == j, nhưng vì splice()trả về các phần tử bị loại bỏ (trong trường hợp này, sẽ bằng [a[i]]) thay vì mảng đã sửa đổi, chúng ta phải sử dụng toán tử dấu phẩy để chuyển mảng đã sửa đổi asang kiểm tra tính nguyên thủy, nhưng không phải trước khi nhập join()nó thành một chuỗi số.
Cuối cùng, eval()là để lưu một byte kể từ khi so sánh với cách tiếp cận chính tắc hơn, nó ngắn hơn:
q=>eval('for(k=q;q%--k;);k==1')
q=>{for(k=q;q%--k;);return k==1}
Tham chiếu đến kiểm tra chính pđược khởi tạo trong một đối số không được sử dụng cho map()cuộc gọi.
nmà đầu ra là0. Tôi nghĩ đó làn = 200. Tôi cũng nghĩ rằng họ đến trong chùm:200,202,204,206,208,320,322,...,328,510,...,518,620,...628,840,...,848,, vv