JavaScript(ES6)、123 118 115 111 104 96バイト
@Arnauldのおかげで4バイト節約
G=n=>n?G(n>>1,++a[n%2]):a.some(n=>(P=x=>n%--x?P(x):x)(n)-1)
F=n=>F(n-1,G(n,a=[0,0,n])||alert(n))
3つの典型的な再帰関数の組み合わせ。シーケンスを逆順で警告し、「再帰が多すぎる」エラーで終了します。
テストスニペット
(ページへの出力に変更)
alert = s => O.textContent += s + "\n"
G=n=>n?G(n>>1,++a[n%2]):a.some(n=>(P=x=>n%--x?P(x):x)(n)-1)
F=n=>F(n-1,G(n,a=[0,0,n])||alert(n))
F(1000)
<pre id=O></pre>
メイン関数は、104バイトの配列を返すことができます。
G=n=>n?G(n>>1,++a[n%2]):a.some(n=>(P=x=>n%--x?P(x):x)(n)-1)
F=n=>n?F(n-1).concat(G(n,a=[0,0,n])?[]:n):[]
また、別のバイトを犠牲にして非再帰的にすることもできます。
G=n=>n?G(n>>1,++a[n%2]):a.some(n=>(P=x=>n%--x?P(x):x)(n)-1)
n=>[for(_ of Array(n))if(!G(--n,a=[0,0,n]))n]
私が始めたものは次のとおりです(@Arnauldのおかげで6バイト保存されました)
P=(n,x=n)=>n>1&--x<2||n%x&&P(n,x)
G=n=>n?G(n>>1,o+=n%2,t++):P(o)&P(t-o)
F=n=>n?F(n-1).concat(P(n)&G(n,o=t=0)?n:[]):[]
さらにゴルフを試してみて、104バイトで何とかしました。それで、その解決策を既に見つけていたことがわかりました(答えの一番下にあります)。それが起こったら嫌いではないですか?:P
メイン関数での非再帰的な試み(再び、同じバイトカウント):
n=>[for(i of Array(n))if(P(--n)&G(n,o=t=0))n]
これは、バイナリ表現に含まれる0と1の数を数える簡単なルートです。
F=n=>n?F(n-1).concat([n,(G=x=>n.toString(2).split(x).length-1)(0),G(1)].some(n=>(P=x=>n%--x?P(x):x)(n)-1)?[]:n):[]
配列内包表記でも同じこと:
n=>[for(_ of Array(n))if(![--n,(G=x=>n.toString(2).split(x).length-1)(0),G(1)].some(n=>(P=x=>n%--x?P(x):x)(n)-1))n]
これは同じことをするために少し難しいルートを取ります:
F=n=>n?F(n-1).concat([n,(G=(x,w=n)=>w&&G(x,w>>1)+(w%2==x))(0),G(1)].some(n=>(P=x=>n%--x?P(x):x)(n)-1)?[]:n):[]
そして、これはオリジナルと同じくらい短いさらに別の関連するルートを取ります:
F=n=>n?F(n-1).concat([n,o=(G=x=>x&&x%2+G(n>>++t))(n,t=0),t-o].some(n=>(P=x=>n%--x?P(x):x)(n)-1)?[]:n):[]
繰り返しますが、逆の順序でシーケンスを警告することにより、8バイトをゴルフできます。
F=n=>F(n-1,[n,o=(G=x=>x&&x%2+G(n>>++t))(n,t=0),t-o].some(n=>(P=x=>n%--x?P(x):x)(n)-1)||alert(n))