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 преобразовать [...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)
Например, чтобы вычислить сумму массива, вы должны передать значение initialValueof 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()заменяет цифру at 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и т.д.