가장 가까운 소수를 반환


33

도전

이것은 간단한 것입니다. 최대 1,000,000의 양의 정수가 주어지면 가장 가까운 소수를 반환하십시오.

숫자 자체가 소수이면 해당 숫자를 반환해야합니다. 제공된 숫자와 똑같이 두 개의 소수가 있으면 둘 중 더 낮은 값을 반환하십시오.

입력은 단일 정수 형식이며 출력도 정수 형식이어야합니다.

난 상관 없어 얼마나 오래 작동, 당신은 입력 (기능, STDIN 등)에 걸릴 또는 출력 (기능, STDOUT, 등)를 표시합니다.

이것은 코드 골프이므로 표준 규칙이 적용됩니다. 최소 바이트 수의 프로그램이 승리합니다!

테스트 사례

Input  =>  Output
------    -------
80     =>      79
100    =>     101
5      =>       5
9      =>       7
532    =>     523
1      =>       2

5
PPCG에 오신 것을 환영합니다!. 품질 부족으로 인한 투표 중단을 피하려면 먼저 샌드 박스에 게시하고 며칠 후에 여기에 게시하십시오
Luis felipe De jesus Munoz

이것은 이 도전 에서 요청 된 출력 중 하나입니다 .
Arnauld

매우 밀접하게 관련되어 있지만 동일하지는 않습니다.
주세페

@Arnauld 나는 그 것을 보았지만, 그들은 새로운 질문을 보장하기에 충분히 다르다고 생각했습니다.
Nathan Dimmer

2
OEIS A051697 도 참조하십시오 .
에릭 타워

답변:


9

가이아 , 3 바이트

ṅD⌡

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

큰 입력의 경우 속도가 느리지 만 충분한 메모리 / 시간이 주어지면 작동합니다.

D⌡암시 적으로 z다시 푸시 되는지 확실하지 않지만 이것이 매우 짧은 대답입니다!

ṅ	| implicit input z: push first z prime numbers, call it P
 D⌡	| take the absolute difference between P and (implicit) z,
	| returning the smallest value in P with the minimum absolute difference

13

자바 스크립트 (ES6), 53 바이트

n=>(g=(o,d=N=n+o)=>N%--d?g(o,d):d-1?g(o<0?-o:~o):N)``

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

댓글

n => (            // n = input
  g = (           // g = recursive function taking:
    o,            //   o = offset
    d =           //   d = current divisor, initialized to N
    N = n + o     //   N = input + offset
  ) =>            //
    N % --d ?     // decrement d; if d is not a divisor of N:
      g(o, d)     //   do recursive calls until it is
    :             // else:
      d - 1 ?     //   if d is not equal to 1 (either N is composite or N = 1):
        g(        //     do a recursive call with the next offset:
          o < 0 ? //       if o is negative:
            -o    //         make it positive (e.g. -1 -> +1)
          :       //       else:
            ~o    //         use -(o + 1) (e.g. +1 -> -2)
        )         //     end of recursive call
      :           //   else (N is prime):
        N         //     stop recursion and return N
)``               // initial call to g with o = [''] (zero-ish)


7

옥타브 , 40 바이트

@(n)p([~,k]=min(abs(n-(p=primes(2*n)))))

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

이것은 항상 사이에 주요 있다는 사실 사용 n2*n( 버트 랜드 - 체비 셰프의 정리 ).

작동 원리

@(n)p([~,k]=min(abs(n-(p=primes(2*n)))))

@(n)                                      % Define anonymous function with input n
                       p=primes(2*n)      % Vector of primes up to 2*n. Assign to p
                abs(n-(             ))    % Absolute difference between n and each prime
      [~,k]=min(                      )   % Index of first minimum (assign to k; not used)
    p(                                 )  % Apply that index to p




5

Brachylog , 7 5 바이트

;I≜-ṗ

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

@DLosc 덕분에 2 바이트를 절약했습니다.

설명

;I≜      Label an unknown integer I (tries 0, then 1, then -1, then 2, etc.)
   -     Subtract I from the input
    ṗ    The result must be prime

@DLosc 주로 ​​바보이기 때문에. 감사.
치명적

방금 다른 방향에서 접근했다고 생각합니다. 당신은 처음부터 생각하고 있었지만, 나는 짝짓기와 빼기에 대해 생각하고 있었고 나중에 야 그것이 작동하도록 해야한다는 것을 깨달았습니다 . :)
DLosc

4

Pyth, 10 바이트

haDQfP_TSy

여기 에서 온라인으로 시도 하거나 모든 테스트 사례를 한 번에 확인 하십시오 .

haDQfP_TSyQ   Implicit: Q=eval(input())
              Trailing Q inferred
         yQ   2 * Q
        S     Range from 1 to the above
    f         Filter keep the elements of the above, as T, where:
     P_T        Is T prime?
  D           Order the above by...
 a Q          ... absolute difference between each element and Q
                This is a stable sort, so smaller primes will be sorted before larger ones if difference is the same
h             Take the first element of the above, implicit print

4

젤리 , 9 7 바이트

ḤÆRạÞµḢ

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

더 큰 입력은 느리지 만 요청 된 범위에서는 작동합니다. 2 바이트를 절약 한 @EriktheOutgolfer에게 감사합니다!


이봐, 영리 해! (절대 차이) 로 대체 _A¥하여 2를 저장하십시오 . 아, 정말 될 수 있습니다 .
Outgolfer Erik

@EriktheOutgolfer 감사합니다. 반드시 사용하는 것이 항상 작동하지 않습니까? 이는 n + 1까지의 소수만 발견하고 가장 가까운 것은 n + 2 일 수 있음을 의미합니다.
Nick Kennedy

흠, 그것은 걱정이다.
Outgolfer Erik

4

파이썬 2 , 71 바이트

f=lambda n,k=1,p=1:k<n*3and min(k+n-p%k*2*n,f(n,k+1,p*k*k)-n,key=abs)+n

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

p(k1)!2p%kabs(k-n)kk-nabsnk

표현식 k+n-p%k*2*nk-n소수 (where p%k=1) 를 제공하도록 설계되었으며 , 그렇지 않은 경우 "나쁜"값은 k+n항상 절대 값이 더 크므로 최소값에 영향을 미치지 않으므로 비 프라임이 전달됩니다.



3

깔끔한 43 바이트

{x:(prime↦splice(]x,-1,-∞],[x,∞]))@0}

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

설명

이것은 매개 변수가있는 람다입니다 x. 이것은 다음 순서를 생성하여 작동합니다.

[x - 1, x, x - 2, x + 1, x - 3, x + 2, x - 4, x + 3, ...]

이것은 두 개의 시퀀스 ]x, -1, -∞](왼쪽 닫힘, 오른쪽 열림) 및 [x, ∞](두 열림)을 함께 연결합니다.

의 경우 x = 80다음과 같습니다.

[79, 80, 78, 81, 77, 82, 76, 83, 75, 84, 74, 85, ...]

그런 다음 만족스러운 f↦s모든 요소를 ​​선택 하는 데 사용 합니다 . 이 경우 모든 합성 수를 걸러 내고 소수만 남습니다. 같은 경우 다음과 같이됩니다.sfx

[79, 83, 73, 71, 89, 67, 97, 61, 59, 101, 103, 53, ...]

그런 다음 (...)@0이 시퀀스의 첫 번째 멤버를 선택하는 데 사용 합니다. 둘 중 더 낮은 것을 선택해야하기 때문에, 시작하는 순서가 x - 1먼저 연결됩니다.

참고 : x및 중 하나만 x - 1소수 일 수 있으므로 스 플라이 싱 된 시퀀스는로 시작해도됩니다 x - 1. 시퀀스가 양쪽에서 열릴 수 있지만 ( [x,-1,-∞]) x시퀀스에서 두 번 불필요하게 포함 됩니다. 따라서 "효율성"을 위해 왼쪽 닫힘 버전을 선택했습니다 (또한 Tidy를 과시하기 때문에).



3

APL (Dyalog Extended) , 20 15 바이트 SBCS

Galen Ivanov의 J answer에서 영감을 얻은 암묵적 접두사 기능 .

⊢(⊃⍋⍤|⍤-⊇⊢)¯2⍭⍳

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

ɩ는 인수를 통해 하나 ndices.

¯2⍭ 그것의 n 번째 소수

⊢() 원래의 인수를 왼쪽 인수로하여 다음의 암묵적 기능을 적용하십시오.

 프라임

 에 의해 색인 :

   상행 등급 (오름차순 정렬 할 지수)
   의
  | 크기 (절대 값)
   의
  - 차이

 첫 번째 것을 선택하십시오 (즉, 가장 작은 차이를 가진 것)


3

펄 6 , 35 바이트

{$_+=($*=-1)*$++until .is-prime;$_}

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

이것은 Veitcel의 기술을 사용하여 목록을 생성 0, -1, 2, -3하지만 ($*=-1)*$++P6에서 사용할 수있는 익명의 상태 변수 를 사용하여 크게 단순화합니다 (원래는 -1 ** $++ * $++있었지만 골프를 칠 때 음수가 우선 순위를 잃습니다). 프라임 체커가 내장되어 있지만 불행히도 until자동으로 반환되는 값을 방지하여 여분의 여유가 $_있습니다.


나는 보통 이런 식으로 시퀀스 연산자 접근법을 사용하지만 1 바이트 더 길어 지기 때문에 더 짧은 방법을 찾는 훌륭한 작업
Jo King

@JoKing 좋은 캐치. 작업 솔루션을 얻은 후 너무 빨리 골프를 타는 경우 발생하는 일. 나는 비슷한 것을 가지고 있지만 [-1] haha의 저주 부족
user0721090601

3

C, 122 (121) 104 바이트

p(a,i){for(i=1;++i<a;)if(a%i<1)return 0;return a>1;}c(a,b){for(b=a;;b++)if(p(--a)|p(b))return p(b)?b:a;}

함수를 호출 c()하고 인수로 숫자를 전달하십시오. 가장 가까운 소수를 반환해야합니다.

1 바이트에 대한 무지의 실시 덕분에 크게 개선되었습니다.

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


그러나 c()당신은 아마도을 단축 할 수 ... 또한, 두 개의 매개 변수를 수신 while(1)for(;;)난 당신의 코드를 실행하는 방법을하지 않기 때문에, 검증되지 않은 (
무지의 실시 예를

@EmbodimentofIgnorance 나는 그것을 작성하고 온라인 c 컴파일러 에서 모두 테스트했다 c(). 첫 번째 매개 변수 만 전달하는 것을 호출 할 수 있었다 . 그리고 당신이 옳아 요, for(;;)바이트를 절약하고 단 117 개만 남았습니다. :)
Lince Assassino

110 바이트 : #define r return p(a,i){i=1;while(++i<a)if(a%i<1)r 0;r a>1;}c(a,b){b=a;for(;;b++){if(p(--a))r a;if(p(b))r b;}}. 다음은 TIO 링크입니다. tio.run/…
무지의 구현




2

APL (NARS), 38 자, 76 바이트

{⍵≤1:2⋄0π⍵:⍵⋄d←1π⍵⋄(d-⍵)≥⍵-s←¯1π⍵:s⋄d}

0π는 소수에 대한 검정이고, ¯1π는 이전 소수이고, 1π는 다음 소수입니다. 테스트:

  f←{⍵≤1:2⋄0π⍵:⍵⋄d←1π⍵⋄(d-⍵)≥⍵-s←¯1π⍵:s⋄d}
  f¨80 100 5 9 532 1
79 101 5 7 523 2 



2

MathGolf , 10 바이트

∞╒g¶áÅ-±├Þ

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

설명:

            # Double the (implicit) input-integer
            # Create a list in the range [1, 2*n]
  g         # Filter so only the prime numbers remain
    áÅ       # Sort this list using the next two character:
           #  The absolute difference with the (implicit) input-integer
            # Push the first item of the list
             # (unfortunately without popping the list itself, so:)
         Þ   # Discard everything from the stack except for the top
             # (which is output implicitly as result)

@JoKing 감사합니다! 나는 맥스가 그것을 바꾸는 것에 대해 생각한다는 것을 알았지 만 그가 실제로했는지는 몰랐습니다. 문서에는 여전히 오래된 문서가 있습니다.
케빈 크루이 센

아, mathgolf.txt 파일을 최신 버전으로 사용하기 때문에 참조 용으로 사용합니다
Jo King

@JoKing 그래, 어제 그 파일에 대해서도 말해 줬어. 앞으로부터 사용하겠습니다. :)
Kevin Cruijssen


2

C # (Visual C # Interactive Compiler) , 104100 바이트

n=>{int r=0,t=0,m=n;while(r!=2){n+=(n<m)?t:-t;t++;r=0;for(int i=1;i<=n;i++)if(n%i==0)r++;}return n;}

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

설명:

int f(int n)
{
    int r = 0; //stores the amount of factors of "n"
    int t = 0; //increment used to cover all the integers surrounding "n"
    int m = n; //placeholder to toggle between adding or substracting "t" to "n"

    while (r != 2) //while the amount of factors found for "n" is different to 2 ("1" + itself)
    {
        n += (n < m) ? t : -t; //increment/decrement "n" by "t" (-0, -1, +2, -3, +4, -5,...)
        t++;
        r = 0;
        for (int i = 1; i <= n; i++) //foreach number between "1" and "n" increment "r" if the remainder of its division with "n" is 0 (thus being a factor)
            if (n % i == 0) r++; 
    }
    return n;
}

Console.WriteLine(f(80)); //79

2

자바 8, 88 87 바이트

n->{for(int c=0,s=0,d,N=n;c!=2;s++)for(c=d=1,n+=n<N?s:-s;d<n;)if(n%++d<1)c++;return n;}

@NaturalNumberGuy 포트 (첫 번째) C 답변 포트 , 그래서 그를 찬성 해야합니다! @ OlivierGrégoire
덕분에 -1 바이트 .

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

설명:

n->{               // Method with integer as both parameter and return-type
  for(int c=0,     //  Counter-integer, starting at 0
          s=0,     //  Step-integer, starting at 0 as well
          d,       //  Divisor-integer, uninitialized
          N=n;     //  Copy of the input-integer
      c!=2;        //  Loop as long as the counter is not exactly 2 yet:
      s++)         //    After every iteration: increase the step-integer by 1
    for(c=d=1,     //   (Re)set both the counter and divisor to 1
        n+=n<N?    //   If the input is smaller than the input-copy:
            s      //    Increase the input by the step-integer
           :       //   Else:
            -s;    //    Decrease the input by the step-integer
        d<n;)      //   Inner loop as long as the divisor is smaller than the input
      if(n%++d     //    Increase the divisor by 1 first with `++d`
              <1)  //    And if the input is evenly divisible by the divisor:
        c++;       //     Increase the counter-integer by 1
  return n;}       //  Return the now modified input-integer as result

2

자바 (JDK) , 103 바이트

n->{int p=0,x=0,z=n,d;for(;p<1;p=p>0?z:0,z=z==n+x?n-++x:z+1)for(p=z/2,d=1;++d<z;)p=z%d<1?0:p;return p;}

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


음 .. 나는 이미 그의 대답의 포트를 만들었습니다 .. ;) 비록 당신의 바이트가 1 바이트 짧아 지지만, 뭔가 다릅니다. 편집 : 아, 루프 외부에 결과 정수가 있으며 루프 내부의 입력을 수정하므로 -1 바이트가 for ;입니다. :) 답변을 삭제 하시겠습니까? .. 설명을 자유롭게 복사하십시오.
Kevin Cruijssen

@KevinCruijssen 죄송합니다, 롤백되었습니다!
Olivier Grégoire

그것에 대해 죄송합니다 (-1 바이트 덕분에). 그래도 당신의 버전도 좋아합니다. NaturalNumberGuy의 답변을보기 전에 이미 upvoted.
케빈 크루이 센

2

Haskell , 79 74 바이트 (Laikoni 덕분에)

annonymus 함수로 72 바이트 (이 경우 초기 "f ="를 제거 할 수 있음).

f=(!)(-1);n!x|x>1,all((>0).mod x)[2..x-1]=x|y<-x+n=last(-n+1:[-n-1|n>0])!y

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


원래 코드 :

f=(!)(-1);n!x|x>1&&all((>0).mod x)[2..x-1]=x|1>0=(last$(-n+1):[-n-1|n>0])!(x+n)

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

설명:

f x = (-1)!x

isPrime x = x > 1 && all (\k -> x `mod` k /= 0)[2..x-1]
n!x | isPrime x = x            -- return the first prime found
    | n>0       = (-n-1)!(x+n) -- x is no prime, continue with x+n where n takes the 
    | otherwise = (-n+1)!(x+n) -- values -1,2,-3,4 .. in subsequent calls of (!)

1
가드 내부에서 ,대신 사용할 수 있습니다 &&. (last$ ...)할 수있다 last(...), 두 번째 가드 1>0, 예를 괄호을 저장 바인딩에 사용할 수 있습니다 y<-x+n.
Laikoni

익명 함수는 일반적으로 허용되므로 초기 값 f=을 계산할 필요가 없습니다. 또한 괄호를 묶을 (-1+n)수 있습니다.
Laikoni

제안 해 주셔서 감사합니다. 나는 ""를 몰랐고 함수 가드에서 바인딩이 허용된다! 그러나 나는 익명의 기능에 대한 아이디어를 답으로 좋아하지 않습니다. 내 의견으로는 옳지 않다.
Sachera

Haskell의 골프 관련 팁 모음 에서 더 많은 팁을 찾을 수 있습니다 . 도있다 하스켈 골프 규칙에 대한 안내 : 전용 채팅방 모나드와 남자의가 .
Laikoni

2

VDM-SL , 161 바이트

f(i)==(lambda p:set of nat1&let z in set p be st forall m in set p&abs(m-i)>=abs(z-i)in z)({x|x in set{1,...,9**7}&forall y in set{2,...,1003}&y<>x=>x mod y<>0})

실행하는 전체 프로그램은 다음과 같이 보일 수 있습니다. 실제로 이것을 실행하려면 사용되는 소수 세트의 경계를 변경해야합니다 .1 백만 동안 실행하는 데 시간이 오래 걸리기 때문입니다.

functions
f:nat1+>nat1
f(i)==(lambda p:set of nat1&let z in set p be st forall m in set p&abs(m-i)>=abs(z-i)in z)({x|x in set{1,...,9**7}&forall y in set{2,...,1003}&y<>x=>x mod y<>0})

설명:

f(i)==                                        /* f is a function which takes a nat1 (natural number not including 0)*/
(lambda p:set of nat1                         /* define a lambda which takes a set of nat1*/
&let z in set p be st                         /* which has an element z in the set such that */
forall m in set p                             /* for every element in the set*/
&abs(m-i)                                     /* the difference between the element m and the input*/
>=abs(z-i)                                    /* is greater than or equal to the difference between the element z and the input */
in z)                                         /* and return z from the lambda */
(                                             /* apply this lambda to... */
{                                             /* a set defined by comprehension as.. */
x|                                            /* all elements x such that.. */ 
x in set{1,...,9**7}                          /* x is between 1 and 9^7 */
&forall y in set{2,...,1003}                  /* and for all values between 2 and 1003*/
&y<>x=>x mod y<>0                             /* y is not x implies x is not divisible by y*/
} 
)


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