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
і т.д.