프롤로그 (SWI) , (134) 128 (127) 124 바이트
이 답변은 나와 0 '사이의 협력의 일부입니다. 우리는 둘 다 이것을 함께 일했는데, 내가 게시하는 유일한 이유는 Rock, Paper, Scissors에서 우승했기 때문입니다.
\Q-->{Q=1};"(",\N,")",\B,{findnsols(N,I,(between(2,inf,I),\+ (between(3,I,U),0=:=I mod(U-1))),L)->append(_,[Y],L),Q is Y*B}.
온라인으로 사용해보십시오!
설명
이 답변은 프롤로그에서 골프를 즐겁게 만드는 이유를 완벽하게 보여줍니다.
이 답변은 명확한 절 문법에 Prologs 강력한 시스템을 사용합니다. 여기 문법이 약간 풀려 있습니다.
head(1)-->[].
head(Q)-->"(",head(N),")",head(B),{prime(N,Y),Q is Y*B}.
isprime(I):- \+ (between(3,I,U),0 =:= I mod(U-1)).
prime(N,Y):-
findnsols(N,I,(
between(2,inf,I),
isprime(I)
),L),
append(_,[Y],L),!.
첫 번째 건설 규칙은 다음과 같습니다.
head(1)-->[].
이것은 빈 문자열이 1에 해당함을 프롤로그에 알려줍니다.
우리의 두 번째 건설 규칙은 조금 더 복잡합니다.
head(Q)-->"(",head(N),")",head(B),{prime(N,Y),Q is Y*B}.
이것은 빈 문자열이 아닌 동일한 규칙을 가진 절의 오른쪽에 괄호가 포함되어 있음을 알려줍니다.
또한이 절 ( Q
) 의 값이 규칙을 따릅니다.
{prime(N,Y),Q is Y*B}
이것을 세분화하면 Q
2 개의 숫자 Y
와 의 곱이 B
됩니다. B
왼쪽에있는 절의 값일 뿐이며 괄호 안에있는 절의 값 Y
이있는 N
첫 번째 소수 N
입니다.
이 규칙은 요인 트리의 구성 규칙을 모두 포함합니다.
이제 술어 정의에 대해. ungolfed 버전에는 두 가지 술어가 있습니다 (실제 코드에서는 술어를 앞으로 묶었습니다). 여기에 두 개의 관련 술어는 isprime/1
소수 일치하고있는 prime/2
부여하는, N
그리고 Y
, IFF 일치 Y
는 IS N
일 주요. 먼저 우리는
isprime(I):- \+ (between(3,I,U),0 =:= I mod(U-1)).
이것은 기본성에 대한 꽤 표준적인 정의로 작동합니다. 우리는 2를 I
포함하여 2를 포함하지만 I
그 사이에는 숫자가 없다고 주장합니다 I
.
다음 술어도 꽤 간단합니다
prime(N,Y):-
findnsols(N,I,(
between(2,inf,I),
isprime(I)
),L),
append(_,[Y],L),!.
우리 는 소수 인 findnsols
첫 번째 N
숫자 를 찾은 다음 마지막 숫자를 반환합니다. 여기서 속임수 findnsols
는 가장 작은 N
소수 를 찾을 수는 없지만 SWI가 처리하는 방식 때문에 between
항상 작은 소수를 더 빨리 찾을 수 있다는 것입니다. 그러나 이것은 더 많은 소수를 찾지 못하도록 잘라 내야 함을 의미합니다.
골프
코드에서 이유를 두 번 전달할 수 있습니다. 이후로는 isprime
해당 정의가 내부에 이동 가능 한번만 사용된다 prime
. 다음 prime
은 DCG 내부 로 직접 이동 하는 것입니다. 그러나 너무 많은 소수를 만들지 prime
않기 위해 컷인을 사용하기 때문에 findnsols
약간의 문제가 있습니다. 컷은 원하는 비트 대신 전체 DCG를 컷합니다. 약간의 문서 파기 후 우리는 once/1
이 부분 만 잘라 내고 전체 DCG가 아니라는 데 사용될 수 있음 을 발견했습니다 . 그러나 더 많은 문서 파기 작업을 통해 ->
운영자가 유사한 작업을 수행하는 데 사용될 수 있음이 밝혀졌습니다 . ->
오퍼레이터는 대략 동등 ,!,
우리의 반대편에가는 절단 이동되도록 append/3
하고 그것을 대체 ->
.
SWI-Prolog에서 술어 (및 규칙)는 연산자를 이름으로 제공하여 일반적으로 필요한 괄호를 삭제할 수 있습니다. 이에 의해 우리는 rule을 호출함으로써 6 바이트를 절약 할 수 있습니다 \
.