Гольф біекція в натуральних числах, які відображають праймес до належного набору простих


14

Визначення

  • Біекція з набору Sдо набору Tє функцією від , Sщоб Tтаким чином, що один з елементів в Tзіставляються рівно один елементом S.

  • Біекція в наборі S є біекція від Sдо S.

  • В натуральних числах цілі числа , які більше або дорівнює 0.

  • Підмножина безлічі Sявляє собою набір таким чином, що кожен елемент в наборі також S.

  • Власне підмножина безлічі Sявляє собою набір , який є підмножиною , Sяке не дорівнює S.

Завдання

Напишіть програму / функцію, яка приймає натуральне число як вхідне та виводить натуральне число. Це має бути біекція, а зображення простих чисел під програмою / функцією {f(p) : p ∈ ℙ}, повинно бути належним підмножиною , де прості числа.

Оцінка балів

Це . Найкоротша відповідь у байтах виграє. Застосовуються стандартні лазівки .


Відповіді:


17

Математика, 54 48 байт

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

Визначає наступні біекції:

 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, а потім один одного складеним номером до попереднього складеного числа, щоб «роздути» проміжок. Оскільки 2 і 3 є єдиними двома суміжними праймерами, ми можемо виразити обидва ці відображення як " n-1 або якщо це просте значення, то n-2 ". Нарешті, це відображення закінчується надсиланням 1 до 0, і ми змушуємо його відправляти 0 назад до 1 , приймаючи абсолютне значення n-1 .


Вам потрібно зробити карту 0?
Ніл

@Neil Я, але я все-таки змінив біекція.
Мартін Ендер

8

MATL , 21 байт

Дякуємо Еміньї за виявлення помилки, тепер виправлена

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

Спробуйте в Інтернеті!

Це реалізує наступний біекція. Запишіть праймери в рядок, а неприкметники нижче:

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)


3

JavaScript (ES6), 82 77 75 байт

Виконує ту ж логіку, що і у відповіді Луїса Мендо .

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

Демо


2

Желе , 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.

Гм, будь ласка, додайте пояснення?
Ерік Аутгольфер

@EriktheOutgolfer Додано.
Денніс

Добре, зараз більше людей може зрозуміти цей безлад ... що насправді занадто очевидно, чому я не придумав цього?
Ерік Аутгольфер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.