예약어를 사용하지 않고 처음 128 개의 소수를 인쇄하십시오.


13

확실한 해결책은 문자열로 인쇄하는 것이지만 더 짧은 코드를 작성할 수 있습니까?

요구 사항 :

  1. 입력을 처리해서는 안되며 출력은 2 3 5 7 11 13 ...등 의 형식이어야합니다 .
  2. 언어의 예약어가 전혀 사용되지 않습니다
  3. 언어는 최소한 구조화 된 프로그래밍을 허용해야하며 예약어를 가져야합니다 (그렇지 않으면 포인트 2가 무의미합니다).

처음에는 독점적으로 C / C ++을 염두에두고 있었지만 부정 행위를 방지하려고 노력하면서 질문을 확장했습니다.


1
불행히도 Tcl에는 예약어가 없습니다.
Johannes Kuhn

답변:


14

C, 60 자

"키워드 없음"제한은 여기서 중요하지 않습니다. 가능하면 키워드를 추가해도 개선되지 않을 것입니다.

n=2;main(m){n<720&&main(m<2?printf("%d ",n),n:n%m?m-1:n++);}

다른 버전 :
출력이 좋지는 않지만 printf남용을 좋아합니다 .

n=2;main(m){n<720&&main(m<2?printf("%*d",n,n):n%m?m-1:n++);}

두 솔루션의 트릭은 두 개의 루프 (재귀로 구현 됨)를 하나로 병합하는 것입니다.
n다음 잠재적 소수, m다음 잠재적 제수입니다.
각 재귀 호출에서 우리는 n( m이전 값으로 설정 하는 동안) 증가 하거나 감소 m합니다.


7

파이썬, 108 자

이 도전을 위해 파이썬이 만들어지지 않았습니다. 싶어 print? 예약되었습니다. 우리는 stdout어떻습니까? 글쎄요, 그것은 비용이들 것입니다 import... 당신은 그것을 추측했습니다. 글쎄 ... 유닉스에있어서 파일 기술자 1을 열 수 있습니다.이 파일은 stdout입니다. 마구 자르기!

남자와 반복? 그 외에는 아무것도 없습니다 eval. 물론 루프는 없지만 def또는 로 함수를 정의 할 수도 없습니다 lambda. 그리고 부상에 대한 모욕을 더하기 위해 우리는 심지어 목록 이해력을 사용할 수 없습니다! 나는 항상 map(p.__mod__,...)코드 골프 와 같은 것을 사용하는 변명을 찾습니다 ... 이해력은 항상 좋습니다. 지금까지는

p=1
eval(compile("p+=1;open('/dev/fd/1','w').write('%s '%p*all(map(p.__mod__,range(2,p))));"*720,'','exec'))

자, 당신은 불평 수 있습니다 exec(I조차하지 않았다 나는 키워드를 사용하지 않았다하더라도, 키워드입니다 ). 글쎄, 여기에을 사용하지 않는 117 자 솔루션이 있습니다 .evalexec'exec'

p=2
s="eval('('+s*(p<720)+')',open('/dev/fd/1','w').write('%s '%p*all(map(p.__mod__,range(2,p)))),{'p':p+1})";eval(s)

1
Python3에서는 print가 예약되어 있지 않습니다 :) 사용할 수는 __import__있지만 문자가 필요합니다
gnibbler

6

자바 스크립트 (80 자)

eval((s=Array(719)).join("s[j=++n]?j:"+s.join("s[j+=n]=")+"r+=n+' ';"),r="",n=1)

웹 브라우저의 콘솔에서 실행하십시오.

주요 체를 사용하여 매우 응축 된 것으로 나타났습니다.


4

C, 183 자

#define q j*j<k?i%p[j++]||(i++,j=0):printf("%d\n",p[j=0,k++]=i++)
#define A q;q;q;q;q;q;q;q
#define B A;A;A;A;A;A;A;A
#define C B;B;B;B;B;B;B
main(){int i=2,j=0,k=0,p[999];C;C;C;C;C;}

여기에 첫 번째 시도가 있습니다. 나는 이것이 요구 사항을 충족시켜야한다고 생각합니다. 나는 간단한 시험 분할을 사용하여 소수를 찾고 전처리기를 사용하여 생성 된 풀린 루프를 찾아서 충분히 찾을 때까지 반복합니다. 반복 횟수가 조정되어 정확히 128 개의 소수가 인쇄됩니다.


4

C, 87 자

d;p(n){--d<2||n%d&&p(n);}r(n){p(d=n);d<2&&printf("%d\n",n);++n<720&&r(n);}main(){r(2);}

(보다 기능적인 스타일로 작성하려고 시도했지만 사용하지 못하는 것이 return그 계획을 죽였습니다.)


3

C, 134 자

다음은 가능한 한 예약되거나 다른 방법으로 단어를 사용하지 않는 대체 솔루션입니다.

main(i){i<9?main(2953216):i>4097?--i&4094?i/4096%(i%4096)?main(i):
main((i/4096-1)*4097):printf("%d\n",i>>12,main((i/4096-1)*4097)):0;}

모든 그것은이다 사용 printf하고 main하나의 인수.


3

Mathematica 50 자

Mathematica 에 대한 "예약 된 단어"를 해석하는 방법을 잘 모르겠지만 재생을 원하므로 내장 함수없이 소수를 생성하거나 원시성을 테스트하는 것을 의미합니다.

Fold[#2Cases[#/#2,1|_Rational]&,#,#]&@Range[2,719]

2

하스켈, 72 자

main=putStrLn.unwords$take 128[show p|p<-[2..],all((>0).mod p)[2..p-1]]

분명히 Haskell에서는 키워드를 피하는 것이 그리 어렵지 않습니다.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.