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)
Например, чтобы вычислить сумму массива, вы должны передать значение initialValue
of 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
и т.д.