중요하지 않은 숫자 찾기


17

숫자를 받아들이기로 선택한 경우, 숫자가 다음 기준을 충족하는 경우 true 또는 false (또는 유사한 의미있는 예 및 아니오의 표현)를 반환하는 함수를 코드 골프화해야합니다.

  1. 정수 자체는 소수 또는
  2. 인접 정수 중 하나가 소수입니다

예를 들어 :
입력은 7True를 반환합니다.
입력 8도 True를 반환합니다.
입력은 15False를 반환합니다. (14, 15 또는 16이 소수가 아님)

2 ^ 0에서 2 ^ 20 사이의 숫자에 대해서는 입력이 올바르게 반환 될 수 있어야하므로 부호 문제 나 정수 오버플로에 대해 걱정할 필요가 없습니다.


버퍼 오버플로가 아닌 32 비트 숫자 오버플로라고 생각합니다.
사용자가 알 수 없음

"정수 오버플로"를 의미합니다. 뇌는 자동 조종 장치를 사용했습니다.
Mr. Llama

답변:


11

J, 17

*/<:$&q:(<:,],>:)

프로세스 리턴 코드로 인코딩 된 부울을 리턴합니다. true는 0, false는 0이 아닙니다. 샘플 사용 :

   */<:$&q:(<:,],>:) 7
0
   */<:$&q:(<:,],>:) 8
0
   */<:$&q:(<:,],>:) 15
3

*/0 p:<:,],>:짧고 적절한 (람다) 기능은 다음과 같습니다([:*/0 p:<:,],>:)
randomra

9

하스켈, 47 자

f n=any(\k->all((>0).mod k)[2..k-1])[n-1..n+1]

6

파이썬 85 80

def f(n):g=lambda n:all(n%i!=0for i in range(2,n));return g(n)or g(n-1)or g(n+1)

Code Golf에서 처음으로 누락 된 트릭이있을 수 있습니다.


를 제거 할 수 있습니다 []. 모두 생성기 표현식으로 작업하는 것이 행복 할 것입니다. 당신은 당신의 코드가 추악한 괜찮다면, 당신은 또한 사이의 공백을 제거 할 수 0for)or.
stranac

@stranac 굉장합니다. 대단히 감사합니다.
Kris Harper

3
몇 가지 간단한 변경 사항이 있었지만 여전히 작동합니다.f=lambda n:any(all(m%i for i in range(2,m))for m in[n,n-1,n+1])
Nabb

@Nabb 아주 좋아. 잘 했어.
Kris Harper

5

어떤 식 으로든 코드 부족에 대한 실제 경쟁자는 아니지만 정규 표현식으로 소수 결정 하는 것은 여러 가지 방법으로 뒤틀려 있기 때문에 제출 하는 것입니다!

Python (2.x), 85 자

import re
f=lambda n:any(not re.match(r"^1?$|^(11+?)\1+$","1"*x)for x in[n,n-1,n+1])

"1"* (n + 1)을 테스트하지만 ^ 1? 1로 시작하여 for 루프를 제거하고 정규 표현식으로 빌드 할 수 있습니다. 대신에.
Howard

4

루비 (람다로 55 또는 50)

def f q;(q-1..q+1).any?{|n|(2..n-1).all?{|d|n%d>0}};end

또는 람다 ( g[23]호출하는 데 사용)

g=->q{(q-1..q+1).any?{|n|(2..n-1).all?{|d|n%d>0}}}

커피 스크립트 (53)

p=(q)->[q-1..q+1].some (n)->[2..n-1].every (d)->n%d>0

<pedantic> "lambda"가 아닌 "proc"이어야합니다. </ pedantic> ;-)
Doorknob

3

지루한 Mathematica, 35 솔루션!

PrimeQ[n-1]||PrimeQ[n]||PrimeQ[n+1]

15
적어도 당신은 그것을 골프 수 있습니다 Or@@PrimeQ/@{n-1,n,n+1}.
Howard

이것은 기능이 아닙니다.
Martin Ender 2019

@ MartinBüttner : Mathematica를 모르겠습니다. 죄송합니다.
Ry-

2
하워드의 버전, 사용 Or@@PrimeQ@{#-1,#,#+1}&(자신의 코드에 슬래시가 필요하지 않습니다)
마틴 청산

3

씨, 112 82 72 자

Ilmari Karonen의 의견에 따라를 제거하여 30자를 저장 main하면 이제 Ptrue / false가 반환됩니다. 또한 루프를 재귀로 대체하고 약간 더 비 틀었습니다.

p(n,q){return++q==n||n%q&&p(n,q);}P(n){return p(-~n,1)|p(n,1)|p(~-n,1);}

원본 버전 :

p(n,q,r){for(r=0,q=2;q<n;)r|=!(n%q++);return!r;}
main(int n,int**m){putchar(48|p(n=atoi(*++m))|p(n-1)|p(n+1));}

을 (를) 사용하여 2 개의 문자를 저장할 수 main(n,m)int**m;있습니다.
Ilmari Karonen

... 그리고 그 과제는 "code-golf a function " 이라고 말합니다 .
Ilmari Karonen

3

Mathematica, 24 바이트

이 오래된 게시물이 오늘 내 목록에 표시되는 이유를 모르지만 Mathematica가 경쟁력이 있음을 깨달았습니다.

Or@@PrimeQ/@{#-1,#,#+1}&

이름 기능 정수 인수를 복용하고 반환 True또는 False. 직접 구현.


PrimeQ목록에 대한 스레드이므로 -1 바이트에 대해 Or@@PrimeQ@{#-1,#,#+1}&(또는 Or@@PrimeQ[#+{-1,0,1}]&)도 작동합니다. (하지만, 나는 만약 내가 모르는 것 같아요 PrimeQ2012 년 목록을 통해 스레드)
미샤 라브 로프

3

Stax , 6 바이트

Ç▀<╝ºΩ

실행 및 디버깅

설명 (포장 풀기) :

;v:Pv<! Full program, implicit input  Example: 7
;v      Copy input and decrement               7 6
  :P    Next prime                             7 7
    v   Decrement                              7 6
     <! Check if input is >= result            1

2

자바 스크립트 (71 73 80 )

n=prompt(r=0);for(j=n-2;p=j++<=n;r|=p)for(i=1;++i<j;)p=j%i?p:0;alert(r)

데모 : http://jsfiddle.net/ydsxJ/3/

편집 1 : 변경 for(i=2;i<j;i++)for(i=1;++i<j;) (감사합니다 @minitech). if명령문을 3 진으로 변환하십시오 . 이전 r|=pp=1외부에 for내부 괄호를 제거 할 수 있습니다. 7자를 저장했습니다.

편집 2 : 결합 p=1j++<=np=j++<=n 2 개 문자 (감사 저장, @ugoren).


캐릭터를 1 개 더 저장 하는 for(i=1;++i<j;)대신 사용할 수 있습니다 for(i=2;i<j;i++).
Ry-

1
@minitech : !j%i우선 순위 때문에 작동하지 않습니다. 효과적인 대안은 j%i<1입니다.
Nabb

@Nabb :와, 맞아. 바보입니다.
Ry-

어때요 p=j++<=n? Javascript가 여기 C와 같으면 작동합니다.
우고 렌

@ugoren : 그것이 작동하는 것 같습니다, 감사합니다!
mellamokb

2

정규식 (ECMAScript), 20 바이트

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

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

위의 버전은 0을 올바르게 처리하지 않지만 1 바이트 만 필요합니다.

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

추가 보너스로 다음 1은 소수보다 소수, 2소수, 소수 이상 에 대한 리턴 매치를 제공하는 버전입니다 3.

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

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


질문의 범위는 "2 ^ 0과 2 ^ 20 사이"이므로 1..2 ^ 20이므로 0은 없습니다.
RosLuP

@RosLuP 정확히 기본 응답이 20 바이트이고 0을 올바르게 처리하지 못하는 이유입니다. 질문의 정확한 사양을 넘어서서 질문의 사양과 가장 일치하는 답변 함께 더 강력한 답변을 제공하는 데 가치가 있습니다.
Deadcode

때때로 나는 똑같은 일을한다 ( '필요하지 않은'시험 작성). 이것은 코드 골프 사고 방식에 어긋나는 것처럼 보이며,이를 작성하는 사람들은 "심각한"것으로 간주되지 않는다 ...
RosLuP

1
@RosLuP 그러나 기본 답변으로 최소 답변을 제공하는 한 피해는 무엇입니까? 실제로 그렇게 생각하는 사람들의 예를 들어 줄 수 있습니까? 내 주면 나는 그것을 이해할 수있는 유일한 강력한 하나 대답을하지만, 내가 그 일을하고 있지 않다.
Deadcode

1

C #, 96

true이면 -1,0,1을 반환하고 다른 것은 false입니다.

더 짧게 만드는 제안은 훌륭합니다!

int p(int q){var r=q-1;for(var i=2;i<r&r<q+2;i++){if(i==r-1)break;if(r%i==0)r+=i=1;}return r-q;}

확장 된 형태 :

int p(int q){
    var r=q-1;
    for(var i=2;i<r&r<q+2;i++){
        if(i==r-1)break;
        if(r%i==0)r+=i=1;
    }
    return r-q;     
}

나는 완전히 잘 모르겠지만, 난 당신이를 제거 할 수 있다고 생각 if(i==r-1)break;하고, 중간 변경 for에서 루프 i<ri<r-1. 그것은 82로 당신을 데려 갈 것이다.
Ciaran_McCarthy

1

GolfScript : 26

)0\{.:i,{i\%!},,2=@|\(}3*;

설명 : 가장 안쪽 블록 {.:i,{i\%!},,2=@|\(} 은 스택 맨 위보다 정확히 2 개의 요소가 없는지 확인하여 스택 맨 위가 소수인지 판별합니다. 그런 다음 스택의 두 번째 항목과 이것을 분리하여 프라임이 아직 표시되었는지 여부를 유지합니다. 마지막으로 스택 상단의 숫자를 줄입니다.

입력을 증가시켜 시작 상태를 초기화하고 블록을 3 번 반복하십시오. 이것은 두 번 감소하지만 증가로 시작했기 때문에 n+1와 를 다룹니다 n-1.


1

C #, 87 97 자

bool p(int q){return new[]{q-1,q,q+1}.Any(x=>Enumerable.Range(2,Math.Abs(x-2)).All(y=>x%y!=0));}

나는 이것이 입력으로 1 또는 2와 함께 작동하지 않는다고 생각합니다
Ben Reich

@BenReich 그것은하지 않았다. 나는 그것을 고치기 위해 10 개의 문자를 추가해야했다 :(
Steve Clanton

1

CJam, 12 바이트

CJam 은이 도전보다 훨씬 젊으 므로이 답변은 초록색 체크 표시를받을 수 없습니다 (어쨌든 randomra의 답변으로 업데이트되어야 함). 그러나 골프를 타는 것은 실제로 매우 재미있었습니다. 저는 17 바이트에서 시작한 다음 매번 1-2 바이트 씩 저의 접근 방식을 완전히 3 번 변경했습니다.

{(3,f+:mp:|}

이 블록은 CJam의 함수와 가장 가까운 블록으로, 스택의 입력을 예상하고 스택에 1 (truthy) 또는 0 (falsy)을 남깁니다.

여기에서 테스트하십시오.

작동 방식은 다음과 같습니다.

(3,f+:mp:|
(          "Decrement the input N.";
 3,        "Push an array [0 1 2].";
   f+      "Add each of those to N-1, to get [N-1 N N+1].";
     :mp   "Test each each element for primality, yielding 0 or 1.";
        :| "Fold bitwise OR onto the list, which gives 1 if any of them was 1.";

1

F #, 68 바이트 (비경쟁)

let p n=Seq.forall(fun x->n%x>0){2..n-1}
let m n=p(n-1)||p n||p(n+1)

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

이것이 제가 코드 골프를 좋아하는 이유입니다. 나는 여전히 F #을 사용하여 매우 녹색이지만 언어가 작동하는 방식과 이러한 종류의 문제로부터 언어가 어떻게 할 수 있는지에 대해 많은 것을 배웁니다.


경쟁이 아닌 이유는 무엇입니까?
Nit

1
오늘 F #에서 2012 년에 질문을 받았을 때 주위에 없었던 것을 사용하고 있는지 확실하지 않기 때문에 나는 그것이 편집적이고 심지어 편집증이라는 것을 인정합니다. 그러나 저는 생계를위한 제약 소프트웨어를 작성합니다. 편집증은 건강합니다. ;)
Ciaran_McCarthy

1
에서 봐 위키 백과에서 F #의 버전 테이블 . 필요한 버전에 따라 질문보다 오래되었을 수 있습니다.



1

자바 8, 83 바이트

n->n==1|p(n-1)+p(n)+p(n+1)>0int p(int n){for(int i=2;i<n;n=n%i++<1?0:n);return--n;}

진실 / 거짓 값으로 true/ false를 반환 합니다.

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

설명 : "

n->                    // Method with integer parameter and boolean return-type
  n==1                 //  Return whether the input is 1 (edge-case)
  |p(n-1)+p(n)+p(n+1)>0//  Or if the sum of `n-1`, `n`, and `n+1` in method `p(n)` is not 0

int p(int n){          // Separated method with integer as both parameter and return-type
  for(int i=2;i<n;     //  Loop `i` in the range [2, `n`)
    n=n%i++<1?         //   If `n` is divisible by `i`
       0               //    Change `n` to 0
      :                //   Else:
       n);             //    Leave `n` as is
                       //  (After the loop `n` is either 0, 1, or unchanged,
                       //   if it's unchanged it's a prime, otherwise not)
  return--n;}          //  Return `n` minus 1

그래서 int p(int n)발생합니다 -1대한 n=0비 소수, 그리고 발생합니다n-1 위해 n=1또는 소수. 이후 p(0)+p(1)+p(2)이 될 것이다 -1+0+1 = 0(비록 거짓 반환 2총리가)에서는 n=1이 방법을 사용하여 에지 경우입니다.


분리 된 방법이없는 단일 루프는 85 바이트입니다 .

n->{int f=0,j=2,i,t;for(;j-->-1;f=t>1?1:f)for(t=n+j,i=2;i<t;t=t%i++<1?0:t);return f;}

진실 / 거짓 값으로 1/ 0를 반환 합니다.

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

설명:

n->{              // Method with integer as both parameter and return-type
  int f=0,        //  Result-integer, starting at 0 (false)
      j=2,i,      //  Index integers
      t;          //  Temp integer
  for(;j-->-1;    //  Loop `j` downwards in range (2, -1]
      f=          //    After every iteration: Change `f` to:
        t>1?      //     If `t` is larger than 1 (`t` is a prime):
         1        //      Change `f` to 1 (true)
        :         //     Else:
         f)       //      Leave `f` the same
    for(t=n+j,    //   Set `t` to `n+j`
        i=2;i<t;  //   Inner loop `i` in the range [2, t)
      t=t%i++<1?  //    If `t` is divisible by `i`:
         0        //     Change `t` to 0
        :         //    Else:
         t);      //     Leave `t` the same
                  //   (If `t` is still the same after this inner loop, it's a prime;
                  //   if it's 0 or 1 instead, it's not a prime)
  return f;}      //  Return the result-integer (either 1/0 for true/false respectively)


0

R, 68 자

f=function(n){library(gmp);i=isprime;ifelse(i(n-1)|i(n)|i(n+1),1,0)}

사용법 (TRUE의 경우 1, FALSE의 경우 0) :

f(7)
[1] 1
f(8)
[1] 1
f(15)
[1] 0

1
R이 어떻게 작동하는지 모르겠지만 i(n-1)|i(n)|i(n+1)대신 대신 할 수 ifelse(i(n-1)|i(n)|i(n+1),1,0)있습니까?
Ry-

맞습니다 : g = function (n) {library (gmp); i = isprime; i (n-1) | i (n) | i (n + 1)}-최대 56 자! ;-)
Paolo

0

C ++

k=3;cin>>i;i--;
while(k)
{l[k]=0;
  for(j=2;j<i;j++)
   if(!(i%j))
     l[k]++;
  k--;
  i++;
}
if(!l[1]|!l[2]|!l[3])
     cout<<"1";
else cout<<"0";

CodeGold.SE에 오신 것을 환영합니다. 다른 답변을 보면 [code-golf] 질문에 대한 답변에 사용되는 일반적인 형식을 알 수 있습니다. 답변에도 적용 할 수 있습니다.
dmckee

0

Q, 43 자 36

{any min each a mod 2_'til each a:x+-1 0 1}
{any(min')a mod 2_'(til')a:x+-1 0 1}

0

J, 16 자

   (_2&<@-4 p:]-2:)

   (_2&<@-4 p:]-2:) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
1 1 1 1 1 1 1 1 0 1 1 1 1 1 0 1 1 1 1

0

파이썬, 67 67 문자

any(all(i%j for j in range(2,i))for i in range(input()-1,8**7)[:3])

8**7 > 2**20 쓰는 데 약간 더 짧은 동안


0

루비, 47 자이지만 읽기 가능

require'Prime'
f=->x{[x-1,x,x+1].any? &:prime?}

0

C ++ 97

우고 렌은 나를 영리한 해결책으로 이겼습니다. 그래서 그는 루프에서 세 번이나 짧은 버전입니다.

P(int k){int j=1;for(int i=2;i<k;){j=k%i++&&j;}return j;}
a(int b){return P(b)|P(b+1)|P(b-1);}

0

넷째 (2 번째) , 104 바이트

: p dup 1 > if 1 over 2 ?do over i mod 0> * loop else 0 then nip ;
: f dup 1- p over 1+ p rot p + + 0< ;

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

설명

프라임 체크 (P)

dup 1 > if          \ if number to check if greater than 1
   1 over 2 ?do     \ place a 1 on the stack to act as a boolean and loop from 2 to n
      over i  mod   \ take the modulo of n and i
      0> *          \ check if greater than 0 (not a divisor) and multiply result by boolean
   loop             \ end the loop, result will be -1 if no divisor was found (prime)
else                \ if n is less than 2
   0                \ put 0 on the stack (not prime)
then                \ end the loop
nip                 \ drop n from the stack

주요 기능 (f)

dup 1- p             \ get n-1 and check if prime
over 1+ p            \ get n+1 and check if prime
rot p                \ rotate stack to put n on top and check if prime
+ + 0<               \ add the three results and check if less than 0 (at least 1 was prime)


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