소수를 자연수 내에서 골프화하여 소수를 소수의 적절한 하위 세트에 매핑합니다. 사 함수

정의

  • 전단 사 함수 세트에서 S세트로는 T행 함수 ST이러한 하나 개 소자 T에서 정확히 하나 개의 요소에 의해 매핑된다 S.

  • 세트 내에서 전단 사 함수는 S 에서 전단 사 함수이다 SS.

  • 자연수는 보다 큰거나 같은 정수입니다 0.

  • 서브 세트는 S세트의 모든 요소가도 있음 세트 등이다 S.

  • 적절한 서브 세트는 S서브 세트 인 세트이다 S동일하지 않다 S.

직무

자연수를 입력으로 받아 자연수를 출력하는 프로그램 / 기능을 작성하십시오. 이는 전단 사 함수이어야하며, 프로그램 / 기능 하에서 소수의 화상은 {f(p) : p ∈ ℙ}, 한 부분 집합이어야 , 프라임 숫자이다.

채점

이것은 입니다. 바이트 단위의 최단 답변이 이깁니다. 표준 허점이 적용됩니다 .



답변

Mathematica, 54 48 바이트

±(t=x_?PrimeQ)=NextPrime@x
±n_:=Abs[n-1]/.t:>x-1

다음 bijection을 정의합니다.

 n  0, 1, 2, 3, 4, 5, 6,  7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, ...
±n  1, 0, 3, 5, 2, 7, 4, 11, 6, 8,  9, 13, 10, 17, 12, 14, 15, 19, ...

기본 아이디어는 각 소수를 다음에 매핑하여 적절한 하위 집합에 매핑되도록하는 것입니다. 결과적으로 2 에서 “간격”이 발생 합니다. 이 차이를 메우기 위해 4 에서 2 로 매핑 한 다음 서로의 복합 번호를 이전 복합 번호 로 매핑 하여 간격을 “버블 링”하려고합니다. 23 은 인접한 두 개의 소수뿐 이므로 두 매핑을 모두 ” n-1 또는 소수 인 경우 n-2 ” 로 표현할 수 있습니다 . 마지막으로,이 매핑은 10으로 보내고 결국 n-1 의 절대 값을 취하여 01 로 다시 보냅니다 .


답변

MATL , 21 바이트

실수를 발견 한 Emigna 에게 감사합니다.

tZp?_Yq}q:Zp~fX>sG~E+

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

이것은 다음 bijection을 구현합니다. 아래에 프라임을 작성하고 비 프라임을 작성하십시오.

2  3  5  7 11 13 17 ...
0  1  4  6  8  9 10 ...

그런 다음 입력에서 화살표를 따라 출력을 얻습니다.

2 > 3 > 5 > 7 > 11 > 13 > 17 ...
^
0 < 1 < 4 < 6 <  8 <  9 < 10 ...

설명 된 코드

t       % Implicit input. Duplicate
Zp      % Is it a prime? Gives true / false
?       % If so
  _Yq   %   Next prime
}       % Else
  q     %   Subtract 1
  :     %   Range from 1 to that
  Zp~   %   Is each entry not a prime? Gives an array of true / false
  f     %   Find non-zero entries, i.e. non-primes. Will be empty for input 1
  X>    %   Maximum. This gives the greatest non-prime less than the input.
        %   Will be empty for input 1
  s     %   Sum. This is to transform empty into 0
  G~E   %   Push input, negate, times 2. This gives 2 for input 0, or 0 otherwise
  E     %   Add. This handles the case of input 0, so that it outputs 2
        % End (implicit). Display (implicit)

답변

젤리 , 14 바이트

Æn’’ÆP¿$ÆP?2¹?

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

Luis의 알고리즘을 사용합니다.


답변

자바 스크립트 (ES6), 82 77 75 바이트

Luis Mendo의 답변 과 동일한 논리를 구현합니다 .

f=(n,i=(P=(n,x=n)=>n%--x?P(n,x):x==1||-1)(x=n))=>x?x==n|P(n)-i?f(n+i,i):n:2

형식화 및 의견

f = (                   // given:
  n,                    // - n = input
  i =                   // - i = 'direction' to move towards
    (P = (n, x = n) =>  // - P = function that returns:
      n % --x ?         //   - 1 when given a prime
        P(n, x)         //   - -1 when given a composite number
      :                 //
        x == 1 || -1    //
    )(x = n)            // - x = copy of the original input
) =>                    //
  x ?                   // if the input is not zero:
    x == n | P(n) - i ? //   if n equals the input or doesn't match its primality:
      f(n + i, i)       //     do a recursive call in the chosen direction
    :                   //   else:
      n                 //     return n
  :                     // else:
    2                   //   return 2

데모

f=(n,i=(P=(n,x=n)=>n%--x?P(n,x):x==1||-1)(x=n))=>x?x==n|P(n)-i?f(n+i,i):n:2

for(n = 0; n < 50; n++) {
  console.log(n, '->', f(n));
}

답변

젤리 , 12 바이트

Æn_ḍ@¡ÆP?2»0

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

작동 원리

Æn_ḍ@¡ÆP?2»0  Main link. Argument: n (non-negative integer)

      ÆP?     If the input is prime:
Æn                Compute the next prime after n.
              Else:
   ḍ@¡   2        Do once if n is divisible by 2, zero times if not.
  _      2        Subtract 2.
              So far, we've mapped all primes to the next prime, all even integers
              (except 2) to the previous even integer, and all composite, odd,
              positive integers to themselves. In particular, 0 -> 2, but 0 doesn't
              have a preimage, so we need 0 -> 0.
          »0  Take the maximum of the result and 0, mapping 0 -> max(-2, 0) = 0.