Що дивна функція


45

Вашим завданням тут буде реалізувати функцію 1, яка формує перестановку на додатні цілі числа (Біекція з натуральних чисел на себе). Це означає, що кожне додатне ціле число повинно з’явитися рівно один раз у перестановці. Улов - ваша функція повинна мати більшу ймовірність вивести непарне число, ніж парне число.

Зараз це може здатися дивним чи неможливим. Напевно, є стільки ж непарних чисел, скільки парні числа? І хоча ця інтуїція правильна для кінцевих множин, вона насправді не відповідає безмежним множинам. Наприклад, візьміть таку перестановку:

1 3 2 5 7 4 9 11 6 13 15 8 17 19 10 21 23 12 25 27 14 29 31 16 33 35 18 37 39 20 41 43 22 45 47 24 49 51 26 53 55 ...

Якщо ви берете будь-який підрозділ послідовності розміром більше вас буде принаймні стільки непарних чисел, скільки парних чисел, таким чином, здається, що ймовірність того, що будь-який випадковий додаток є непарним, більша, ніж парний. Ви також зазначите, що кожне число непарне або парне число з часом з’явиться в послідовності і може з’явитися лише один раз. Таким чином, послідовність є справжньою перестановкою.1

Визначення ймовірності

Щоб уникнути плутанини чи неоднозначності, я чітко викладу, що розуміється під вірогідністю цього питання.

Скажімо, у нас є функція . Імовірність того, що число є непарним, буде визначено як межа відношення непарних членів множини до розміру безлічі міру тяжіє до нескінченності.ff{1n}n

limn|{x:x{1n},odd(f(x))}|n

Наприклад, вищезгадана функція мала б ймовірність непарності 2/3 .


Це тому відповіді будуть набиратись у байтах, менша кількість байтів - краща.


Додаткові виклики

Ось кілька цікавих ідей, з якими можна пограти і, можливо, спробувати здійснити. Вони просто для розваги і жодним чином не впливають на оцінка. Деякі з них навіть не є прийнятними рішеннями цього виклику, і відповідь, яка включає лише рішення для викликів 2 або 3, не є коректною відповіддю і може бути видалена .

  • Напишіть перестановку з непарною ймовірністю 1 . (це можливо)

  • Напишіть перестановку, яка має більше непарних чисел, ніж парні числа у для будь-якого але має непарну ймовірність .f{1n}n1/2

  • Напишіть перестановку, яка не має визначеної ймовірності (тобто немає обмеження).


1: Тут функція буде означати програму або функцію. Це просто фрагмент коду, який приймає вклад і виробляє вихід.

Відповіді:


22

Желе , 7 байт

Æf^<¥4P

Міняє місцями 2 с та 3 с у основній факторизації вхідних даних. Імовірність шансів становить 2/3 .

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

Як це працює

Æf^<¥4P  Main link. Argument: n

Æf       Compute all prime factors of n, with duplicates.
    ¥4   Combine the two links to the left into a dyadic chain and call it with
         right argument 4.
   <       Compare each prime factor with 4. Yields 1 for 2 and 3, 0 otherwise.
  ^        Bitwise XOR the results with the corresponding prime factors.
         This maps 2 to 3, 3 to 2, and all other primes to themselves.
      P  Take the product of the resulting primes.

Ця відповідь досить розумна. Я вважаю, що я розумію, чому це працює, але ви, можливо, захочете включити доказ того, що він працює, тому що спочатку я вважав це неінтуїтивним.
Пшеничний майстер

6
Доказ того, що це перестановка: функція є власною оберненою. Доказ співвідношення: ймовірність того, що вихід є непарним, є ймовірність, що в оригіналі не було факторів 3, а саме тоді, коли він не ділиться на три. Такий шанс становить 2/3.
Томмедінг

15

Лушпиння , 11 10 байт

-1 байт завдяки Леву і дещо іншій функції

Це має дивну ймовірність 1

!uΣz:NCNİ1

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

Він індексує послідовність:

[1,2,3,5,7,9,11,4,13,15,17,19,21,23,25,27,29,6,31,33]
1 odd, 1 even, 5 odd, 1 even, 9 odd, 1 even, 13 odd...

Пояснення

!               Index the following sequence (1-indexed)
 u              remove duplicates                     [1,2,3,5,7,9,11,4,13,15...]
  Σ              Concatenate                          [1,1,2,3,5,3,7,9,11,4,13..]
   z:            Zipwith append                       [[1,1],[2,3,5],[3,7,9,11]..
     N          Natural numbers
      CNİ1      Odd numbers cut into lists of lengths [[1],[3,5],[7,9,11]...]
                corresponding to the Natural numbers

1
Чи можете ви пояснити функцію?
Пшеничний майстер

1 байт менше, використовуючи nub: tio.run/##yygtzv6vkFuce3jboeX6PsqqRrmPmhof7lhcdGjbf8XSc4urrPyc/…
Лев,


8

Лушпиння , 8 байт

!uΣzeİ1N

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

Це реалізує приклад послідовності ( 1,3,2,5,7,4...).

Пояснення

!uΣzeİ1N
   ze       zip together
     İ1       the odd numbers
       N      with the natural (positive) numbers
  Σ         flatten the resulting list
 u          remove duplicates
!           index into the obtained sequence with the input

7

Усі роблять виклик 1, тому давайте зробимо два інших.

Perl 6 , 26 байт - виклик 2

{($_==1)+$_-(-1)**($_%%2)}

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

Це просто 1 3 2 5 4 7 6...У парній кількості термінів завжди є 2 більш непарні числа, ніж парні. У непарному числі - ще 1. Однак це чітко обмежено (n+2)/(2n+2) -> ½.


Perl 6 , 70 байт - виклик 3

{((1,),(2,4),->@a,@ {@(map(@a[*-1]+2*(*+1),^(4*@a)))}...*).flat[$_-1]}

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

Справді, це жахливо гольф. Він індексує послідовність, яка містить 2⁰ непарних чисел, потім 2¹ парних, потім 2 ² непарних, потім 2³ парних і так далі.

Ймовірність після n таких "блоків", якщо n непарних, дорівнює (2⁰ + 2² + 2⁴ + ... + 2ⁿ⁻¹) / (2ⁿ-1). Сума в чисельнику дорівнює ⅓ (4 ½ (n + 1) - 1) = ⅓ (2 n + 1 - 1). Тож ймовірність після непарної кількості блоків ⅔ (в межі).

Якщо ми додамо ще один блок (і закреслимо парне число їх n + 1), однак ми не додали непарних чисел (чисельник залишається однаковим), але зараз є (2 n + 1 - 1) числа . Круглі дужки скасовуються, і ми отримуємо ймовірність in (в межі).

Мабуть, це має бути дві різні точки кластера,, і ⅓, щоб переконатися, що межа не існує, але це насправді не доводить. Мою спробу зробити твердий, суворий доказ можна знайти у цій відповіді Math.SE: https://math.stackexchange.com/a/2416990/174637 . Бажаючі помилки вітаються.


Perl 6 , 39 байт - основний виклик.

{my$l=$_ div 3;$_%3??2*($_-$l)-1!!2*$l}

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

Хоча я і розмістив цю відповідь через проблеми 2 та 3, які пропонували приємний загадковий загадку, є сувора вимога, щоб усі відповіді містили рішення основної задачі. Ось це тоді.

Це приклад послідовності.


2
Це додаткові проблеми. Щоб ця відповідь була правдивою, ви повинні запропонувати рішення основної проблеми. Рішення для виклику 1 - це також вирішення основної задачі, але рішення проблем 2 або 3 - ні.
Пітер Тейлор

1
Що ж, додаткові виклики - це те, що мені цікаво в цьому питанні. Основна проблема не є. Але я все-таки додав якесь рішення.
Раміллі

Я попросив підтвердити те, що ваша відповідь на Виклик 3 не має обмежень у цьому питанні Math.SE: math.stackexchange.com/questions/2416053/…
Кевін -

@Kevin, дякую за запитання. Я думаю, що я, можливо, тебе збентежив. Я був повністю впевнений, що це нормально. Єдине, що я часто докладаю речі досить жорстко для себе, просто для душевного спокою (адже ваші ноги можуть ковзати досить легко, особливо, коли ви керуєте нескінченними предметами, як це) - і я цього не робив тут. Це все, що я хотів сказати.
Раміллі

1
@Kevin - так зрештою, я подолав свою лінь (героїчний вчинок!) І зробив доказ. Я опублікував це як відповідь на ваше запитання Math.SE. Сподіваємось, це нормально (робити таку роботу вночі - це не дуже гарна ідея :—)). Виявилося, що це не так жахливо, як я спочатку думав.
Раміллі

5

Мозок-Флак , 120 байт

(({})<{{({}[()]<({}(()[{}]))>)}{}({}[({})]<({}<>{}<({}())>)><>)}>)<>({}[()]){{}((<>{}<>[{}]){}[()])<>}{}{(({}){})<>{}}<>

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

Виконує таку функцію:

функція

Ця функція генерує послідовність

2 4 1 6 3 5 7 8 9 11 13 15 17 19 21 10 23 25 27 29...

Функція має непарну ймовірність 1


4

R, 82 байти (додатковий виклик 1)

f<-function(n){if(sqrt(n)==floor(sqrt(n))){2*sqrt(n)}else{2*(n-floor(sqrt(n)))-1}}

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

Якщо вхід ідеальний квадрат, дає парне число. В іншому випадку дає непарне число. Досконалі квадрати мають природну щільність 0, а це означає, що ця послідовність дає непарні числа з вірогідністю 1.


Чи можете ви додати посилання TIO, будь ласка?
H.PWiz




3

C (gcc) , 29 байт

f(n){return n&3?n+n/2|1:n/2;}

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

Кожне четверте число є парним:

1 3 5   7 9 11   13 15 17   19 21 23   25 27 29
      2        4          6          8          10

Додатковий виклик 1, 52 байти

f(n,i){for(i=0;n>>i/2;i+=2);return n&n-1?2*n-i-1:i;}

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

Повертає 2 * (x + 1), якщо n дорівнює 2 x і послідовних непарних чисел інакше:

    1   3 5 7   9 11 13 15 17 19 21    23 25
2 4   6       8                     10      

3

Мозг-Флак , 140 138 136 байт

({}<(((()())()()))((<>[()])[()()])>){({}[()]<(({}(({}({}))[({}[{}])]))[({}[{}])]<>(({}(({}({}))[({}[{}])]))[({}[{}])])<>)>)}{}({}<{}{}>)

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

Пояснення

Це виконує аналогічну функції, запропонованій у питанні.

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

Він працює в основному на основі фрагмента, який я зробив для того, щоб розгорнути стек на 3 розміри.

(({}(({}({}))[({}[{}])]))[({}[{}])])

Ми встановили два стеки: один із значеннями акумулятора (два непарні одні парні) та один із числами 4 4 2. Кожну ітерацію ми розгортаємо обидві стеки та додаємо верх лівого стека до вершини правого стека.

(({}(({}({}))[({}[{}])]))[({}[{}])]<>(({}(({}({}))[({}[{}])]))[({}[{}])])<>)

Це збільшить кожне непарне число на 4, а одне парне число - на 2. Коли ми перебираємо цикл, ми отримуємо шаблон 2 непарних 1 парних, при цьому кожне додатне ціле число потрапляє. Таким чином , ми просто цикл nрази nбути вхід. Це має асимптотичну ймовірність 2/3 .


2

Желе , 10 байт

ÆE;0ṭ2/FÆẸ

Імовірність шансів становить 2/3 .

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

Як це працює

ÆE;0ṭ2/FÆẸ  Main link. Argument: n

ÆE          Compute the exponents of n's prime factorization.
  ;0        Append a 0.
     2/     Reduce all pairs by...
    ṭ         tack, appending the left argument to the right one.
            This inverts all non-overlapping pairs of exponents.
       F    Flatten the result.
        ÆẸ  Consider the result a prime factorization and compute the corresponding
            integer.


1

Пакетна, 36 байт

@cmd/cset/an=%1*2,(-~n*!!(n%%3)+n)/3

Реалізує послідовність, задану у питанні.


1

JavaScript, 23 байти

n=>n/2+n/2%2+(n%4&&n-1)

Вихід: 1, 3, 5, 2, 7, 9, 11, 4, 13, 15, 17, 6, 19, 21, 23, 8 ...

  • Для всіх n = 4k:
    • f (n) = n / 2 = 2k
  • Для всіх n = 4k + b
    • f (n) = n / 2 + b / 2 + n - 1 = 3/2 * (4k + b) + 1/2 * b - 1 = 6k + 2b - 1

Завдання 2:

n=>n^(n>1)

Вихід: 1, 3, 2, 5, 4, 7, 6, 9, 8, 11, 10, 13, 12, 15, 14


n=>n%4?1.5*n|1:n/2на 5 байт коротше.
nwellnhof

1

CJam (21 байт)

{2b_(&!\_,2*\1$~+2b?}

Демонстрація в Інтернеті, що показує перші 32 виходи. Це анонімний блок (функція).

Це також є рішенням завдання 1: числа, відображені на парні числа, мають потужність 2, тому щільність парних чисел на перших n виходах дорівнює lg (n) / n, яка прагне до нуля.

Розсічення

{         e# Declare a block; let's call the input x
  2b      e#   Convert to base 2
  _(&     e#   Copy, pull out first digit (1) and set intersection with rest
  !       e#   Boolean not, so empty set (i.e. power of 2) maps to 1 and non-empty
          e#   to 0
  \_,2*   e#   Take another copy, find its length, and double it
  \1$~+   e#   Take the original base 2 array and append ~(2L) = -2L-1
  2b      e#   Convert from base 2, to get 2x-2L-1
  ?       e#   Take the 2L if it was a power of 2, and the 2x-2L-1 otherwise
}

1

Perl 40 байт

$,=$";$i=4;{say$i-3,$i/2,($i+=4)-5;redo}

1

Мозок-димохід , 88 байт

({}<(((<>)[()])[()()])>)<>(((()())()()))<>{({})({})({})({}[()]<({}<>({})<>)>)}{}{}({}){}

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

Пояснення

Це реалізує ту саму функцію, що і моя остання відповідь, але використовує модель FIFO Brain-Flueue для вирізання деяких кутів. Ось перші парові терміни, які він генерує.

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

Перша частина коду - це лише трохи налаштування, ми ставимо 0,-1,-3на перший стек і 2,4,4на другий стек. 2,4,4Використовуватиметься для перемикання парних і непарних чисел , так само , як я зробив у моєму Brain-Flak відповідь.

Потім обв'язуємо n разів, кожен раз додаючи верхній лівий стек до правого стека. Оскільки Brain-Flueue використовує черги на відміну від стеків, ці значення, природно, котуються, коли ми торкаємось їх, запобігаючи необхідності додаткового коду.


Чим відрізняється Flueue від Flak?
FantaC

@tfbninja Flueue використовує чергу замість стека.
Пшеничний майстер

але ... ви використовуєте інтерпретатора bflk ... як вам це зробити інакше
FantaC

@tfbninja -lflueueАргумент.
Пшеничний майстер

0

Python 2 , 46 104 55 байт

lambda n:2*((n-int(n**.5))+.5,n**.5-1)[n!=1>0==n**.5%1]

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

Неправильно прочитайте питання, тепер правильно реалізована функція, яку можна використовувати для генерації послідовності замість тієї, яка генерує послідовність. Також виключається 0з набору можливих виходів.

Ймовірність знайти непарне додатне ціле число тепер сходиться до 1.


Це має повернути номер, а не набір / список, наскільки я зрозумів
Містер Xcoder

Також це не є правильною перестановкою, оскільки вона містить 0.
Містер Xcoder

@ Mr.Xcoder Дякую за те, що помітили.
Джонатан Фрех



0

Pyth , 9 байт

*Fmxd<d4P

Спробуйте тут! або Тестуйте більше за один раз!

Ви можете використовувати цей код для перевірки співвідношення непарних чисел до певного моменту. Замініть 10000бажаний ліміт (не встановлюйте його набагато вище, оскільки це помилки в пам'яті).

Km*Fmxk<k4PdS10000clf%T2KlK

Спробуйте тут .

Сказане дає приблизно 0,667 . Справжня ймовірність непарних випадків становить 2/3 . Цей підхід є рівнозначною реалізацією відповіді Денніса .


Пояснення

*Fmxd<d4P   Full program.

        P   Prime factors.
  m         Map over ^.
   x        Bitwise XOR between:
    d          The current prime factor.
     <d4       The integer corresponding to the boolean value of current factor < 4.
*F          Product of the list.


0

Луа, 67 53 байти

Пояснення, коли я закінчую гольф :)

Ця програма приймає ціле число за допомогою аргументів командного рядка як вхідне і виводить n-й елемент приклади послідовності в STDOUT

n=...print(n%3<1 and n/3*2or n+math.floor(n/3)+n%3-1)

Пояснення

n=...                              -- shorthand for the argument
print(                             -- prints out the result of the following ternary
     n%3<1                         -- if n is divisible by 3
       and n/3*2                   -- prints out the corresponding even number
       or n+math.floor(n/3)+n%3-1) -- else prints out the odd number

Четні числа цієї послідовності є і nчетвертим числом, і nкратним 3, отже, формули n%3*2достатньо для їх генерування.

Для непарних чисел це трохи важче. Виходячи з того, що ми можемо їх знайти залежно від поточного n, ми маємо наступну таблицю:

n       |  1   2   4   5   7   8   10   11  
target  |  1   3   5   7   9   11  13   15
target-n|  +0  +1  +1  +2  +2  +3  +3   +4

Виклик Давайте значення target-n i, ми можемо бачити , що кожен раз n%3==2, iзбільшується. Тут іде наша формула:

n+math.floor(n/3)+n%3-1

Непарні числа засновані nна тому, що ми додаємо i.

Значення iприростів з тією ж швидкістю, що і евклідовий поділ на 3, зі зміщенням. math.floor(n/3)дає нам коефіцієнт приросту та n%3-1дає нам компенсацію, завдяки чому це відбувається n%3==2замість n%3==0.


Один байт можна було легко зберегти, видаливши зайвий пробіл ( ...and (n/...).
Джонатан Фрех

@JonathanFrech вдалося врятувати 2 на цьому місці, повністю видаливши дужки, оскільки це and n/3*2orтак само добре
Катенкіо
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.