이 숫자가 소수입니까?


195

믿거 나 말거나, 우리는 간단한 원시성 테스트에 대한 코드 골프 도전을 아직받지 못했습니다 . 특히 "일반적인"언어의 경우 가장 흥미로운 과제는 아니지만 많은 언어에서 사소한 문제 일 수 있습니다.

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


입력을 음수로 사용할 수 있습니까? 여기에서 abs (input)는 테스트중인 숫자입니다.
Stan Strum

아니요, 입력은 양의 정수입니다.
Dennis

1
@LyndonWhite 이것은 원시 테스트의 카탈로그 (예 : "Hello, World!" )를위한 것이기 때문에 통일 된 제출 형식 이 바람직해 보였습니다. 후회하는 것은이 도전에 대한 두 가지 결정 중 하나이며, 다른 하나는 결정 론적 우선 성 테스트 만 허용하는 것입니다.
Dennis

1
@Shaggy 메타에 대한 질문처럼 보입니다.
데니스

1
네, 제가 생각한 것입니다. 나는 그것이 당신의 도전 인 것을보고 명예를하도록하겠습니다.
얽히고 설킨

답변:


225

안녕, 세상! , 13

hello, world!

83
당신은 같은나요 다만 ,이 언어를 만들 단지 이 제출? ;)
ETH 프로덕션

41
@ETHproductions 최근 커밋이 10 일 전에 이루어진 것 같습니다.
Geobits

39
나는 언어를 어느 곳에서나 연결하기 전에 약간 더 나은 형태로 만들고 싶었지만,이 도전 과제는 게시되었고 저항 할 수 없었다.
histocrat

31
나는 1의 입력에 매달려있는 것이 올바른 기능이라고 거의 말할 것입니다.
iamnotmaynard

21
이것에 대한 가장 좋은 부분은 프로그램이 내장 된 것이 아니라 각 캐릭터가 올바른 결과를 얻는 데 고유 한 역할을한다는 것입니다.
ETHproductions

157

헥사 고니 , 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를 실행 중이고 @의 맨 위로 반복됩니다.

   . . . .
  . . @ . .
 . . . . . >
. . . . . ! .
 . . . . . .
  . . . . .
   . . . .

61
이런 쓰레기, 그것은 인상적인 첫 번째 게시물입니다. :) 나는 현상금을 지금 당장 드리겠습니다 (당신의 대답에 더 많은 관심을 끌기 위해 7 일 안에 상을 수여 할 것입니다). PPCG에 오신 것을 환영합니다!
마틴 엔더

35
좋은 답변입니다! " 이 코드의 읽을 수있는 버전은 +1 입니다 : <...> ":-)
agtoever

68

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를 움직일 때 중요 함). 다음은 코드의 첫 번째 비트입니다.

)}?}=&{

)에지 A1계승의 기준으로 증가시킵니다 . }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는 , =공통 정점을 향하도록 다시 역전. *두 이웃, 즉 모서리 BC를 곱하고 결과를 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에 대해 두 가지 더 알아야합니다.

  1. 가장자리가 감 깁니다. IP가 육각형의 모서리에 닿으면 반대쪽 모서리로 이동합니다. IP가 코너를 똑바로 칠 때 모호하므로 모퉁이를 타격하는 것도 브랜치 역할을합니다. 현재 값이 양수이면 IP가 그리드 가장자리로 오른쪽으로 이동하고, 그렇지 않으면 왼쪽으로 이동합니다.
  2. 실제로 6 개의 IP가 있습니다. 그들 각각은 다른 모서리에서 시작하여 시계 방향으로 가장자리를 따라 움직입니다. 한 번에 하나만 활성화되므로 다른 5 개의 IP를 원하지 않으면 무시해도됩니다. 을 사용하여 다음 IP로 (시계 방향으로) ]이전 IP로 전환 할 수 있습니다 [. (으로 특정 항목을 선택할 수도 #있지만 다른 시간입니다.)

여기에는 몇 가지 새로운 명령이 있습니다. \그리고 /같은 미러 |이며 ~현재 값에을 곱합니다 -1.

그러면 ungolfed 버전은 어떻게 골프 버전으로 변환됩니까? 선형 설정 코드 )}?}=&{및 기본 루프 구조는 다음에서 찾을 수 있습니다.

        ) } ? } .  ->
       . . . . . .
      . . . . . . .
     . . . . . . . .
->  . = & { . < . . .
     . . . . . > ( <
      . . . . . . .
       . . . . . .
        . . . . .

이제 루프 바디가 가장자리를 몇 차례 교차하지만 가장 중요한 것은 실제 계산이 이전 IP (왼쪽 코너에서 시작하여 북동쪽으로 이동)로 전달됩니다.

        ) . . . .
       = . . . ] .
      } = . . } . .
     ~ . / . * . . .
    . . . . . . . . .
     . . . = . > ( <
      . . } . = . .
       . & . \ [ .
        . . . . .

지점을 남동쪽으로 튀어 =오른 후 IP는 가장자리를 따라 왼쪽 상단 모서리 의 두 개 (함께는 작동하지 않음)로 랩핑 한 다음을 튕 깁니다 /. 는 ~이후의 반복에 대한 중요 현재 값의 부호를 반전시킵니다. IP는 다시 같은 가장자리를 감싸고 [제어권이 다른 IP로 넘어가는 지점에 도달합니다.

이것은 이제 ~}=)&}=*}부정을 취소 한 다음 ungolfed 루프 본문 (마이너스 =)을 실행합니다 . 마지막으로 ]어느 손이 원래의 IP로 제어되는지 확인합니다. (다음 번에이 IP를 실행하면 중단 된 지점부터 시작하여 먼저 모퉁이에 도달합니다. IP가 북서쪽 가장자리로 되돌아 가려면 현재 값이 음수 여야합니다. 남동쪽 대신.)

원래의 IP 제어를 재개되면,이 튕겨 \나머지 실행 =하고 안타 >다음 루프 반복에 피드.

이제 정말 미친 부분 : 루프가 종료되면 어떻게됩니까?

        ) . . . .
       . ( . . ] =
      . . ' . } . }
     . . . % * . . &
    . . . . . . . . .
     . . . = | . . <
      . . } ! . . .
       . & @ . . .
        . . . . .

IP는 북동쪽으로 이동 <하고 북동 대각선으로 둘러싸입니다. 따라서 루프 본문 ( &}=*}]) 과 동일한 실행 경로로 끝납니다 . 적어도 현재 다른 코드를 추가하면 =}( }=}이와 같기 때문에 ) 이 시점에서 실행하려는 코드이기 때문에 실제로 매우 멋집니다 {. 그러나 이것이 어떻게 실제로 이전 루프로 다시 들어 가지 않습니까? 때문에 ]지금 남쪽에서 서쪽으로 이동, 오른쪽 상단에있는 시작 (지금까지 사용되지 않은) IP를 다음 IP 변경. 거기에서 IP는 가장자리를 따라 계속되고 왼쪽 상단 모서리로 감싸고 대각선 아래로 이동하고 튀어 나와 마지막 비트의 선형 코드를 실행하는 동안 |종료됩니다 @.

=}&)('%!@

( )(물론 (이것은 당연한 일 )입니다. 이미 추가 했기 때문에 추가해야 했습니다.)

휴 ... 무슨 엉망 ...


좋은! 이게 얼마나 새로운가요? 또한, 당신은 당신이 안정적인 릴리스를 얻을 때마다 esolangs 페이지를 만들 수도 있습니다
mbomb007

18
@ mbomb007 나는 이틀 전에 언어를 구현했고 그 전에 이틀 또는 삼일에 걸쳐 언어를 설계했다. 그리고 예, 확실히 esolangs 페이지를 추가 할 것이지만 스펙은 아직 100 % 안정적이지 않다고 생각합니다 (예 : 아직 할당되지 않은 명령이 3 개 있습니다). 더 안정적이라고 생각되면 esolang과 메타 포스트에 추가하겠습니다.
Martin Ender

확장 된 16 진수 아래에서 가장 왼쪽 모서리 ( 1)로 줄 바꿈됩니다 . 거기서 무슨 1소리 야?
mbomb007

@ mbomb007 수정되었습니다. )될하는 데 사용 1.
Martin Ender

5
작동 방식에 대한 설명에서 세부 수준에 +1합니다. 더 많은 사람들이 더 많은 사람들이 더 많은 언어를 사용할 수 있다는 예를
들었다면

66

Pyth, 4 바이트

}QPQ

인쇄 True또는 False.


12
나는 이것이 오래되었다는 것을 알고 있지만 이제는 P_Q와 1 바이트를 절약 할 수 있습니다.
drobilc

14
이제 가능합니다P_
Blue

3
@drobilc 함수가 인수를 기대할 때 EOF로 Q를 줄일 수 있습니다. 입력을 사용합니다
Stan Strum

55

레티 나 , 16 바이트

^(?!(..+)\1+$)..

온라인으로 사용해보십시오!

고전으로 시작합시다 : 정규식으로 소수를 감지하십시오 . 입력 가능한 반복 문자를 사용하여 단항으로 입력해야합니다 . 테스트 스위트에는 편의상 10 진수에서 단항으로의 변환이 포함됩니다.

단일 행으로 구성된 Retina 프로그램은 해당 행을 정규식으로 취급하고 입력에서 찾은 일치 수를 인쇄합니다.이 숫자는 0복합 숫자 및 1소수입니다.

lookahead는 입력이 합성되지 않도록합니다. 역 추적은에 대해 가능한 모든 하위 문자열 (최소 2 자)을 (..+)시도하고 여기서 lookahead는 여기서 캡처 된 내용을 반복하여 나머지 입력을 일치 시키려고 시도합니다. 이것이 가능하다면 입력에 제수가 1보다 크지 만 그보다 작다는 것을 의미합니다. 이 경우 부정적인 예측이 일치하지 않습니다. 프라임의 경우 그러한 가능성이 없으며 경기는 계속됩니다.

유일한 문제는이 lookahead도 수용 1한다는 것입니다. 따라서 우리는 적어도 두 개의 문자를와 일치시켜이를 배제합니다 ...


소수는 정규 언어를 형성하지 않기 때문에 실제로는 불규칙한 표현입니다.
PyRulez

@PyRulez 대부분의 실제 정규식 풍미는 이론적 인 정규 표현식 개념보다 훨씬 강력합니다. 그래도 문구를 개선했습니다.
Martin Ender 2016 년

1
오픈에서 가장 강력한 "정규식"엔진은 이제 선형 경계 오토마타와 동일한 인식력을 갖습니다. 표준 이슈 정규 표현식, 패턴 재귀, 무제한 룩 헤드 및 무제한 룩 베어는 컨텍스트에 민감한 파싱에 필요한 모든 것 (역 참조 및 일반적으로 효율적인 파싱을 복잡하게 만드는 데 도움이 됨). 정규식에 코드를 포함 할 수있는 엔진을 시작하지 마십시오.
eaglgenes101

52

CJam, 4 바이트

qimp

CJam에는 기본 테스트를위한 기본 제공 연산자가 있습니다.


18
다른 방법 :limp
SP3000

43
pimp내 잼.
flawr

12
pimp객관적으로 더 포주
MickLH

1
당신은 또한 할 수 있습니다l~mp
암소 ck

12
@Cyoce q는 입력 행을 읽고 i이를 정수로 구문 분석 mp하며 내장되어 있습니다. "고급"사람 시작 : CJam는 두 문자 내장 기능의 두 그룹이 e하고 "수학"사람은 시작m
피터 테일러

47

HTML + CSS, 254 + n 최대 * 28 바이트

정규식을 사용하여 우선 순위를 확인할 수 있습니다. Mozilla @document는 다음과 같이 정의됩니다.

@document [ <url> | url-prefix(<string>) | domain(<string>) | regexp(<string>) ]# {
  <group-rule-body>
}

현재 URL을 기반으로 CSS를 통해 요소를 필터링합니다. 이것은 단일 패스이므로 두 단계를 수행해야합니다.

  1. 사용자로부터 입력을받습니다. 이 입력은 어떻게 든 현재 URL에 반영되어야합니다.
  2. 가능한 적은 코드로 사용자에게 답장하십시오.

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}}

»codepen.io에서 사용해보십시오 (firefox 전용)


12
+1 : 이것은 HTML에서 가장 좋아하는 악용이며 코드 골프를 좋아하게 만드는 것들입니다.
cat

이것은 확실히 흥미롭지 만, 이것이이 도전의 규칙을 만족하는지 확실하지 않습니다. 특히, 이론적으로는 임의의 큰 정수에 대해 작동 해야하는 귀하의 알고리즘 [...]을 준수한다고 생각하지 않습니다 . 입력 필드 값에 정규식을 사용할 수 없습니까?
Dennis

@ 데니스 어쩌면. 아마조차. 그러나 그것은 당신이 언급 한 문제를 해결하지 못할 것입니다. 나는 여기서 가장 논란의 여지가 있기 때문에 경쟁이 아닌 항목으로 여기에 둡니다.
mınxomaτ

왜 안돼? 입력 필드에 단항 숫자가 있으면 코드는 더 이상 최대 숫자에 의존하지 않습니다.
Dennis

4
흠, 나는 이것에 대해 조금 더 생각했고, 단지 x 개의 체크 박스와 y 비트 숫자 만있는 인터프리터를 갖는 것에는 차이가 없습니다. 내 이전 의견을 무시하십시오.
Dennis


40

헥사 고니 , 28 바이트

Etoplay 가이 질문대해 저를 절대로 비난 한 이후로 , 나는 그의 유일한 대답 을 능가해야한다고 느꼈습니다 .

?\.">"!*+{&'=<\%(><.*.'(@>'/

온라인으로 사용해보십시오!

마틴은 자신에 그랬던 것처럼 나는 윌슨의 정리를 사용하여 대답 을 감안할 때 : n, I 출력(n-1!)² mod n

여기에 프로그램이 전개되었습니다.

   ? \ . "
  > " ! * +
 { & ' = < \
% ( > < . * .
 ' ( @ > ' /
  . . . . .
   . . . .

다음은 읽을 수있는 버전입니다.

매우 읽기 쉬운

설명:

이 프로그램에는 초기화 , 팩토리얼출력의 세 가지 주요 단계가 있습니다.

Hexagony의 메모리 모델은 무한 육각형 격자입니다. 이 다이어그램에 표시된 것처럼 5 개의 메모리 위치를 사용하고 있습니다.

기억

이 위치 (및 그 안에 저장된 정수)를 해당 다이어그램의 레이블로 참조합니다.

초기화 :

초기화

명령 포인터 ( IP )는 왼쪽 상단에서 시작하여 동쪽으로 이동합니다. 메모리 포인터 ( MP )는 IN 에서 시작합니다 .

먼저 ?입력에서 숫자를 읽고 IN에 저장합니다 . IP는 에 의해 반사 된 파란색 경로에 남아 \. 순서 "&(MP를 앞뒤로 ( A로 ) 이동시키고 , IN 에서 A로 값을 복사 후 감소시킵니다.

IP는 다음 육각형의 일측을 종료하고 (그린 경로 상) 반대편 다시 들어간다. 이것은 실행 '+움직임되는 MP를B 이상에서 무엇 복사 . IP 를 West로 리디렉션합니다 .<

계승:

특정 방식으로 계승을 계산하므로 쉽게 구할 수 있습니다. 다음과 같이 BCn-1! 에 모두 저장 합니다.

계승

명령 포인터는 파란색 경로에서 시작하여 동쪽으로 향합니다.

='MP 의 방향을 반대로 바꾸고 C로 뒤로 이동합니다 . 이것은 나중에 도움이되는 곳 과 {=같지만 동일합니다 =.

&{A 에서 C로 값을 복사 한 다음 MPA로 다시 이동시킵니다 . IP는 다음, 빨간색 경로에 도달 타격하기 전에, 아무것도하지 않고, 녹색 경로를 따라 \주황색 경로에 가고.

함께 (>, 우리는 감소 하고 리디렉션 IP 동쪽. 여기에 지점이 <있습니다. 양수 A의 경우 주황색 경로를 따라 계속 진행합니다. 그렇지 않으면 IP 가 북동쪽으로 연결됩니다.

'*MPB 로 이동시키고 A * CB에 저장 합니다. 이것은 (n-1)*(n-2)초기 입력이 있었던 곳 n입니다. IP는 다시 초기 루프로 진입하고 감분 및 승산까지 계속 도달 . (계산 )0n-1!

NB는 : 다음의 루프에서 &의 저장 값 BC를 같이, C가 지금에 저장된 양의 값을 갖는다. 이것은 계승 계산에 중요합니다.

산출:

산출

A가 도달 0. 지점은 대신 파란색 경로를 따라 IP 를 지정합니다.

=*반전 MP 저장을 값 B의 *의 C 에서 . 그런 다음 IP 가 육각형을 빠져 나와 녹색 경로에 다시 입력됩니다. 실행 "%. MPOUT으로 옮기고 A mod IN 또는을 계산 (n-1!)² mod n합니다.

다음 {"은 서로 상쇄되므로 비 작동으로 작동합니다. !최종 출력을 인쇄하고 *+'(종료 전에 실행됩니다 @.

실행 후 (입력으로 5) 메모리는 다음과 같습니다.

메모리 2

제어 흐름의 아름다운 이미지는 Timwi의 Hexagony Coloror를 사용하여 만들었습니다 .

PC에서 할 수 없었던 모든 이미지를 생성 해 주신 Martin Ender 에게 감사합니다 .


이 메모리 다이어그램에 무엇을 사용하고 있습니까? Esoteric IDE를 보았지만 실행할 수 없었습니다 ...
NieDzejkob

@NieDzejkob Martin에게 채팅을 요청하는 것이 좋습니다. 왜냐하면 그는 어쨌든 나를 위해 만들어 주었기 때문입니다.
H.PWiz

@NieDzejkob 네, 메모리 다이어그램을 EsoIDE에서 내보낼 수 있습니다. chat.stackexchange.com/rooms/27364/… 이것에 대해 좀 더 이야기하고 싶다면.
Martin Ender

33

모닝 턴 초승달 , 2448 바이트

우리는 런던에 돌아왔다 !

Take Northern Line to Bank
Take Circle Line to Bank
Take District Line to Parsons Green
Take District Line to Bank
Take Circle Line to Hammersmith
Take District Line to Upney
Take District Line to Hammersmith
Take Circle Line to Victoria
Take Victoria Line to Seven Sisters
Take Victoria Line to Victoria
Take Circle Line to Victoria
Take Circle Line to Bank
Take Circle Line to Hammersmith
Take Circle Line to Cannon Street
Take Circle Line to Hammersmith
Take Circle Line to Cannon Street
Take Circle Line to Bank
Take Circle Line to Hammersmith
Take Circle Line to Aldgate
Take Circle Line to Aldgate
Take Metropolitan Line to Chalfont & Latimer
Take Metropolitan Line to Aldgate
Take Circle Line to Hammersmith
Take District Line to Upminster
Take District Line to Hammersmith
Take Circle Line to Notting Hill Gate
Take Circle Line to Hammersmith
Take Circle Line to Notting Hill Gate
Take District Line to Upminster
Take District Line to Bank
Take Circle Line to Victoria
Take Circle Line to Temple
Take Circle Line to Aldgate
Take Circle Line to Aldgate
Take Metropolitan Line to Chalfont & Latimer
Take Metropolitan Line to Pinner
Take Metropolitan Line to Chalfont & Latimer
Take Metropolitan Line to Pinner
Take Metropolitan Line to Chalfont & Latimer
Take Metropolitan Line to Pinner
Take Metropolitan Line to Aldgate
Take Circle Line to Hammersmith
Take District Line to Upminster
Take District Line to Victoria
Take Circle Line to Aldgate
Take Circle Line to Victoria
Take Circle Line to Victoria
Take District Line to Upminster
Take District Line to Embankment
Take Circle Line to Embankment
Take Northern Line to Angel
Take Northern Line to Moorgate
Take Metropolitan Line to Chalfont & Latimer
Take Metropolitan Line to Aldgate
Take Circle Line to Aldgate
Take Circle Line to Cannon Street
Take District Line to Upney
Take District Line to Cannon Street
Take District Line to Acton Town
Take District Line to Acton Town
Take Piccadilly Line to Russell Square
Take Piccadilly Line to Hammersmith
Take Piccadilly Line to Russell Square
Take Piccadilly Line to Ruislip
Take Piccadilly Line to Ruislip
Take Metropolitan Line to Preston Road
Take Metropolitan Line to Aldgate
Take Circle Line to Aldgate
Take Circle Line to Cannon Street
Take Circle Line to Aldgate
Take Circle Line to Aldgate
Take Metropolitan Line to Preston Road
Take Metropolitan Line to Moorgate
Take Circle Line to Moorgate
Take Northern Line to Mornington Crescent

Timwi는 제어 흐름 방송국 구현하기가 너무 친절했다 TempleAngel밀교 IDE을 뿐만 아니라 언어 사양에 입력 및 정수 분석을 추가합니다.

이번에는 "Hello, World!"보다 더 나은 골프를했을 것입니다. 이번에는 두 스테이션 사이에서 가장 짧은 경로를 찾을 수 있도록 CJam 스크립트를 작성했기 때문입니다. 당신이 그것을 사용하고 싶다면 (누군가 원하는지 모르겠지만 ...) 온라인 통역사를 사용할 수 있습니다 . 이 코드를 붙여 넣습니다.

"Mornington Crescent"
"Cannon Street"
]qN/{'[/0=,}$:Q;{Q{1$#!}=\;_oNo'[/1>{']/0="[]"\*}%}%:R;NoQ{R\f{f{\#)}:+}:*},N*

여기에서 처음 두 줄은 확인하려는 스테이션입니다. 또한, 페이스트의 내용 이 페이스트 빈을 입력 창에.

출력은 두 스테이션에서 사용 가능한 라인을 표시 한 다음 스테이션 이름의 길이에 따라 두 스테이션을 연결하는 모든 스테이션의 목록을 표시합니다. 짧은 노선을 허용하거나 역 (은행이나 사원과 같은)이 특수하여 (예 : 은행이나 사원 등) 더 긴 이름을 사용하는 것이 더 낫기 때문에 모든 것을 표시합니다. 두 개의 스테이션이 하나의 다른 스테이션으로 연결되지 않은 경우가 있습니다 (특히, 대도시 및 지구 노선은 절대 교차하지 않습니다).이 경우 다른 것을 알아 내야합니다. ;)

실제 MC 코드는 MC가 곱셈, 나눗셈 및 모듈로를 가지고 있기 때문에 다른 답변과 마찬가지로 제곱 요인 접근법을 기반으로합니다. 또한 단일 루프가 편리하다는 것을 알았습니다.

한 가지 문제는 루프가 do-while 루프이며 감소 및 증가가 비싸므로 쉽게 계산할 수 없다는 것입니다 (n-1)!(for n > 0). 대신, 나는 컴퓨팅 n!하고 n마지막에 나눕니다 . 더 나은 해결책이 있다고 확신합니다.

이 글을 쓰기 시작했을 때 -1해머 스미스에 보관 하는 것이 좋은 생각이어서 더 저렴하게 줄일 수 있다고 생각했지만 결국이 비용보다 더 많은 비용이들 수 있습니다. 내가 이것을 다시하는 인내심을 발견하면, -1대신 Upminster 에서 주변을 유지하려고 노력할 수 있으므로 Hammersmith를 사용하여 더 유용한 것을 사용할 수 있습니다.


10
런던 튜링이 완료 되었습니까?
Rohan Jhunjhunwala

1
@RohanJhunjhunwala 아마
마틴 엔더

와! 나는 잘 생각하는 질문을 보는 것을 좋아합니다. 저는 특히 프로그램을 작성하기 위해 프로그램을 작성해야하는 질문을 보는 것을 좋아합니다.
Rohan Jhunjhunwala

27

Brachylog (V2), 1 바이트

온라인으로 사용해보십시오!

Brachylog (V1), 2 바이트

#피

이것은 내장 술어를 사용하여 #p - Prime입력을 소수로 제한합니다.

Brachylog는 Prolog의 Code Golf 버전을 만들려고 노력하고 있는데, 이는 역 추적과 통일을 사용하는 선언적인 코드 골프 언어입니다.

내장되지 않은 대체 솔루션 : 14 바이트

ybbrb'(e:?r%0)

위의 코드는 다음과 같습니다.

y            The list [0, …, Input]
bbrb         The list [2, …, Input - 1]
'(           True if what's in the parentheses cannot be proven; else false
     e           Take an element from the list [2, …, Input - 1]
     :?r%0       The remainder of the division of the Input but that element is 0
)

1
구문이 바이트보다 짧으므로 Brachylog 2 버전의 게시물을 게시물로 편집 할 수도 있습니다.

1
@ ais523 맞습니다.
페이탈 라이즈

Brachylog 2의 답변이 도전 과제를 게시 한 후입니까?
Scott Milner

1
@ScottMilner 네, 그러나 이것은이 도전에서 명백히 허용됩니다 : "우리의 일반적인 규칙과 달리,이 도전보다 새로운 언어라도 언어 (또는 언어 버전)를 자유롭게 사용하십시오"
Fatalize

26

하스켈, 49 바이트

사용 윌슨의 정리에 배타적 부정의 추론을 :

main=do n<-readLn;print$mod(product[1..n-1]^2)n>0

더 짧지 main=interact$\n-> ...않습니까?
John Dvorak

2
직관적으로, 아니! interact...read어딘가에 필요할 것이므로 생각보다 길어집니다 readLn. do특히 대안이 람다 인 경우 표기법이 예상보다 간결 할 수 있습니다.
Lynn

24

미로 , 29 바이트

1
?
:
}  +{%!@
(:'(
 } {
 :**

STDIN에서 정수를 읽고 출력 ((n-1)!)^2 mod n합니다. 윌슨의 정리 는이 도전에 매우 유용합니다.

이 프로그램은 왼쪽 상단에서 시작 1하여 스택 상단에 10을 곱하고 1을 더합니다. 이것은 큰 숫자를 만드는 미로의 방법이지만 미로의 스택이 0으로 채워지기 때문에 최종 효과는 마치 방금 1을 눌렀습니다.

?그런 다음 nSTDIN에서 읽고 :복제합니다. 모듈로 끝에 사용될 보조 스택으로 }이동 n합니다. (그런 다음 감소 n하고, 우리는 제곱 계승 계산을 시작할 준비가되었습니다.

우리의 두 번째 :(중복)는 교차점에 있으며 여기서 Labyrinth의 제어 흐름 기능이 작동합니다. 명령이 실행 된 후 정션에서 스택의 상단이 양수이면 오른쪽으로 돌리고, 음수이면 왼쪽으로, 0이면 직진합니다. 돌리려고하지만 벽에 부딪 치면, 미궁은 대신 다른 방향으로 돌게합니다.

들어 n = 1스택의 상단이되기 때문에, n감소, 또는 0, 우리는 직진. 우리는 그 다음 어떤 조합 때린 '또 다른 감소 다음 (에 우리를 넣습니다 -1. 이것은 음수이므로 +더하기 ( -1 + 0 = -1)를 실행 하여 보조 스택에서 기본 및 모듈로 ( ) 로 다시 {이동하려면 왼쪽으로 돌립니다 . 그런 다음로 출력 하고로 종료합니다 .n%-1 % 1 = 0!@

n > 1위해 두 번째 :로 우회전합니다. 그런 다음 }복사 된 루프 카운터를 보조 스택으로 이동 한 다음 카운터를 다시 이동 하고 감소 시키기 전에 복제 :및 곱하기 두 번 반복 합니다. 우리가 여전히 긍정적이라면 우리는 우회전을 시도하지만 할 수 없으므로, Labyrinth는 대신 좌회전하여 루프를 계속합니다. 그렇지 않으면 스택의 맨 위에 루프 카운터가 0으로 감소하여 계산에 추가됩니다 . 마지막으로 modulo , output 및 terminate 로 되돌아갑니다 .**{(+((n-1)!)^2n{%!@

나는 '그것이 no-op 라고 말 했지만 디버깅에도 사용할 수 있습니다. 와 실행 -d때마다 (가) 스택의 상태를보기 위해 플래그 '를 통해 전달됩니다!


2
계승을 제곱하는 것은 정말 멋진 트릭입니다 :)
Lynn

@Mauris 감사합니다! 나는 그것이 정당한 곳에서 신용을 주어야한다-나는 xnor가 여기에서
Sp3000

5
예, 첫 번째 미로의 대답은 저에 의해 쓰여지지 않았습니다! :)
Martin Ender

24

배쉬 + GNU 유틸리티, 16

  • @Dennis 덕분에 4 바이트 절약

  • @Lekensteyn 덕분에 2 바이트 절약

factor|awk NF==2

입력은 STDIN에서 가져온 한 줄입니다. 출력은 잘못된 문자열의 경우 빈 문자열이고 비어있는 문자열의 경우 진실입니다. 예 :

$ ./pr.sh <<< 1
$ ./pr.sh <<< 2
2: 2
$ ./pr.sh <<< 3
3: 3
$ ./pr.sh <<< 4
$

2
시원하고 다른 coreutil에 대해 배웠습니다. 필드 수를 세어 두 문자를 제거 할 수 있습니다.factor|awk NF==2
Lekensteyn

@Lekensteyn-감사합니다-어떤 이유로 든 나는 전에 당신의 의견을 놓쳤습니다 :)
Digital Trauma

AWK없이 더 길고 비슷한 것을 게시하려고했습니다. 잘 했어요
David Conrad

21

자바, 126121 바이트

점수 판에 대한 Java 답변이 필요하다고 생각합니다. 그래서 간단한 시험 분할 루프가 있습니다.

class P{public static void main(String[]a){int i=2,n=Short.valueOf(a[0]);for(;i<n;)n=n%i++<1?0:n;System.out.print(n>1);}}

Java의 경우와 마찬가지로, "전체 프로그램"요구 사항은 대부분 main서명 으로 인해 함수 인 경우보다 훨씬 더 크게 만듭니다 .

확장 된 형태로 :

class P{
    public static void main(String[]a){
        int i=2,n=Short.valueOf(a[0]);
        for(;i<n;)
            n=n%i++<1?0:n;
        System.out.print(n>1);
    }
}

편집 : 의견에서 Peter가 수정하고 regolfed. 감사!


버기 : 그것은 1최고 라고보고합니다 . 그렇지 않으면 제거 p하고 다음과 같이 말 함으로써 4 문자 절약이 가능합니다for(;i<n;)n=n%i++<1?0:n;System.out.print(n>0);
Peter Taylor

2
OTOH class P{public static void main(String[]a){int i=2,n=Short.valueOf(a[0]);for(;i<n;)n=n%i++<1?0:n;System.out.print(n>1);}}작품
Peter Taylor

6
3 행을 'long i = 2, n = Long.valueOf (a [0]);`으로 변경하면 길이가 변경되지 않고 유효한 입력 범위가 더 넓어집니다.
James K Polk

4
대신 .valueOf당신은 사용할 수 있습니다 new에서와 같이 new Short(a[0]), 또는 new Long(a[0])조금 짧은이다.
ECS

3
인터페이스를 사용하고 public수정자를 삭제하여 4 바이트를 절약 할 수 있습니다 .
RamenChef

18

뇌 플랙 , 112 108 바이트

({}[()]){((({})())<>){{}<>(({}<(({}[()])()<>)>)<>)<>{({}[()]<({}[()]<({}())>)>{(<()>)}{})}{}{}}}<>{{}}([]{})

온라인으로 사용해보십시오!

작동 원리

처음에는 첫 번째 스택에 양의 정수 n 이 포함 되고 두 번째 스택은 비어 있습니다.

다음과 같이 n 을 줄임으로써 시작 합니다.

(
  {}      Pop n.
  [()]    Yield -1.
)       Push n - 1.

n = 1

경우 N = 1 제로 while 루프 인

{
  ((({})())<>)
  {
    {}<>(({}<(({}[()])()<>)>)<>)<>{({}[()]<({}[()]<({}())>)>{(<()>)}{})}{}{}
  }
}

완전히 건너 뜁니다. 마지막으로 나머지 코드가 실행됩니다.

<>    Switch to the second stack (empty).
{}    Pop one of the infinite zeroes at the bottom.
{<>}  Switch stacks while the top on the active stack is non-zero. Does nothing.
(
  []    Get the length of the active stack (0).
  {}    Pop another zero.
)     Push 0 + 0 = 0.

n> 1

n-1 이 0이 아닌 경우 n = 1을 건너 뛰는 루프를 입력합니다 . "실제"루프가 아닙니다. 코드는 한 번만 실행됩니다. 다음을 달성합니다.

{                   While the top of the active stack is non-zero:
  (
    (
      ({})                Pop and push n - 1.
      ()                  Yield 1.
    )                   Push n - 1 + 1 = n.
    <>                  Switch to the second stack. Yields 0.
  )                   Push n + 0 = n.
                      We now have n and k = n - 1 on the first stack, and n on
                      the second one. The setup stage is complete and we start
                      employing trial division to determine n's primality.
  {                   While the top of the second stack is non-zero:
    {}                  Pop n (first run) or the last modulus (subsequent runs),
                        leaving the second stack empty.
    <>                  Switch to the first stack.
    (
      (
        {}                  Pop n from the first stack.
        <
          (
            (
              {}              Pop k (initially n - 1) from the first stack.
              [()]            Yield -1.
            )               Push k - 1 to the first stack.
            ()              Yield 1.
            <>              Switch to the second stack.
          )               Push k - 1 + 1 = k on the second stack.
        >               Yield 0.
      )               Push n + 0 = n on the second stack.
      <>              Switch to the first stack.
    )               Push n on the first stack.
    <>              Switch to the second stack, which contains n and k.
                    The first stack contains n and k - 1, so it is ready for
                    the next iteration.
    {({}[()]<({}[()]<({}())>)>{(<()>)}{})}{}{}  Compute and push n % k.
  }               Stop if n % k = 0.
}               Ditto.

n % k내 분 산성 시험 답 에서 42 바이트 모듈러스 알고리즘을 사용하여 계산됩니다 .

마지막으로, 결과를 해석하여 n 의 우선 순위 를 결정 합니다.

<>    Switch to the first stack, which contains n and k - 1, where k is the
      largest integer that is smaller than n and divides n evenly.
      If (and only if) n > 1 is prime, k = 1 and (thus) k - 1 = 0.
{     While the top of the first stack is non-zero:
  {}    Pop it.
}     This pops n if n is prime, n and k - 1 if n is composite.
(
  []    Yield the height h of the stack. h = 1 iff n is prime).
  {}    Pop 0.
)     Push h + 0 = h.

2
맨 위에있는 1은 충분하므로 스택에서 마지막 0을 표시 할 필요는 없습니다. 마지막을 제거하여 두 바이트를 절약 할 수 있습니다 {}.
Steven H.

1
흠, 찢어 졌어 한편, 문제가 있다고 출력 단독 truthy falsy 값 또는 구성되어야 하고 1 0있다 값. 반면에 우리는 언어가 진실하거나 허위로 간주하고 여러 스택 항목이 Brain-Flak이 배열에 가장 가까운 배열 인 한 배열을 받아들입니다. 이것을 메타로 가져갈 가치가 있습니다.
Dennis

나는 Brain-Flak의 제작자에게 1 0진실 하다는 것을 확인 했습니다. chat.stackexchange.com/transcript/message/32746241#32746241
Steven H.


17

R, 37 29 바이트

n=scan();cat(sum(!n%%1:n)==2)

시험 분할을 사용합니다. scan()STDIN에서 정수를 읽고 cat()STDOUT에 씁니다.

n정수 1 ~ n모듈로 구성된 길이의 벡터를 생성합니다 n. ( !) 를 무효화하여 각각 0인지 여부를 테스트합니다.이 값은 숫자가 0 일 때 참이고, 0보다 클 때 거짓을 반환합니다. 논리 벡터의 합은 참 요소의 수이며 소수에 대해서는 0이 아닌 유일한 계수는 1이고 n, 따라서 합은 2가 될 것으로 예상합니다.

flodel 덕분에 8 바이트를 절약했습니다!


함께 f=function(x)sum(!x%%1:x)==2사용하면 28 바이트에서 그것을 할 수 있습니다.
Mutador

2
@ AndréMuta이 과제를 위해서는 모든 제출물이 기능이 아닌 완전한 프로그램이어야합니다. 그래도 제안 해 주셔서 감사합니다.
Alex A.

17

TI-BASIC, 12 바이트

2=sum(not(fPart(Ans/randIntNoRep(1,Ans

꽤 직설적 인. randIntNoRep(1에서 모든 정수의 무작위 순열을 제공합니다 Ans.

이것은 규칙을 약간 구부립니다. TI-BASIC의 목록은 내가 해석 한 999 개의 요소로 제한되기 때문에

입력이 데이터 유형에 저장 될 수 있다고 가정

모든 데이터 유형이 입력을 수용한다고 가정 할 수 있음을 의미합니다. OP는이 해석에 동의합니다.

실제로 최대 10 ^ 12 정도 작동 하는 17 바이트 솔루션 :

2=Σ(not(fPart(Ans/A)),A,1,Ans

@toothbrush TI-BASIC은 토큰 화 된 언어이므로 여기의 모든 토큰은 1 바이트 randIntNoRep(입니다.
lirtosiast

+1 아, TL-BASIC을 본 적이 없습니다. 알려 주셔서 감사합니다
칫솔

1
하지만, 그것은 이다 그것은 조금 불공평하지 않습니다 ...? 1-4 바이트 (질문 ID) 만 필요한 골프 언어를 작성한 다음 매개 변수를 작성해야합니다. 이해하는 언어로 최고 답변을 선택하고 실행하고 (매개 변수를 전달 함) 결과를 반환합니다 ... 규칙을 위반하는지 궁금합니다. :-)
칫솔

@toothbrush TI-BASIC의 방어 : 통역사에게는 Pyth와 CJam의 한 문자 명령보다 불공평하며 TI-BASIC은 더 읽기 쉽습니다.
lirtosiast

1
참된. 거의 모든 다른 언어의 솔루션이 더 길기 때문에 이러한 종류의 언어를 싫어합니다. 최근 VB6으로 CJam을 이겼습니다 ! :-]
칫솔

15

PARI / GP, 21 바이트

print(isprime(input))

PARI / GP는 이런 종류의 것이기 때문에 엄청나게 큰 입력에 효과적입니다.


6
isprimeAPR-CL 원시성 증명을 수행하므로 입력이 매우 커질수록 속도가 약간 느려집니다. ispseudoprime(input)AES BPSW 가능한 프라임 테스트를 수행하며 100 자리 이상에서 훨씬 빠릅니다. 35 년 후에도 알려진 반례는 없습니다. 2002 년 이전의 Pari 2.1 이전 버전에서는 잘못된 결과를 쉽게 얻을 수있는 다른 방법을 사용하지만 아무도이를 사용하지 않아야합니다.
DanaJ

15

TI-BASIC, 24 바이트

TI-Basic 프로그램은 토큰 시스템을 사용하므로 카운트 문자는 프로그램의 실제 바이트 값을 반환하지 않습니다.

찬성 투표 토마스 콰의 대답은 , 그것은 우수하다.

:Prompt N
:2
:While N≠1 and fPart(N/Ans
:Ans+1
:End
:N=Ans

견본:

N=?1009
                         1
N=?17
                         1
N=?1008
                         0
N=?16
                         0

이제 0소수 가 아닌지 또는 그렇지 않은지를 반환 합니다 1.


3
제곱근은 실제로 프로그램을 수정하는 데 필요하지 않은 최적화입니까?
마틴 엔더

왜 2로 나누어야합니까?
Geobits

나는 항상 TI-BASIC 답변을 좋아합니다.
그랜트 밀러

15

스택 고양이 , 62 + 4 = 66 바이트

*(>:^]*(*>{<-!<:^>[:((-<)<(<!-)>>-_)_<<]>:]<]]}*<)]*(:)*=<*)>]

-ln명령 행 플래그 (따라서 +4 바이트) 로 실행해야합니다 . 0복합 번호 및 1소수를 인쇄 합니다 .

온라인으로 사용해보십시오!

나는 이것이 첫 번째 사소한 Stack Cats 프로그램이라고 생각합니다.

설명

빠른 스택 고양이 소개 :

  • Stack Cats는 무한 스택 테이프에서 작동하며 테이프 헤드는 현재 스택을 가리 킵니다. 모든 스택은 처음에 무한한 양의 0으로 채워집니다. 나는 일반적으로 내 말에서 이러한 0을 무시할 것이므로 "스택의 맨 아래"라고 말하면 0이 아닌 가장 낮은 값을 의미하고 "스택이 비어 있습니다"라고 말하면 0이 있음을 의미합니다.
  • 프로그램이 시작되기 전에 a -1가 초기 스택으로 푸시 된 다음 전체 입력이 맨 위에 푸시됩니다. 이 경우 -n플래그 로 인해 입력을 10 진 정수로 읽습니다.
  • 프로그램이 끝나면 현재 스택이 출력에 사용됩니다. -1하단에 a 가 있으면 무시됩니다. 다시 -n플래그 로 인해 스택의 값은 단순히 줄 바꿈으로 구분 된 10 진수로 인쇄됩니다.
  • Stack Cats는 가역적 인 프로그램 언어입니다. 모든 코드는 취소 할 수 있습니다 (Stack Cats없이 명시적인 기록을 추적하지 않음). 더 구체적으로 말하면, 코드 조각을 뒤집으려면 간단히 코드를 미러링하면됩니다 (예 : <<(\-_)됩니다) (_-/)>>. 이 설계 목표는 언어에 존재하는 연산자 및 제어 흐름 구성의 종류와 전역 메모리 상태에서 계산할 수있는 함수의 종류에 대해 상당히 엄격한 제한을 둡니다.
  • 무엇보다도 모든 Stack Cats 프로그램은 자체 대칭이어야합니다. 위의 소스 코드에는 해당되지 않습니다. 이것이 -l플래그의 목적입니다 : 중앙의 첫 번째 문자를 사용하여 코드를 내재적으로 왼쪽으로 미러링합니다. 따라서 실제 프로그램은 다음과 같습니다

    [<(*>=*(:)*[(>*{[[>[:<[>>_(_-<<(-!>)>(>-)):]<^:>!->}<*)*[^:<)*(>:^]*(*>{<-!<:^>[:((-<)<(<!-)>>-_)_<<]>:]<]]}*<)]*(:)*=<*)>]
    

전체 코드를 사용하여 효과적으로 프로그래밍하는 것은 매우 사소하고 직관적이지 않으며 인간이 어떻게 할 수 있는지 아직 알지 못했습니다. 우리는 더 간단한 작업을 위해 그러한 프로그램강요 했지만 그 근처에 손을 댈 수 없었습니다. 다행히 프로그램의 절반을 무시할 수있는 기본 패턴을 찾았습니다. 이것은 확실히 차선책이지만 Stack Cats에서 효과적으로 프로그래밍하는 유일한 방법입니다.

따라서이 답변에서 위 패턴의 템플릿은 다음과 같습니다 (실행 방법에 약간의 차이가 있습니다).

[<(...)*(...)>]

프로그램이 시작되면 스택 테이프는 다음과 같이 나타납니다 (입력의 4경우).

     4    
... -1 ...
     0
     ^

[이동 왼쪽으로 스택의 상단 (와 함께 테이프 헤드) - 우리는이 "밀어"호출합니다. 그리고 <테이프 헤드 만 움직입니다. 따라서 처음 두 명령 후에 다음과 같은 상황이 발생합니다.

...   4 -1 ...
    0 0  0
    ^

이제는 (...)조건부로 아주 쉽게 사용할 수있는 루프입니다. 루프는 현재 스택의 맨 위가 양수일 때만 입력되고 남아 있습니다. 현재 0이므로 프로그램의 전체 절반을 건너 뜁니다. 이제 중심 명령은 *입니다. 이것은 간단합니다 XOR 1. 즉, 스택 상단의 최하위 비트를 토글하며,이 경우에는를로 0변환합니다 1.

... 1 4 -1 ...
    0 0  0
    ^

이제 우리는 미러 이미지를 보게됩니다 (...). 이 시간은 스택의 상단은 긍정적이며, 우리는 코드를 입력하십시오. 괄호 안의 내용을 살펴보기 전에 끝에서 마무리하는 방법을 설명하겠습니다.이 블록의 끝에서 테이프 헤드가 다시 양수 값이되도록합니다. 루프는 단일 반복 후에 종료되며 간단히 선형 조건부로 사용됩니다.) 오른쪽 스택은 출력 보유하고 스택 오른쪽은 스택 보유합니다 -1. 이 경우 루프를 떠나 >출력 값으로 이동 한 다음 ]푸시 하여 출력 -1을위한 깨끗한 스택을 만듭니다.

그게 그거야. 이제 괄호 안에서 우리는 끝 부분의 이전 단락에서 설명한대로 설정을 유지하는 한 우선 순위를 확인하려는 모든 작업을 수행 할 수 있습니다 (이는 일부 밀기 및 테이프 헤드 이동으로 쉽게 수행 할 수 있음). 나는 먼저 윌슨 정리 문제를 해결하려고 시도했지만 실제로는 제곱 팩터 계산이 Stack Cats에서 상당히 비싸기 때문에 (최소한 짧은 길을 찾지 못했습니다) 100 바이트 이상이되었습니다. 그래서 대신 시험 분할을했는데 실제로 훨씬 더 단순 해졌습니다. 첫 번째 선형 비트를 보자.

>:^]

이미 두 가지 명령을 보았습니다. 또한 :현재 스택의 상위 2 개 값을 ^바꾸고 두 번째 값을 최상위 값으로 XOR합니다. 이렇게하면 :^빈 스택에서 값을 복제하는 공통 패턴 이 만들어 집니다 (값 위에 0을 가져온 다음 0을로 바꿉니다 0 XOR x = x). 이 후 테이프 섹션은 다음과 같습니다.

         4    
... 1 4 -1 ...
    0 0  0
         ^

내가 구현 한 시행 분할 알고리즘은 input 1에 대해 작동하지 않으므로이 경우 코드를 건너 뛰어야합니다. 를 사용 1하여 쉽게 0모든 것을 양수 값에 매핑 할 수 *있으므로 다음 과 같이하십시오.

*(*...)

그것은 우리가 켭니다 1으로 0, 우리가 실제로 얻을 경우 코드의 큰 부분을 건너 뛸 수 0있지만, 우리는 즉시 취소 내부에 *우리가 우리의 입력 값을 얻을 수 있도록. 괄호 끝에서 양수 값으로 끝나서 반복을 시작하지 않도록 다시 확인해야합니다. 조건부 안에서 우리는 하나의 스택을 오른쪽으로 움직 인 >다음 주요 시험 분할 루프를 시작합니다.

{<-!<:^>[:((-<)<(<!-)>>-_)_<<]>:]<]]}

중괄호 (괄호와 반대)는 다른 종류의 루프를 정의합니다. 반복 루프이므로 항상 하나 이상의 반복에 대해 실행됩니다. 다른 차이점은 종료 조건입니다. 루프에 들어갈 때 Stack Cat은 현재 스택의 최상위 값 ( 0이 경우)을 기억합니다 . 그런 다음 반복이 끝날 때 동일한 값이 다시 나타날 때까지 루프가 실행됩니다. 이것은 우리에게 편리합니다. 각 반복에서 우리는 단순히 다음 잠재적 제수의 나머지를 계산 하고이 스택으로 이동하여 루프를 시작합니다. 제수를 찾으면 나머지가 0있고 루프가 멈 춥니 다. 우리는 제수를 시작 n-1해서로 줄이려고합니다 1. 그것은 a) 우리가 도달하면 이것이 끝날 것이라는 것을 알고 있습니다.1마지막으로 b) 그런 다음 시도한 마지막 제수를 검사하여 숫자가 소수인지 여부를 결정할 수 있습니다 (이 경우 1소수, 그렇지 않은 경우).

가자 처음에는 짧은 선형 섹션이 있습니다.

<-!<:^>[:

당신은 지금 그 대부분의 일을 알고 있습니다. 새로운 명령은 -!입니다. 스택 고양이에는 증가 또는 감소 연산자가 없습니다. 그러나 -(음수, 즉 곱하기 -1) 및 !(비트 NOT, 즉 곱하기 -1및 감소)이 있습니다. 이것들은 증가 !-, 또는 감소 로 결합 될 수 있습니다 -!. 따라서의 n상단 에서 사본을 줄인 -1다음 n스택에 다른 사본을 왼쪽으로 만든 다음 새 평가판을 가져 와서 그 아래에 놓습니다 n. 따라서 첫 번째 반복에서 다음을 얻습니다.

      4       
      3       
... 1 4 -1 ...
    0 0  0
      ^

추가 반복에서는 3다음 테스트 제수 등으로 대체됩니다 ( n이 시점에서 두 사본 은 항상 동일한 값입니다).

((-<)<(<!-)>>-_)

이것이 모듈로 계산입니다. 루프는 양수 값에서 종료되므로, 양수 값 을 얻을 때까지 -n시행 제수 d를 반복해서 추가합니다 . 일단 우리가 결과를 빼면 d나머지가 나옵니다. 여기서 까다로운 점 -n은 스택 맨 위에 올려 놓을 수 없으며 추가하는 루프를 시작할 수 없다는 것 입니다. 스택 d맨 위가 음수이면 루프가 입력되지 않습니다. 이는 가역 프로그래밍 언어의 한계입니다.

따라서이 문제를 피하기 위해 n스택 맨 위에서 시작 하지만 첫 번째 반복에서만 무시하십시오. 다시 말하지만, 그것은 그보다 더 간단하게 들립니다 ...

(-<)

스택의 상단이 양수이면 (즉, 첫 번째 반복에서만)이를로 무효화합니다 -. 그러나 우리는 단지 두 번 적용될 때까지 루프를 떠나지(-) 않기 때문에 할 수 없습니다 . 따라서 양수 값이 있다는 것을 알기 때문에 하나의 셀을 왼쪽으로 옮깁니다 . 자, 이제 우리는 첫 번째 반복에 대해 확실하게 부정 했습니다. 그러나 새로운 문제가 생겼습니다. 테이프 헤드는 이제 첫 번째 반복에서 다른 모든 반복 위치와 다른 위치에 있습니다. 계속 진행하기 전에이를 통합해야합니다. 다음 은 테이프 헤드를 왼쪽으로 이동합니다. 첫 번째 반복 상황 :-<1n<

        -4       
         3       
...   1  4 -1 ...
    0 0  0  0
    ^

그리고 두 번째 반복에서 ( 지금 우리가 d한 번 추가했음을 기억하십시오 -n) :

      -1       
       3       
... 1  4 -1 ...
    0  0  0
    ^

다음 조건은 이러한 경로를 다시 병합합니다.

(<!-)

첫 번째 반복에서는 테이프 헤드가 0을 가리 키므로 완전히 건너 뜁니다. 추가 반복에서 테이프 헤드는 하나를 가리 키므로이를 실행하고 왼쪽으로 이동하여 셀을 증가시킵니다. 셀이 0에서 시작한다는 것을 알기 때문에 이제는 항상 양수이므로 루프를 떠날 수 있습니다. 이렇게하면 항상 메인 스택의 왼쪽에 2 개의 스택이 생겨 이제로 되돌아 갈 수 있습니다 >>. 그런 다음 모듈로 루프의 끝에서을 수행 -_합니다. 당신은 이미 알고 -있습니다. XOR의 _내용을 빼는 것 ^입니다. 스택의 맨 위에 a있고 그 아래의 값이 b로 바뀐 a경우 b-a. 우리가 처음 부정 때문에 a하지만, -_대체 ab+a하여 추가,d 우리의 누적 합계로.

루프가 종료되면 (양수에 도달) 테이프는 다음과 같습니다.

        2       
        3       
... 1 1 4 -1 ...
    0 0 0  0
        ^

가장 왼쪽의 값은 양수일 수 있습니다. 실제로, 그것은 반복 횟수에서 1을 뺀 것입니다. 또 다른 짧은 선형 비트가 있습니다.

_<<]>:]<]]

앞서 말했듯 d이 실제 나머지 ( 3-2 = 1 = 4 % 3) 를 얻으려면 결과를 빼야 하므로 _한 번 더하십시오. 다음으로 왼쪽에서 증가하고있는 스택을 정리해야합니다. 다음 나누기를 시도 할 때 첫 번째 반복이 작동하려면 다시 0이어야합니다. 따라서 우리는 그곳으로 이동하여 그 양수 값을 다른 도우미 스택으로 푸시 <<]한 다음 다른 스택과 함께 운영 스택으로 다시 이동 >합니다. 우리는 끌어 d:와에 다시 밀어 -1]하고 우리는 우리의 조건 스택에 나머지를 이동합니다 <]]. 그것은 시험 분할 루프의 끝입니다. 이것은 우리가 0의 나머지를 얻을 때까지 계속됩니다.이 경우 왼쪽의 스택에는n의 최대 제수 (이외 n)

루프가 끝나면 *<경로가 입력과 1다시 결합되기 직전에 있습니다. 는 *단순히으로 제로집니다 1우리가 좀 필요한 것, 그리고 우리와 제수로 이동 <(우리는 입력과 동일한 스택에있어 수 있도록 1).

이 시점에서 세 가지 다른 종류의 입력을 비교하는 데 도움이됩니다. 먼저, n = 1우리가 그 시범 부문을 수행하지 않은 특별한 경우 :

         0    
... 1 1 -1 ...
    0 0  0
         ^

그런 다음 이전 예제 n = 4에서 복합 번호 :

    2           
    1    2 1    
... 1 4 -1 1 ...
    0 0  0 0
         ^

마지막으로 n = 3소수입니다.

    3           
    1    1 1    
... 1 3 -1 1 ...
    0 0  0 0
         ^

따라서 소수의 1경우이 스택에 있고 복합 숫자의 0경우보다 큰 양수를 갖 습니다 2. 우리는이 상황을 다음과 같은 최종 코드 로 바꾸 0거나 1필요로합니다.

]*(:)*=<*

]이 값을 오른쪽으로 밀면됩니다. 그리고 *최하위 비트를 전환하여, 우리는 설정 : 크게 조건부 상황을 단순화하는 데 사용됩니다 1에 (프라임) 0, 0양의 값으로 (복합)를 1, 다른 모든 양의 값은 여전히 긍정적 유지됩니다. 이제 우리는 구별 0하고 긍정적이어야합니다. 우리가 다른 곳을 사용하는 곳 (:)입니다. 스택의 상단이 0(그리고 입력이 소수 인 경우), 이것은 단순히 건너 뜁니다. 그러나 스택의 상단 (및 입력이 복합 수 있었다)이이 그것을 스왑 양수이면 1우리가 지금 가질 수 있도록, 0복합과1소수의 경우-두 개의 고유 한 값만 있습니다. 물론 그것들은 우리가 출력하고 싶은 것과 반대이지만, 다른 것으로 쉽게 고쳐집니다 *.

이제 남은 모든 우리 주변의 프레임 워크에 의해 예상 스택의 패턴을 복원하는 것입니다 : 오른쪽 스택의 상단에, 양의 값에 테이프 헤드를 초래하고, 하나 -1의 스택 오른쪽에 . 이것은 무엇 =<*을위한 것입니다. =인접한 두 스택의 상단을 교환하여 -1결과의 오른쪽으로 이동합니다 ( 예 4: 다시 입력) .

    2     0       
    1     3       
... 1 4   1 -1 ...
    0 0 0 0  0
          ^

그런 다음 왼쪽으로 이동하여 <0을 1로 바꿉니다 *. 그게 다야.

프로그램 작동 방식에 대해 더 자세히 알고 싶다면 디버그 옵션을 사용할 수 있습니다. -d플래그를 추가하고 "현재 메모리 상태를보고 싶은 위치 ( 예 : 이와 같이 )를 삽입하거나 -D플래그 사용 하여 전체 프로그램의 완전한 추적을 얻습니다 . 또는 단계별 디버거와 함께 스택 고양이 인터프리터가 포함 된 Timwi의 EsotericIDE 를 사용할 수 있습니다 .


3
>:^]공식 스택 고양이 로고 여야 함
Alex A.

14

하스켈, 54 바이트

import Data.Numbers.Primes
main=readLn>>=print.isPrime

설명 할 것이 많지 않습니다.


1
Wilson의 정리를 사용하여 외부 라이브러리 없이도 동일한 점수를 얻을 수 있습니다 (매우 비효율적 임).main=do n<-readLn;print$n>1&&mod(product[1..n-1]+1)n<1
Lynn

9
더 짧아도 main=do n<-readLn;print$mod(product[1..n-1]^2)n>049 바이트입니다.
Lynn

4
@Mauris : 좋습니다. 별도의 답변으로 게시하십시오.
nimi

14

루비, 15 + 8 = 23 바이트

p$_.to_i.prime?

샘플 실행 :

bash-4.3$ ruby -rprime -ne 'p$_.to_i.prime?' <<< 2015
false

Heheh, 나는 루비에 어딘가에 내장이 있음을 알았지 만 그것을 찾기 위해 귀찮게 할 수 없었으므로 C. +1로 대답했다.
Level River St

@ steveverrill, 나는 프로젝트 오일러에게 큰 도움이 되었기 때문에 그것을 알았습니다.
manatwork

14

자바 스크립트, 39 36 바이트

ETH 프로덕션 덕분에 3 바이트 절약 :

for(i=n=prompt();n%--i;);alert(1==i)

소수에 대해서는 true를 표시하고 그렇지 않으면 false를 표시합니다.

루프는 모든 시험 번호 I를 으로부터 N-1 까지 약수이다. 발견 된 첫번째 제수가 1 이면 소수입니다.


이전 솔루션 (39 바이트) :

for(i=n=prompt();n%--i&&i;);alert(1==i)

불필요한 시험은 어떻게 되었습니까?

for(i=2,n=prompt();n%i>0&&i*i<n;i++);alert(n%i>0) //49: Simple implementation: loop from 2 to sqrt(n) to test the modulo.
for(i=2,n=prompt();n%i>0&&i<n;i++);alert(n==i)    //46: Replace i*i<n by i<n (loop from 2 to n) and replace n%i>0 by n==i
for(i=2,n=prompt();n%i&&i<n;i++);alert(n==i)      //44: Replace n%i>0 by n%i
for(i=2,n=prompt();n%i&&i++<n;);alert(n==i)       //43: Shorten loop increment
for(i=n=prompt();n%--i&&i>0;);alert(1==i)         //41: Loop from n to 1. Better variable initialization.
for(i=n=prompt();n%--i&&i;);alert(1==i)           //39: \o/ Replace i>0 by i

최고의 JavaScript 답변이 이미 40 바이트이기 때문에 39 바이트 솔루션 만 게시했습니다.


2
프로그래밍 퍼즐 및 코드 골프에 오신 것을 환영합니다!
Dennis

2
좋은 답변입니다! 은 &&i실제로이 프로그램에 아무것도하지 않는, 그래서 당신은 그것을 제거 할 수 있습니다.
ETHproductions

n>1당신 1이 소수가 되고 싶지 않다면 최종 조건에 추가해야합니다 .
Titus

1
@Titus 입력이 1for 루프 인 경우 n%--i한 번만 수행 됩니다. 루프를 1%0반환 NaN하고 중지합니다. 때 alert호출은 i이미 동일 0하므로 1==i반환 false.
Hedi

2
i <2 (및 일부 텍스트)
Scheintod

13

달팽이, 122

입력은 단항으로 입력해야합니다. 숫자는 줄 바꿈을 제외한 모든 문자의 혼합 일 수 있습니다.

^
..~|!(.2+~).!~!{{t.l=.r=.}+!{t.!.!~!{{r!~u~`+(d!~!.r~)+d~,.r.=.(l!~u~)+(d!~l~)+d~,.l.},l=(.!.)(r!~u~)+(d!~!.r~)+d~,.r.!.

이 2D 패턴 일치 언어에서 프로그램 상태는 현재 그리드 위치, 일치 된 셀 세트 및 패턴 코드의 위치로만 구성됩니다. 일치하는 광장으로 여행하는 것도 불법입니다. 까다 롭지 만 정보를 저장하고 검색 할 수 있습니다. 일치하는 셀로 이동하는 것에 대한 제한은 역 추적, 순간 이동 (t ) 및 어설 션 ( =, !)에 , 완료 후 그리드는 수정되지 않는다.

25의 분해

홀수 복합 수에 대한 인수 분해는 상호 인접하지 않은 셀 세트 (그림에서 파란색)를 표시하여 시작합니다. 그런 다음 각 노란색 셀에서 프로그램은 두 개의 측면 사이에서 앞뒤로 이동하여 인접한 파란색 셀의 양쪽에 동일한 수의 비 파란 셀이 있는지 확인합니다. 다이어그램은 반드시 확인해야하는 4 개의 노란색 셀 중 하나에 대한이 패턴을 보여줍니다.

주석이 달린 코드 :

^                         Match only at the first character
..~ |                     Special case to return true for n=2
!(.2 + ~)                 Fail for even numbers
. !~                      Match 1st character and fail for n=1
!{                        If the bracketed pattern matches, it's composite.
  (t. l=. r=. =(.,~) )+   Teleport to 1 or more chars and match them (blue in graphic)
                          Only teleport to ones that have an unmatched char on each side.
                          The =(.,~) is removed in the golfed code. It forces the
                          teleports to proceed from left to right, reducing the
                          time from factorial to exponential.
  !{                      If bracketed pattern matches, factorization has failed.
    t . !. !~             Teleport to a square to the left of a blue square (yellow in diagram)
    !{                    Bracketed pattern verifies equal number of spaces to
                          the left or right of a blue square.
      {              
        (r!~ u~)+         Up...
        (d!~!. r~)+       Right...
        d~,               Down...
        . r . =.          Move 1 to the right, and check that we are not on the edge;
                          otherwise d~, can fall off next iteration and create and infinite loop
        (l!~ u~)+         Up...
        (d!~ l~)+         Left...
        d ~,              Down...
        . l .             Left 1
      } ,                 Repeat 0 or more times
      l  =(. !.)          Check for exactly 1 unused char to the left
      (r!~ u~)+           Up...
      (d!~!. r~)+         Right...
      d ~,                Down...
      . r . !.
    }
  }
}

13

C, 67 바이트

i,n;main(p){for(scanf("%d",&i),n=i;--i;p=p*i*i%n);putchar(48+p%n);}

인쇄 !1( Peter Taylor의 정의에 의한 잘못된 값 ) 0 의 경우(n-1)!^2 == 0 (mod n)1그렇지 않은 .

편집하다 : 채팅에서 약간의 토론 후puts("!1"+p%n) 불쾌한 것으로 간주되어 교체했습니다. 결과는 1 바이트 더 깁니다.

편집하다 : 큰 입력에 대해 수정되었습니다.

더 짧은 솔루션

56 바이트 : pawel.boczarski의 의견에서 권장하는 것처럼 명령 줄 인수의 수를 읽으면 단항으로 입력 할 수 있습니다.

p=1,n;main(i){for(n=--i;--i;p=p*i*i%n);putchar(48+p%n);}

같은 프로그램을 호출

$ ./a.out 1 1 1 1 1
1                        <-- as 5 is prime

51 바이트 : 리턴 코드를 통해 "출력"을 허용하는 경우 :

p=1,n;main(i){for(n=--i;--i;p=p*i*i%n);return p%n;}

내 솔루션에 게시 된 것처럼 단항 표현 (명령 줄 인수 수)을 사용하여 솔루션을 더 짧게 만들 수 있습니다. scanf 호출에서 일부 바이트를 줄일 수 있습니다.
pawel.boczarski

puts("!1"+p%n)혹시 어떻게 할 수 a+b에 대한 char*값?
Outgolfer 에릭

문자열 "!1"이 address a에서 시작 a+1하면 string을 찾을 수 "1"있습니다.
Lynn

오 @Lynn, 나는 (그래, 더 나은 남겨 연결을 위해 줄 알았는데 에게 strcat(const char*,const char*).)
에릭 Outgolfer

당신은 변경할 수 p=p*i*i%np*=i*i%n
알버트 렌쇼

12

파이썬 3, 59 바이트

이제 input()명령 줄 인수 대신 사용 합니다. @Beta Decay 덕분에

n=int(input())
print([i for i in range(1,n)if n%i==0]==[1])

사용하는 입력 input()이 훨씬 짧을 것입니다
Beta Decay

감사합니다. input ()을 사용하여 이미 작성했지만 답변을 새로 고치는 것을 잊었습니다. 다시 감사합니다!
uno20001

4
52 바이트 : n=m=int(input()),print(all(n%m for m in range(2,n)))
존 리옹

1
진심이야? 불완전한 2 차 속도 향상을 위해 25 개의 추가 문자를 사용 하시겠습니까? 여기서 우리는 바이트 를 싫어한다 . 우리는 삶의 시간, 분, 초마다 19 번째 바이트를 제거합니다. (농담이다. 그러나 우리는 프로그램 길이를 증가시키는 시간 최적화를하지 않는다.)
CalculatorFeline

2
n%i<1대신 사용하십시오 .
Outgolfer Erik

12

APL, 40 13 바이트

2=+/0=x|⍨⍳x←⎕

내 R 답변 과 동일한 알고리즘으로 시험 분할 . xSTDIN ( ) 의 입력에 할당 하고 나머지를 x1에서 각 정수 로 나눈 값을 얻습니다 x. 각각의 나머지는 0과 비교되어 1과 0으로 구성된 벡터를 제공하여 어떤 정수가 나누는 지 나타냅니다 x. 이것은 +/제수의 수를 구하기 위해 사용 됩니다. 이 숫자가 정확히 2이면 제수는 1과 1 x이므로 x소수입니다.



12

C ++ 템플릿 메타 프로그래밍. 166 131 119 바이트.

상수가 소수이면 코드가 컴파일되고 복합 또는 1이면 컴파일되지 않습니다.

template<int a,int b=a>struct t{enum{x=t<a,~-b>::x+!(a%b)};};
template<int b>struct t<b,0>{enum{x};};
int _[t<1>::x==2];

(마지막 줄을 제외한 모든 줄 바꿈은 "실제"버전에서 제거됩니다).

"컴파일 실패"는 메타 프로그래밍 언어의 잘못된 반환 값이라고 생각합니다. 전체 C ++ 프로그램으로 링크되지 않으므로 (소식을 공급하면 링크 오류가 발생 함) 유의하십시오.

테스트 할 값은 마지막 "행"의 정수입니다.

라이브 예 .

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