JavaScript (ES6), 153 142 139 байт
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)
Приймає введення як рядок. Невизначена поведінка для недійсного введення, хоча воно має припинятися без помилок у будь-якому рядку, про який я можу придумати. Не обов’язково перед тепловою смертю Всесвіту, особливо для довгих струн.
Демо
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>
Поліпшення
Збережено 11 байт шляхом рефакторингу reduce()викликів у map()виклики та неявного копіювання масиву aв параметр функції, а не в контексті splice()виклику.
Збережено 3 байт завдяки @Neil пропозицією «s , щоб перетворити [...Array(10)]в [...''+1e9].
Немініфікований код
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
)
Пояснення
Функція використовує дворівневий map()підсумок кількості перестановок, які проходять тест первинності, який був запозичений і модифікований з цієї відповіді .
(Оригінальна відповідь)
reduce((accumulator, currentValue, currentIndex, array) => aggregate, initialValue)
Так, наприклад, для обчислення суми масиву, ви б передати initialValueз 0, і повернути , aggregateрівні accumulator + currentValue. Змінюючи цей підхід трохи, ми замість цього обчислюємо кількість перестановок, які проходять тест первинності:
reduce(
(passedSoFar, currentDecimal, currentIndex, digitArray) =>
isValidPermutation() ?
passedSoFar + prime(getPermutation()) :
passedSoFar
, 0
)
Це по суті внутрішнє reduce(), яке ітералізує всі перестановки digitArray, змінюючи кожну decimalна конкретну permutatedDigit. Тоді нам потрібна зовнішня, reduce()щоб повторити всі можливі permutatedDigit, з якими можна замінити кожен decimal, який справедливий 0-9.
Аномалії в реалізації
[...''+1e9].map((u,j)=>...був найкоротшим шляхом @Neil міг придумати, щоб ітерація аргумент 0через 9. Краще це робити з u, але uв цьому випадку це не корисно для кожного елемента в масиві.
i+jу потрійних перевірках стану, щоб переконатися, що 0неможлива перестановка провідної цифри, відповідно до специфікації виклику. j!=cгарантує, що оригінал nне є кандидатом для проходження тесту на первинність.
(a.splice(i,1,j),a.join``)є свого роду безлад. splice()замінює цифру на decimal == iна permutatedDigit == j, але оскільки splice()повертає вилучені елементи (у цьому випадку було б дорівнювати [a[i]]) замість модифікованого масиву, ми повинні використовувати оператор комами для передачі модифікованого масиву aв тест первинності, але не перед тим, як використовувати join()його в рядок числа.
Нарешті, eval()полягає в збереженні байта, оскільки порівняно з більш канонічним підходом він коротший:
q=>eval('for(k=q;q%--k;);k==1')
q=>{for(k=q;q%--k;);return k==1}
Посилання на основний тест pініціалізується у невикористаному аргументі map()виклику.
nдля якого результат0. Я думаю, що цеn = 200. Я також думаю , що вони приходять в пучках:200,202,204,206,208,320,322,...,328,510,...,518,620,...628,840,...,848і т.д.