믿거 나 말거나, 우리는 간단한 원시성 테스트에 대한 코드 골프 도전을 아직받지 못했습니다 . 특히 “일반적인”언어의 경우 가장 흥미로운 과제는 아니지만 많은 언어에서 사소한 문제 일 수 있습니다.
Rosetta 코드는 우선 순위 테스트에 대한 관용적 접근 방식의 언어 별 목록을 제공합니다. 하나는 Miller-Rabin 테스트를 사용하고 다른 하나는 시험 분할을 사용 합니다. 그러나 “가장 관용적”은 종종 “가장 짧음”과 일치하지 않습니다. Programming Puzzles와 Code Golf를 코드 골프의 사이트로 만들기 위해이 과제는 “Hello, World!” 와 유사한 모든 언어에서 가장 짧은 접근 방식의 카탈로그를 컴파일하려고합니다 . 그리고 당신에게 큰 이익을 위해 골프를! .
또한, 원시성 테스트 구현 기능은 프로그래밍 언어 정의의 일부이므로이 과제는 검증 된 프로그래밍 언어의 디렉토리 역할도합니다.
태스크
입력으로 엄격하게 양의 정수 n이 주어지면 n 이 소수 인지 결정 하고 그에 따라 참 또는 거짓 값을 인쇄 하는 전체 프로그램 을 작성하십시오 .
이 문제를 해결하기 위해 정확히 두 개의 양의 제수가 있으면 정수가 가장 중요합니다. 여기에는 유일한 양의 제수 인 1 이 제외됩니다 .
알고리즘은 결정 론적이어야하며 (즉, 확률 1로 정확한 결과를 생성해야 함) 이론상 임의로 큰 정수를 사용해야합니다. 실제로 프로그램이 1-255의 정수에 대해 작동하는 한 입력을 데이터 유형에 저장할 수 있다고 가정 할 수 있습니다.
입력
-
언어가 STDIN에서 읽을 수 있고 명령 행 인수 또는 다른 대체 사용자 입력 형식을 승인하는 경우 정수를 10 진수 표시, 단항 표시 (선택한 문자 사용), 바이트 배열 (큰 또는 little endian) 또는 1 바이트 (언어가 가장 큰 데이터 유형 인 경우).
-
만약 당신의 언어가 어떤 종류의 사용자 입력을 받아 들일 수 없다면, 프로그램에서 입력을 하드 코딩 할 수 있습니다.
이 경우 하드 코딩 된 정수는 쉽게 교환 할 수 있어야합니다. 특히 전체 프로그램에서 한 곳에만 나타날 수 있습니다.
채점을 위해 입력 1에 해당하는 프로그램을 제출하십시오 .
산출
출력은 STDOUT 또는 가장 가까운 대안에 기록해야합니다.
가능한 경우, 출력은 선택적으로 단일 개행이 뒤에 오는 진실 또는 허위 값 (또는 그 문자열 표현) 으로 만 이루어져야합니다 .
이 규칙의 유일한 예외는 인사말, ANSI 색상 코드 또는 들여 쓰기와 같이 억제 할 수없는 언어 해석기의 일정한 출력입니다.
추가 규칙
-
이것은 주요 테스트를위한 가장 짧은 방법으로 언어를 찾는 것이 아니라 모든 언어에서 가장 짧은 방법을 찾는 것입니다. 따라서 답변이 수락 된 것으로 표시되지 않습니다.
-
대부분의 언어에서 제출은 적절한 기존 인코딩 (보통 UTF-8은 아님)으로 바이트 로 채점됩니다 .
예를 들어, Piet 언어 는이 언어의 자연스러운 선택 인 코델로 채점됩니다.
Folders 와 같은 일부 언어 는 점수를 받기가 약간 까다 롭습니다. 의심스러운 경우 Meta에 문의하십시오 .
-
일반적인 규칙과 달리이 과제보다 새로운 언어라도 언어 (또는 언어 버전)를 자유롭게 사용하십시오. 빈 프로그램이 우선 순위 테스트를 수행하는 언어를 만들어서 이것을 남용하려는 경우, 매우 지루한 답변을 제공하는 것을 축하합니다.
제출물을 테스트하려면 통역사가 있어야합니다. 이전에 구현되지 않은 언어에 대해이 통역사를 직접 작성할 수 있습니다.
-
선택한 언어가 이미 답변이있는 다른 (잠재적으로 더 널리 사용되는) 언어의 사소한 변형 인 경우 (BASIC 또는 SQL 방언, Unix 쉘 또는 Headsecks 또는 Unary와 같은 사소한 Brainfuck 파생물을 생각하십시오) 기존 답변에 메모를 추가하십시오 동일하거나 매우 유사한 솔루션은 다른 언어에서도 가장 짧습니다.
-
우선 순위 테스트를위한 내장 기능 이 허용됩니다. 이 과제는 각 언어로 가능한 가장 짧은 솔루션을 카탈로그 화하기위한 것이므로 언어를 내장하여 사용하는 것이 더 짧은 경우에는 해결하십시오.
-
이전에 철회하지 않는 한 http://meta.codegolf.stackexchange.com/q/1061을 포함한 모든 표준 코드 골프 규칙이 적용됩니다 .
부수적으로, 골프가 많지 않은 언어로 지루한 (그러나 유효한) 답변을 줄이지 마십시오. 이들은 가능한 한 완전한 카탈로그를 컴파일하려고 시도하기 때문에이 질문에 여전히 유용합니다. 그러나 저자가 실제로 코드를 골프화하는 데 노력을 기울여야하는 언어로 답을 주로 투표하십시오.
목록
이 게시물의 맨 아래에있는 스택 스 니펫은 답변 a) 언어 당 가장 짧은 솔루션 목록으로, b) 전체 리더 보드로 카탈로그를 생성합니다.
답변이 표시되도록하려면 다음 마크 다운 템플릿을 사용하여 헤드 라인으로 답변을 시작하십시오.
## Language Name, N bytes
N
제출물의 크기는 어디에 있습니까 ? 당신이 당신의 점수를 향상시킬 경우에, 당신은 할 수 있습니다 를 통해 눈에 띄는에 의해, 헤드 라인에 오래된 점수를 유지한다. 예를 들어 :
## Ruby, <s>104</s> <s>101</s> 96 bytes
헤더에 여러 숫자를 포함하려는 경우 (예 : 점수가 두 파일의 합계이거나 인터프리터 플래그 페널티를 별도로 나열하려는 경우) 실제 점수가 헤더 의 마지막 숫자 인지 확인하십시오 .
## Perl, 43 + 2 (-p flag) = 45 bytes
언어 이름을 링크로 만들면 스 니펫에 표시됩니다.
## [><>](http://esolangs.org/wiki/Fish), 121 bytes
답변
안녕, 세상! , 13
hello, world!
답변
헥사 고니 , 29 바이트
.?'.).@@/'/.!.>+=(<.!)}($>(<%
이 코드의 읽을 수있는 버전은 다음과 같습니다.
. ? ' .
) . @ @ /
' / . ! . >
+ = ( < . ! )
} ( $ > ( <
% . . . .
. . . .
설명 : n을 나누는 2에서 n-1 사이의 숫자가 있는지 테스트합니다.
초기화 :
한 메모리 셀에 n을 쓰고 다른 메모리 셀에 n-1을 쓰십시오.
. ? ' .
. . . . .
. . . . . .
+ = ( . . . .
. . . . . .
. . . . .
. . . .
특별한 경우 n = 1 :
0을 인쇄하고 종료
. . . .
. . . @ .
. . . ! . .
. . . < . . .
. . . . . .
. . . . .
. . . .
루프
n % a를 계산하고 a를 줄이십시오. a = 1 또는 n % a = 0이면 종료합니다.
. . . .
) . . . /
' / . . . >
. . . . . . .
} ( $ > ( <
% . . . .
. . . .
사례 a = 1 :
0을 1로 늘리고 인쇄 한 후 종료하십시오. (명령 포인터는 NE 방향으로 실행되며 동부 모서리에서 남서쪽 모서리로 반복됩니다. $는 다음 명령을 무시합니다)
. . . .
. . . @ .
. . . ! . .
. . . < . . )
. . $ . . <
. . . . .
. . . .
사례 a % n = 0 :
0을 인쇄하고 종료합니다 (명령 포인터가 SW를 실행 중이고 @의 맨 위로 반복됩니다.
. . . .
. . @ . .
. . . . . >
. . . . . ! .
. . . . . .
. . . . .
. . . .
답변
Hexagony , 218 92 58 55 바이트
주의 : 이 답변은 Etoplay 의 측면 길이 4 솔루션 으로 확고하게 구타되었습니다 .
)}?}.=(..]=}='.}.}~./%*..&.=&{.<......=|>(<..}!=...&@\[
최초의 비 사소한 (즉, 비선형) 헥사 고니 프로그램! Sp3000의 Labyrinth answer 와 동일한 제곱 요인 접근 방식을 기반으로합니다 . 크기 (10)의 육각 함께 시작한 후, 나는 그러나 크기 5로 그것을 아래로 압축 관리, 좀 중복 코드를 재사용 할 수 있었다 여전히 코드에없는 작전의 꽤 무리가있다, 그래서 크기도 4는 수도 단지 가능하다.
설명
코드를 이해하려면 먼저 코드를 펼치십시오. Hexagony는 임의의 소스 코드를 다음 중심이없는 육각형 숫자에 op-ops ( .
)로 채 웁니다 61
. 그런 다음 코드를 해당 크기의 일반 육각형으로 재 배열합니다.
) } ? } .
= ( . . ] =
} = ' . } . }
~ . / % * . . &
. = & { . < . . .
. . . = | > ( <
. . } ! = . .
. & @ \ [ .
. . . . .
이것은 교차 및 겹치는 실행 경로와 다중 명령 포인터 (IP)로 상당히 무겁습니다. 작동 방식을 설명하기 위해 먼저 제어 흐름이 가장자리를 통과하지 않고 하나의 IP 만 사용되며 실행 경로가 가능한 간단한 ungolfed 버전을 살펴 보겠습니다.
. . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . @ . . . . .
. . . . . . . . . . ! . . . . . .
. . . . . . . . . . % . . . . . . .
. . . . . . . . . . ' . . . . . . . .
. . . . . . . . . . & . . . . . . . . .
. . . . . . . . . . { . . . . . . . . . .
. . . . . . . . . . * . . . . . . . . . . .
. . . . . . . . . . = . . . . . . . . . . . .
. . . . . . . . . . } . . . . . . . . . . . . .
) } ? } = & { < . . & . . . . . . . . . . . . . .
. . . . . . . > ( < . . . . . . . . . . . . . .
. . . . . . = . . } . . . . . . . . . . . . .
. . . . . } . . . = . . . . . . . . . . . .
. . . . | . . . . | . . . . . . . . . . .
. . . . * . . . ) . . . . . . . . . . .
. . . . = . . & . . . . . . . . . . .
. . . . > } < . . . . . . . . . . .
. . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . .
참고 : 위의 코드는 첫 번째 줄을 실행하는 것으로 시작합니다. 그런 다음 IP가 북동쪽 가장자리에 닿으면 가장 왼쪽 모서리 ( )
)로 랩핑되어 실제 코드가 시작됩니다.
시작하기 전에 Hexagony의 메모리 레이아웃에 대한 단어. 그것은 스테로이드에 관한 Brainfuck의 테이프와 약간 같습니다. 실제로 테이프는 아니지만 6 각형 그리드 자체 (무한 한 개)이며 각 가장자리 에는 정수 값이 있으며 초기 값은 0입니다 (표준 Brainfuck과는 달리 임의의 정밀 정수로 표시됩니다). 이 프로그램에서는 4 가지 모서리를 사용합니다.
우리는 가장자리 A 에서 계승을 계산하고 가장자리 C에서 입력을 카운트 다운하고 가장자리 D 에 (모듈러스에 대한) 입력의 다른 사본을 저장 합니다. B 는 계산을위한 임시 에지로 사용됩니다.
메모리 포인터 (MP)는 가장자리 A 에서 시작하여 북쪽을 가리 킵니다 (MP를 움직일 때 중요 함). 다음은 코드의 첫 번째 비트입니다.
)}?}=&{
)
에지 A 를 1
계승의 기준으로 증가시킵니다 . }
MP를 우회전, 즉 가장자리 C (북동쪽) 로 이동시킵니다 . 여기서 입력을 정수로 읽습니다 ?
. 그런 다음을 사용하여 우회전 D 를 다시 우회전합니다 }
. =
MP가 C 와 공유 된 꼭짓점을 가리 키도록 MP를 반전시킵니다 . &
복사의 값 C 로 (입력) D – 전류 값 (제로) 비 양성 때문에 값이 왼쪽에서 복사된다. 마지막으로, 우리는 MP가가로 다시 좌회전 걸리고 C 와 함께 {
.
다음 <
은 기술적으로는 분기이지만 현재 값이 양수이므로 IP는 항상으로 방향을 바꿉니다 >
. 측면에서 분기 된 분기는 미러 역할을하므로 IP가 다시 수평으로 다시 이동 (
하여 C 의 값이 감소합니다 .
다음 지점 <
은 실제로 지점입니다. 이것이 n-1
아래 에서 로 반복되는 방법 1
입니다. C 의 현재 값 이 양수인 동안 IP는 우회전 (루프를 실행)합니다. 우리가 0을 누르면 대신 왼쪽으로 돌아갑니다.
루프 “body”를 보자. 은 |
단순한 거울이다는을 >
하고 <
도 다시 거울로 사용된다. 이는 실제 루프 바디가
}=)&}=*}=
}
에지로 이동 MP B , =
정점 얼굴의 방향을 반전 ABC를 . )
값을 증가시킵니다. 이는 첫 번째 반복에만 관련이 있으며 B 의 값 이 여전히 0 인 경우 : 다음 명령 &
이 올바른 이웃, 즉 A를 복사하도록 양의 값을 유지하려고합니다 . 즉 계승의 현재 값 B 로 계산 .
}
다음에 이동 MP A는 , =
공통 정점을 향하도록 다시 역전. *
두 이웃, 즉 모서리 B 와 C를 곱하고 결과를 A에 저장합니다 . 마지막으로, 우리는 여전히 정점 ABC를 향한 C}=
로 돌아갈 다른 것이 있습니다 .
나는이의 계승 계산 방법 당신이 볼 수 있기를 바랍니다 n-1
에 을 .
이제 C 에서 루프 카운터 는 0입니다. 계승을 제곱 한 다음 입력 값으로 모듈로를 취하려고합니다. 이것이이 코드의 기능입니다.
&}=*{&'%!@
C 가 0 이므로 &
왼쪽 이웃, 즉 A 의 계승을 복사합니다 . }=*
이동하는 B 와의 요인 (즉, 정사각형)의 두 복사본의 생성물 저장 B를 . {
다시 C 로 이동 하지만 MP를 반전시키지 않습니다. 현재 값이 양수이므로 D의&
입력 을 C 로 복사합니다 . MP 는 오른쪽으로, 즉 A로 거꾸로 됩니다 . 계승의 제곱은 B에 있고 입력은 C에 있음을 기억하십시오 . 그래서 계산 우리가 찾고있는 정확하게.'
%
(n-1)!^2 % n
!
결과를 정수 (0 또는 1)로 인쇄하고 @
프로그램을 종료합니다.
알았어. 그러나 그것은 ungolfed 버전이었다. 골프 버전은 어떻습니까? Hexagony에 대해 두 가지 더 알아야합니다.
- 가장자리가 감 깁니다. IP가 육각형의 모서리에 닿으면 반대쪽 모서리로 이동합니다. IP가 코너를 똑바로 칠 때 모호하므로 모퉁이를 타격하는 것도 브랜치 역할을합니다. 현재 값이 양수이면 IP가 그리드 가장자리로 오른쪽으로 이동하고, 그렇지 않으면 왼쪽으로 이동합니다.
- 실제로 6 개의 IP가 있습니다. 그들 각각은 다른 모서리에서 시작하여 시계 방향으로 가장자리를 따라 움직입니다. 한 번에 하나만 활성화되므로 다른 5 개의 IP를 원하지 않으면 무시해도됩니다. 을 사용하여 다음 IP로 (시계 방향으로)
]
이전 IP로 전환 할 수 있습니다[
. (으로 특정 항목을 선택할 수도#
있지만 다른 시간입니다.)
여기에는 몇 가지 새로운 명령이 있습니다. \
그리고 /
같은 미러 |
이며 ~
현재 값에을 곱합니다 -1
.
그러면 ungolfed 버전은 어떻게 골프 버전으로 변환됩니까? 선형 설정 코드 )}?}=&{
및 기본 루프 구조는 다음에서 찾을 수 있습니다.
) } ? } . ->
. . . . . .
. . . . . . .
. . . . . . . .
-> . = & { . < . . .
. . . . . > ( <
. . . . . . .
. . . . . .
. . . . .
이제 루프 바디가 가장자리를 몇 차례 교차하지만 가장 중요한 것은 실제 계산이 이전 IP (왼쪽 코너에서 시작하여 북동쪽으로 이동)로 전달됩니다.
) . . . .
= . . . ] .
} = . . } . .
~ . / . * . . .
. . . . . . . . .
. . . = . > ( <
. . } . = . .
. & . \ [ .
. . . . .
지점을 남동쪽으로 튀어 =
오른 후 IP는 가장자리를 따라 왼쪽 상단 모서리 의 두 개 (함께는 작동하지 않음)로 랩핑 한 다음을 튕 깁니다 /
. 는 ~
이후의 반복에 대한 중요 현재 값의 부호를 반전시킵니다. IP는 다시 같은 가장자리를 감싸고 [
제어권이 다른 IP로 넘어가는 지점에 도달합니다.
이것은 이제 ~}=)&}=*}
부정을 취소 한 다음 ungolfed 루프 본문 (마이너스 =
)을 실행합니다 . 마지막으로 ]
어느 손이 원래의 IP로 제어되는지 확인합니다. (다음 번에이 IP를 실행하면 중단 된 지점부터 시작하여 먼저 모퉁이에 도달합니다. IP가 북서쪽 가장자리로 되돌아 가려면 현재 값이 음수 여야합니다. 남동쪽 대신.)
원래의 IP 제어를 재개되면,이 튕겨 \
나머지 실행 =
하고 안타 >
다음 루프 반복에 피드.
이제 정말 미친 부분 : 루프가 종료되면 어떻게됩니까?
) . . . .
. ( . . ] =
. . ' . } . }
. . . % * . . &
. . . . . . . . .
. . . = | . . <
. . } ! . . .
. & @ . . .
. . . . .
IP는 북동쪽으로 이동 <
하고 북동 대각선으로 둘러싸입니다. 따라서 루프 본문 ( &}=*}]
) 과 동일한 실행 경로로 끝납니다 . 적어도 현재 다른 코드를 추가하면 =}
( }=}
이와 같기 때문에 ) 이 시점에서 실행하려는 코드이기 때문에 실제로 매우 멋집니다 {
. 그러나 이것이 어떻게 실제로 이전 루프로 다시 들어 가지 않습니까? 때문에 ]
지금 남쪽에서 서쪽으로 이동, 오른쪽 상단에있는 시작 (지금까지 사용되지 않은) IP를 다음 IP 변경. 거기에서 IP는 가장자리를 따라 계속되고 왼쪽 상단 모서리로 감싸고 대각선 아래로 이동하고 튀어 나와 마지막 비트의 선형 코드를 실행하는 동안 |
종료됩니다 @
.
=}&)('%!@
( )(
물론 (
이것은 당연한 일 )
입니다. 이미 추가 했기 때문에 추가해야 했습니다.)
휴 … 무슨 엉망 …
답변
Pyth, 4 바이트
}QPQ
인쇄 True
또는 False
.
답변
레티 나 , 16 바이트
^(?!(..+)\1+$)..
고전으로 시작합시다 : 정규식으로 소수를 감지하십시오 . 입력 가능한 반복 문자를 사용하여 단항으로 입력해야합니다 . 테스트 스위트에는 편의상 10 진수에서 단항으로의 변환이 포함됩니다.
단일 행으로 구성된 Retina 프로그램은 해당 행을 정규식으로 취급하고 입력에서 찾은 일치 수를 인쇄합니다.이 숫자는 0
복합 숫자 및 1
소수입니다.
lookahead는 입력이 합성되지 않도록합니다. 역 추적은에 대해 가능한 모든 하위 문자열 (최소 2 자)을 (..+)
시도하고 여기서 lookahead는 여기서 캡처 된 내용을 반복하여 나머지 입력을 일치 시키려고 시도합니다. 이것이 가능하다면 입력에 제수가 1보다 크지 만 그보다 작다는 것을 의미합니다. 이 경우 부정적인 예측이 일치하지 않습니다. 프라임의 경우 그러한 가능성이 없으며 경기는 계속됩니다.
유일한 문제는이 lookahead도 수용 1
한다는 것입니다. 따라서 우리는 적어도 두 개의 문자를와 일치시켜이를 배제합니다 ..
.
답변
CJam, 4 바이트
qimp
CJam에는 기본 테스트를위한 기본 제공 연산자가 있습니다.
답변
HTML + CSS, 254 + n 최대 * 28 바이트
정규식을 사용하여 우선 순위를 확인할 수 있습니다. Mozilla @document
는 다음과 같이 정의됩니다.
@document [ <url> | url-prefix(<string>) | domain(<string>) | regexp(<string>) ]# {
<group-rule-body>
}
현재 URL을 기반으로 CSS를 통해 요소를 필터링합니다. 이것은 단일 패스이므로 두 단계를 수행해야합니다.
- 사용자로부터 입력을받습니다. 이 입력은 어떻게 든 현재 URL에 반영되어야합니다.
- 가능한 적은 코드로 사용자에게 답장하십시오.
1. 입력 받기
입력을 받고 URL로 전송하는 가장 짧은 방법은 GET
확인란 이있는 양식입니다. 정규 표현식의 경우 모양을 계산하기 위해 고유 한 문자열이 필요합니다.
그래서 우리는 이것으로 시작합니다 (61 바이트) :
<div id=q><p id=r>1<p id=s>0</div><form method=GET action=#q>
<p>
입력 한 숫자가 소수 (1)인지 아닌지 (0) 나타내는 두 개의 고유 한 s가 있습니다. 또한 양식과 동작을 정의합니다.
이름이 같은 n 개의 max 확인란이 이어집니다 (n max * 28 bytes).
<input type=checkbox name=i>
제출 요소 뒤에는 (34 바이트) :
<input name=d value=d type=submit>
2. 답변 표시
<p>
표시 할 (1 또는 0) 을 선택하려면 CSS (159 바이트)가 필요합니다 .
#q,#s,#q:target{display:none}#q:target{display:block}@-moz-document regexp(".*\\?((i=on&)?|(((i=on&)(i=on&)+?)\\4+))d=d#q$"){#s{display:block}#r{display:none}}