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>
改善点
reduce()
呼び出しをmap()
呼び出しにリファクタリングし、呼び出しa
のコンテキスト内ではなく、関数パラメーターで暗黙的に配列をコピーすることにより、11バイトを節約しましたsplice()
。
@Neilのへの変換の提案のおかげで3バイト節約さ[...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
)
説明
この関数は、2つのレベル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
チャレンジ仕様に従って、3進条件チェックで、先頭の桁の可能な置換ではないことを確認します。j!=c
オリジナルn
が素数性テストを通過する候補ではないことを保証します。
(a.splice(i,1,j),a.join``)
混乱のようなものです。splice()
で桁を置き換えるdecimal == i
とpermutatedDigit == j
、しかしのでsplice()
戻り除去要素(この場合には、に等しくなる[a[i]]
代わり変性配列の)、我々は、修飾配列を渡すカンマ演算子を使用する必要がa
素数性テストにではなく、前にjoin()
それをINGの数値文字列に。
最後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
、など