Zagraj w golfa w obrębie liczb naturalnych, które odwzorowują liczby pierwsze na odpowiedni podzbiór liczb pierwszych

14

Definicje

  • Bijection z zestawu Sdo zestawu Tjest funkcją ze Sdo Ttakich, że jeden z elementów Tjest odwzorowywany przez dokładnie jeden element S.

  • Bijection w zestawie S jest bijection od Scelu S.

  • Te liczby naturalne są liczbami całkowitymi, które są większe lub równe 0.

  • Podzbiór zbioru Sjest ustawione tak, że każdy z elementów zestawu jest również S.

  • Podzbiorem zbioru Sjest zbiorem, który jest podzbiorem S, który nie jest równa S.

Zadanie

Napisz program / funkcję, która przyjmuje liczbę naturalną jako dane wejściowe i wyjściową liczbę naturalną. Musi to być bijection, a obraz liczb pierwszych w programie / funkcji {f(p) : p ∈ ℙ}, musi być odpowiednim podzbiorem , gdzie są liczby pierwsze.

Punktacja

To jest . Najkrótsza odpowiedź w bajtach wygrywa. Obowiązują standardowe luki .

Leaky Nun
źródło

Odpowiedzi:

17

Mathematica, 54 48 bajtów

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

Definiuje następujący 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, ...

Podstawową ideą jest mapowanie każdej liczby pierwszej na drugą, aby upewnić się, że są one mapowane na odpowiedni podzbiór. Powoduje to „lukę” przy 2 . Aby wypełnić tę lukę, chcemy zmapować 4 do 2, a następnie siebie nawzajem liczbę zespoloną na poprzednią liczbę złożoną, aby „powiększyć” lukę. Ponieważ 2 i 3 są jedynymi dwoma sąsiadującymi liczbami pierwszymi, możemy wyrazić oba te odwzorowania jako „ n-1 lub jeśli jest to liczba pierwsza, to n-2 ”. W końcu to mapowanie kończy się wysyłaniem 1 na 0, a my wysyłamy 0 z powrotem do 1 , przyjmując wartość bezwzględną n-1 .

Martin Ender
źródło
Czy potrzebujesz mapy 0?
Neil
@ Nee tak, ale i tak zmieniłem teraz bijection.
Martin Ender
8

MATL , 21 bajtów

Dzięki Emignie za wykrycie błędu, teraz poprawionego

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

Wypróbuj online!

To realizuje następujący bijection. Zapisz liczby pierwsze z rzędu, a niepierwsze poniżej:

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

Następnie dane wyjściowe uzyskuje się zgodnie ze strzałką na wejściu:

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

Wyjaśniony kod

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)
Luis Mendo
źródło
3

JavaScript (ES6), 82 77 75 bajtów

Realizuje tę samą logikę, co odpowiedź Luisa 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

Sformatowane i skomentowane

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

Próbny

Arnauld
źródło
2

Galaretka , 12 bajtów

Æn_ḍ@¡ÆP?2»0

Wypróbuj online!

Jak to działa

Æ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.
Dennis
źródło
Umm, proszę dodać wyjaśnienie?
Erik the Outgolfer,
@EriktheOutgolfer Dodano.
Dennis
Dobrze, teraz więcej ludzi może zrozumieć ten bałagan ... co jest zbyt oczywiste, dlaczego o tym nie pomyślałem?
Erik the Outgolfer,