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 a
trong 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 initialValue
số 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 digitArray
bằng cách thay đổi từng decimal
phầ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 0
qua 9
. Nó là tốt hơn để làm như vậy với u
, nhưng u
không hữu ích cho từng phần tử trong mảng, trong trường hợp này.
i+j
trong điều kiện ternary kiểm tra để đảm bảo rằng đó 0
khô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 n
khô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 == i
bằ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 a
sang 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.
n
mà đầ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