자바 스크립트 (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))
세 가지 일반적인 재귀 함수의 조합입니다. 순서를 역순으로 경고하고 "너무 많은 재귀"오류가 발생하면 종료됩니다.
테스트 스 니펫
(페이지로 출력되도록 수정)
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 바이트로 그것을 할 수 있었다. 그리고 나는 그 해결책을 이미 발견했다는 것을 깨달았다 (답의 맨 아래에있다). 그럴 때 미워하지 않습니까? :피
메인 함수에서의 비재 귀적 시도 (다시 같은 바이트 수) :
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))