І все ж невикористані пари


21

Давайте визначимо послідовність натуральних чисел. Ми визначимо послідовність на парних числах, щоб бути подвоєною попереднього члена. Непарні показники послідовності будуть найменшими додатними цілими числами, які ще не з’являються в послідовності.

Ось перші терміни пари.

1,2,3,6,4,8,5,10,7,14,9,18,11,22,12,24,13,26,15,30

Ви також можете вважати це списком з'єднаних пар (n, 2n), де n - найменше невикористане додатне ціле число досі.

Завдання

Дано число n в якості вхідного розрахунку n- го доданку в цій послідовності.

Це тому ви повинні прагнути до мінімізації розміру вихідного коду, виміряного в байтах.

OEIS A036552


Справа в тому, що непарні показники послідовності будуть найменшими додатними цілими числами, які ще не з’являються в послідовності. не має значення, правда?
Adám

1
Також які пари ?
Adám

@ Adám Ні, це не так. Я не впевнений, що справляє на вас таке враження, можливо, я сказала це погано.
Пшеничний майстер

1
@ Adám Інший спосіб подумати послідовність полягає в тому, що вона складається з сполучених пар (n,2n)і кожне число з’являється лише один раз. Кожна пара вибирається якомога меншою, дотримуючись останнього обмеження.
Мартін Ендер

3
2-адичне оцінювання непарних елементів серії завжди парне. Можливо, комусь буде корисно.
CalculatorFeline

Відповіді:


11

Haskell, 40 байт

l(a:r)=a:2*a:l[x|x<-r,x/=2*a]
(l[1..]!!)

Нульова основа. lпоступово будує послідовність із ледачого списку решти цілих чисел.


7

JavaScript (ES6), 92 82 69 67 65 байт

n=>(F=i=>i^n?F(a[b=i&1?2*b:(g=k=>a[k]?g(k+1):k)(1)]=-~i):b)(a={})

Як?

Ми відстежуємо:

  • Останнє вставлене значення b .
  • Усі раніше зустрічаються значення в таблиці пошуку a .

Всередині ми використовуємо індекс i, заснований на 0 . Тому непарна і парна поведінка перевернута:

  • У непарних позиціях наступне значення просто 2 * b.

  • У парних положеннях ми використовуємо рекурсивну функцію g () та таблицю пошуку a для визначення найменшого відповідного значення:

    (g = k => a[k] ? g(k + 1) : k)(1)

Щоб зберегти кілька байтів, i ініціалізується, {}а не 0. Це змушує нас використовувати:

  • i^nпорівнювати i з n, оскільки, ({}) ^ n === nоднак, ({}) - nоцінює до NaN.
  • -~iзбільшити i , тому ({}) + 1що створив би рядок.

Демо



5

Python 3 , 80 72 69 байт

-7 байт дякую містеру Xcoder !

f=lambda n:n and[f(n-1)*2,min({*range(n+1)}-{*map(f,range(n))})][n%2]

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


1
Ви можете поправити set(...)на {{* ...} на 78 байт
містер Xcoder

@ Zacharý Ви зверталися до мого коментаря? Якщо так, набір в Python 3 може бути {*...}замість set(...).
Містер Xcoder

Я коментуючи, не замислюючись, я зрозумів, що через декілька {...for...in...}мит зрозумів, що має бути більше бай.
Zacharý

Насправді це дозволить заощадити 4 байти, оскільки ви використовуєте його двічі
містер Xcoder






3

05AB1E , 16 15 14 байт

1-індексований.
Використовує той факт, що двійкове подання елементів за непарними індексами в послідовності закінчується парним числом нулів: A003159 .

Lʒb1¡`gÈ}€x¹<è

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

Пояснення

L                 # range [1 ... input]
 ʒ      }         # filter, keep only elements whose
  b               # ... binary representation
   1¡             # ... split at 1's
     `gÈ          # ... ends in an even length run
         €x       # push a doubled copy of each element in place
           ¹<è    # get the element at index (input-1)

3

Python 2 , 59 51 49 байт

f=lambda n,k=2:2/n%-3*(1-k)or f(n+~(k&-k)%-3,k+1)

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

Фон

Кожне додатне n ціле число може бути виражено однозначно як n = 2 o (n) c (n) , де c (n) непарне.

Нехай ⟨A пп> 0 буде послідовність з провокаційною специфікації.

Ми стверджуємо, що для всіх натуральних чисел n , o (a 2n-1 ) є парним. Оскільки o (a 2n ) = o (2a 2n-1 ) = o (a 2n-1 ) + 1 , це еквівалентно твердженню, що o (a 2n ) завжди непарне.

Припустимо, що твердження хибне, і нехай 2m-1 є першим непарним індексом послідовності таким, що o (a 2m-1 ) є непарним. Зверніть увагу, що це робить 2m першим парним індексом послідовності таким, що o (a 2m-1 ) є парним.

про (а 2m-1 ) непарній і 0 парне, так 2m-1 ділиться на 2 . За визначенням, 2m-1 являє собою найменше ціле позитивне число поки не з'являється в послідовності , а це означає , що 2m-1 /2 , має бути , з'явилися раніше. Нехай K бути (перший) індекс в 2m-1 /2 в .

Оскільки o (a k ) = o (a 2m-1 /2) = o (a 2m-1 ) - 1 парне, мінімальність n означає, що k непарна. У свою чергу, це означає , що до + 1 = 2а до = а 2m-1 , що суперечить визначенню в 2m-1 .

Як це працює

ще не прийде


3

R , 70 69 65 байт

function(n){for(i in 2*1:n)F[i-1:0]=which(!1:n%in%F)[1]*1:2
F[n]}

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

Анонімна функція, яка бере один аргумент. Fза замовчуванням до FALSEабо 0так, що алгоритм правильно оцінює, що в послідовності ще немає жодних додатних цілих чисел.

Алгоритм генерує пар в forциклі наступним чином (де iйде від , 2щоб 2nшлях 2):

           which(!1:n%in%l)[1]     # the missing value
                              *1:2 # keep one copy the same and double the next
l[i-1:0]=                         # store into l at the indices i-1 and i


2

Perl 6 , 50 байт

{(1,{@_%2??2*@_[*-1]!!first *∉@_,1..*}...*)[$_]}

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

  • 1, { ... } ... *являє собою ліниво генеровану нескінченну послідовність, де кожен додаток після першого забезпечується кодом, обмеженим дужками. Оскільки блок посилається на @_масив, він отримує всю поточну послідовність у цьому масиві.
  • Якщо поточна кількість елементів непарне ( @_ % 2), ми генеруючи навіть індексований елемент, так що наступний елемент є подвійним останнім елементом ми маємо до цих пір: 2 * @_[*-1].
  • В іншому випадку, ми отримуємо перше позитивне ціле число , яке ще не з'являється в послідовності: first * ∉ @_, 1..*.
  • $_є аргументом зовнішньої функції. Він індексується у нескінченну послідовність, надаючи зворотному значенню функції.

1

Математика, 82 байти

(s={};a=1;f=#;While[f>0,If[s~FreeQ~a,s~AppendTo~{a,2a}];a++;f--];Flatten[s][[#]])&

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


58 байт у Mathematica (хоча, мабуть, я повинен просто розмістити окрему відповідь, оскільки ідея зовсім інша).
notjagan

Ви скопіювали це з посилання OEIS?
J42161217

Я змінив його, щоб він відповідав завданню та більше займався гольфами, але це більш-менш те саме, що посилання на OEIS.
notjagan

1
@ не публікуйте нову відповідь, якщо ви хочете, і автору
довіряйте


1

C # (Visual C # Interactive Compiler) , 82 байти

x=>{int y=1;for(var s="";x>2;x-=2)for(s+=2*y+":";s.Contains(++y+""););return x*y;}

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

-6 байт завдяки @ASCIIOnly!


C # 8 може бути занадто новим для поширення в онлайн-перекладачах на даний момент, додавши до того, що csi - це моно-річ, тож вам доведеться чекати, коли Mono реалізує її та додасть її до стабільної збірки (якщо вона не буде ' т уже)
лише для ASCII

на жаль, перевірити це в C #
лише для ASCII

Використовувати це для початку? Але так, це не здається простою річчю. docs.microsoft.com/en-us/dotnet/api / ...
Dana

1
86? - не думаю, :що потрібні дані, оскільки це буде найбільша кількість у списку
лише ASCII

Також 2.0=>2f
Dana

0

Clojure, 102 байти

#(nth(loop[l[0 1 2 3]i %](if(= i 0)l(recur(conj l(*(last l)2)(nth(remove(set l)(range))0))(dec i))))%)

Ітератує nрази для нарощування послідовності і повертає nth елемент, 1-індексований.


0

Рубін, 60 байт

->n,*a{eval"v+=1while a[v];a[v]=a[2*v]=v+v*n%=2;"*(n/2+v=1)}

0-індексований. Ми робимо циклічний n/2+1раз, генеруючи кожен раз два значення і зберігаючи їх, заповнюючи масив за їх індексами. v+v*n%2дає вихід, vабо v*2залежно від паритету n.



0

JavaScript (ES6), 60 65 байт

Ітераційне рішення.

n=>eval("for(s={},i=0;n;)s[++i]?0:(s[i+i]=--n)?--n?0:i+i:i")

Менше гольфу

n=>{
  s = {}; //hashtable for used values
  for(i=0; n; )
  {
    if ( ! s[++i] )
    {
      s[i*2] = 1; // remember i*2 is already used
      if (--n)
        if (--n)
          0;
        else
          result = i*2;
      else
        result = i;
    }
  }
  return result;  
}

Тест

F=
n=>eval("for(s={},i=0;n;)s[++i]?0:(s[i+i]=--n)?--n?0:i+i:i")

for (a=1; a < 50; a++)
  console.log(a,F(a))


0

Желе , 13 12 10 байт

ḤRọ2ḂĠZFị@

Для цього використовується спостереження з моєї відповіді Python .

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

Як це працює

ḤRọ2ḂĠZFị@  Main link. Argument: n

Ḥ           Unhalve; yield 2n.
 R          Range; yield [1, ... , 2n].
  ọ2        Compute the order of 2 in the factorization of each k in [1, ..., 2n].
    Ḃ       Bit; compute the parity of each order.
     G      Group the indices [1, ..., 2n] by the corresponding values.
      Z     Zip/transpose the resulting 2D array, interleaving the indices of 0
            with the indices of 1, as a list of pairs.
       F    Flatten. This yields a prefix of the sequence.
        ị@  Take the item at index n.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.