Послідовність зворотного та четвертого циклу


18

Уявіть собі шлях, що складається з <і >і закінчуючи в @, наприклад ,

><>@

Ходок починається з самої лівої клітини. Він пройде шлях таким чином:

  • Якщо ходок на @камері, він досяг мети і робиться.
  • Якщо ходунок знаходиться на >клітинку, весь шлях зміщується на один крок вправо, циклічно, беручи з собою ходок .
  • Якщо ходунок знаходиться на <клітинку, весь шлях зміщується на один крок вліво, циклічно, беручи ходунку з собою .
  • Після цього ходок робить один крок. Якщо він знаходиться на будь-якому кінці шляху, він віддаляється від кінця. Інакше він продовжує рухатися в тому напрямку, в якому рухався останнім кроком (ігноруючи поворот), ідучи спочатку праворуч.

Давайте попрацюємо над наведеним прикладом. Положення пішоходу позначено ^:

><>@   --rotate-->  @><>
^                    ^
step right (first step):
@><>   --rotate-->  ><>@
  ^                  ^
step right:
><>@   --rotate-->  @><>
  ^                    ^
step left (dead end):
@><>   --rotate-->  ><>@
  ^                  ^
step left:
><>@   --rotate-->  @><>
^                    ^
step left:
@><>   Goal reached!
^

Ходунок відвідав 6 осередків (включаючи стартову клітинку, а також @і рахуючи кожну клітинку так часто, як її відвідували).

Ось невеликий приклад, коли ходунка перевозиться по краях поворотом:

>>@   --rotate-->  @>>
^                   ^
step right (first step):
@>>   --rotate-->  >@>
  ^                ^
step right (dead end):
>@>   Goal reached!
 ^

Цього разу ходок відвідав 3 камери.

Ми можемо легко перетворити це на цілу послідовність:

  • Вам дано додатне ціле число N , наприклад 9.
  • Ви обчислюєте двійкове представлення цього цілого числа, наприклад 1001.
  • Потім включите 1в >і 0в , <і додати @: ><<>@.
  • Ми пов'язуємо з N кількість осередків, які відвідував ходок, у кількості, побудованій таким чином.

Першими кількома елементами отриманої послідовності є:

2, 3, 3, 4, 6, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6,
6, 10, 6, 10, 8, 8, 6, 10, 8, 8, 6, 6, 6, 6, 7, 7

Це може здатися досить довільним, але отримана послідовність насправді має багато структури:

введіть тут опис зображення

Для довідки, ви можете знайти перші 2048 номери послідовності в цій пастібі .

Змагання

Ви здогадалися: ви повинні обчислити вищевказану послідовність. Це можна зробити одним із трьох способів:

  • Ви можете створити нескінченну послідовність (поки це дозволяє пам'ять), або шляхом постійного виведення (розділеного нечисловими символами) значень, або використовуючи деяку форму нескінченного генератора на мовах, які їх підтримують. Якщо ви друкуєте нескінченний потік до STDOUT, вам не доведеться друкувати цифри по одному, але переконайтеся, що кожне число буде надруковано через обмежений час (і в порядку). Якщо ви використовуєте цю опцію, не слід брати жодних даних.
  • Ви можете взяти за вхід ціле число N і створити N- й член послідовності.
  • Ви можете взяти ціле число N в якості вхідного і виробляють все до в N - й член послідовності, або у вигляді списку або рядок , використовуючи однозначний роздільник.

Оскільки я не хочу штрафувати мови, які не можуть легко перетворити між базами, замість цілого числа N ви можете замість цього приймати двійкове представлення N , використовуючи 0s і 1s, як звичайно (як список або рядок), з найбільш -значний біт спочатку.

Ви можете написати програму або функцію, взявши введення через STDIN (або найближчу альтернативу), аргумент командного рядка або аргумент функції та вивівши результат через STDOUT (або найближчу альтернативу), значення повернення функції або параметр функції (out).

Діють стандартні правила .

Фон

Це фактично обчислює кількість "тиків" прямолінійному інтерпретатору моєї езотеричної мови програмування Лабіринт повинен інтерпретувати "шлях" як вихідний код. У цьому випадку "ходок" - це просто вказівник інструкції (який має положення та напрямок), @команда припиняє програму <і >є командами модифікації вихідного коду.


що з цього потрібно? 1, 2 чи 3 та як оцінюються наші подання
Abr001am

@ Agawa001 "Ви можете зробити один із трьох способів:" Виберіть будь-який із них, залежно від того, який ви вважаєте найлегшим для підходу та мови, якими ви хочете скористатися.
Мартін Ендер

Чому всі повторювані цифри сьогодні!?! codegolf.stackexchange.com/questions/78787/… : D
кіт

Відповіді:


6

Желе , 10 байт

ð+\ḤiḤoµL‘

Ця функція приймає єдине ціле число у вигляді списку його двійкових цифр як вхідне.

Алгоритм еквівалентний алгоритму з відповіді @ Agawa001 .

Спробуйте в Інтернеті! або генерувати перші 2048 числа .

Фон

Перерахуйте позиції під контуром від 0 до L , даючи загалом L + 1 позицій. L збігається кількість двійкових цифр числа N, що кодує шлях. У цих позначеннях ходунок починається в положенні 0 , цілі в положенні L .

З кожним кроком, який ходить пішохід, він стає на крок ближче до мети (у напрямку, яким він зараз йде). Крім того, з кожним кроком зсуву, залежно від того, ходить він із напрямом зсуву або проти нього, він або збільшує, або зменшує своє положення на 2 модуля L + 1 , або він залишається у поточному положенні.

Щоб змінити напрямок, він повинен приземлитися на положення L - 1 (звернене до L ) або положення 1 (звернене до 0 ), а потім переміститися в його бік. Наступний крок, який він зробить, поверне його до попереднього положення, зверненого в протилежний бік.

  • Якщо L парний, L - 1 непарний, тому він не може перейти зі свого вихідного положення до L-1 безпосередньо. Єдиний спосіб дістатися до нього - пройти через L , перенісшись до 0 і наступним кроком висадившись на 1 , а потім рухатися праворуч. Для цього потрібно просунути 2L позиції, що може бути виконано не менше L кроків.

    Однак, зробивши L кроків, не змінюючи напрямок, він досягне мети. Додаючи одну для вихідної комірки, ми отримуємо в цілому L + 1 відвіданих комірок.

  • Якщо L непарне, L - 1 парне, тому він може досягти цього положення, перемістивши (L - 1) / 2 рази вправо. Якщо позиція L-1 знаходиться під точкою 1 на той час, він переміститься в положення L , повернеться і перейде на положення L - 1 (звернене вліво).

    Це може статися або не статися до того, як він досяг своєї мети, тому для аналізу необхідно два випадки:

    • Якщо в двійковому розширенні N є менше (L + 1) / 2 випадків 1 , вжиття L кроків буде недостатньо, щоб повернути напрямок. Оскільки ці етапи L приводять ходу до своєї мети, додаючи одну для вихідної комірки, ми отримуємо в цілому L + 1 відвідуваних комірок.

    • Якщо в двійковому розширенні N є принаймні (L + 1) / 2 входження 1 , для переходу до ((L + 1) / 2) -го виникнення знадобляться I кроки, де я є початковою позицією цього явища з 1 .

      Таким чином, зробивши I кроки, ходок перебуває в положенні L - 1 , зверненому вліво. Щоб знову повернути напрямки, йому доведеться піти вперед вліво до позиції 1 . Однак, як і в парному випадку, оскільки (L - 1) - 1 непарне, для цього потрібно буде пройти 0 і зробити не менше кроків L.

      Оскільки початкова відстань до мети в лівому напрямку дорівнює 1 , після того, як я зробив кроки, ходок опиняється на відстані I + 1 від мети після зміни напрямків. Оскільки я <L , то маємо, що я + 1 ≤ L , тому наступні I + 1 кроки приведуть його до мети.

      Це дає загальну кількість I + I + 1 = 2I + 1 зроблених кроків. Додаючи одну для вихідної комірки, ми отримуємо в цілому 2I + 1 + 1 = 2 (I + 1) відвідуваних комірок у цьому випадку.

Як це працює

ð+\ḤiḤoµL‘  Main link. Argument: x (list of binary digits of N)

       µ    Monadic chain. Argument: x
        L   Compute L, the length of x.
         ‘  Increment to yield L + 1.

ð           Dyadic chain. Left argument: x. Right argument: L + 1
 +\         Compute the cumulative sum of x.
            This replaces the k-th one (and all zeroes to its right) with k.
   Ḥ        Unhalve; multiply all partial sums by 2.
    i       Find the first index of L + 1.
            This either gives I + 1, the 1-based index of the ((L + 1) / 2)-th one
            or 0 if the list doesn't contain L + 1.
            The result will be 0 if x contains less than (L + 1) / 2 ones
            or if L + 1 is an odd integer.
     Ḥ      Unhalve; yield either 2(I + 1) or 0.
      o     Logical OR with L + 1; if the previous operation returned a falsy
            value (i.e., if it yielded 0), replace that value with L + 1.

9

Матлаб (оцінка = 230, n = інф)

function w(s,f),b=[];e=0;for i=s:f,a=dec2bin(i);c=find(a=='1');g=numel(a)+1;if numel(c)>=g/2;if mod(g,2)==1,fprintf('%d ',g);else,d=c(g/2);fprintf('%d ',2*d);end,else,fprintf('%d ',g);end,e=e+1;if(e==100),e=0;fprintf('\n');end;end
  • Функція приймає s як початковий індекс, а f як закінчення (введіть, infякщо ви хочете продовжувати нескінченно).
  • Ця функція може працювати назавжди без помітного затримки між двома видами виходів, h=1000000000000000000000000000000000000000000000000000;w(h,h+1)щоб переконатися.
  • Алгоритм дотримується математичного підходу, який я поясню пізніше, і він підтверджує список посилань Мартіна, спираючись на цю програму:

    stored=[2, 3, 3, 4, 6, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 10, 6, 10, 8, 8, 6, 10, 8, 8, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 14, 8, 8, 8, 14, 8, 14, 12, 12, 8, 8, 8, 14, 8, 14, 12, 12, 8, 14, 12, 12, 10, 10, 10, 10, 8, 8, 8, 14, 8, 14, 12, 12, 8, 14, 12, 12, 10, 10, 10, 10, 8, 14, 12, 12, 10, 10, 10, 10, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 18, 10, 10, 10, 10, 10, 10, 10, 18, 10, 10, 10, 18, 10, 18, 16, 16, 10, 10, 10, 10, 10, 10, 10, 18, 10, 10, 10, 18, 10, 18, 16, 16, 10, 10, 10, 18, 10, 18, 16, 16, 10, 18, 16, 16, 14, 14, 14, 14, 10, 10, 10, 10, 10, 10, 10, 18, 10, 10, 10, 18, 10, 18, 16, 16, 10, 10, 10, 18, 10, 18, 16, 16, 10, 18, 16, 16, 14, 14, 14, 14, 10, 10, 10, 18, 10, 18, 16, 16, 10, 18, 16, 16, 14, 14, 14, 14, 10, 18, 16, 16, 14, 14, 14, 14, 12, 12, 12, 12, 12, 12, 12, 12, 10, 10, 10, 10, 10, 10, 10, 18, 10, 10, 10, 18, 10, 18, 16, 16, 10, 10, 10, 18, 10, 18, 16, 16, 10, 18, 16, 16, 14, 14, 14, 14, 10, 10, 10, 18, 10, 18, 16, 16, 10, 18, 16, 16, 14, 14, 14, 14, 10, 18, 16, 16, 14, 14, 14, 14, 12, 12, 12, 12, 12, 12, 12, 12, 10, 10, 10, 18, 10, 18, 16, 16, 10, 18, 16, 16, 14, 14, 14, 14, 10, 18, 16, 16, 14, 14, 14, 14, 12, 12, 12, 12, 12, 12, 12, 12, 10, 18, 16, 16, 14, 14, 14, 14, 12, 12, 12, 12, 12, 12, 12, 12, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 22, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 22, 12, 12, 12, 12, 12, 12, 12, 22, 12, 12, 12, 22, 12, 22, 20, 20, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 22, 12, 12, 12, 12, 12, 12, 12, 22, 12, 12, 12, 22, 12, 22, 20, 20, 12, 12, 12, 12, 12, 12, 12, 22, 12, 12, 12, 22, 12, 22, 20, 20, 12, 12, 12, 22, 12, 22, 20, 20, 12, 22, 20, 20, 18, 18, 18, 18, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 22, 12, 12, 12, 12, 12, 12, 12, 22, 12, 12, 12, 22, 12, 22, 20, 20, 12, 12, 12, 12, 12, 12, 12, 22, 12, 12, 12, 22, 12, 22, 20, 20, 12, 12, 12, 22, 12, 22, 20, 20, 12, 22, 20, 20, 18, 18, 18, 18, 12, 12, 12, 12, 12, 12, 12, 22, 12, 12, 12, 22, 12, 22, 20, 20, 12, 12, 12, 22, 12, 22, 20, 20, 12, 22, 20, 20, 18, 18, 18, 18, 12, 12, 12, 22, 12, 22, 20, 20, 12, 22, 20, 20, 18, 18, 18, 18, 12, 22, 20, 20, 18, 18, 18, 18, 16, 16, 16, 16, 16, 16, 16, 16, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 22, 12, 12, 12, 12, 12, 12, 12, 22, 12, 12, 12, 22, 12, 22, 20, 20, 12, 12, 12, 12, 12, 12, 12, 22, 12, 12, 12, 22, 12, 22, 20, 20, 12, 12, 12, 22, 12, 22, 20, 20, 12, 22, 20, 20, 18, 18, 18, 18, 12, 12, 12, 12, 12, 12, 12, 22, 12, 12, 12, 22, 12, 22, 20, 20, 12, 12, 12, 22, 12, 22, 20, 20, 12, 22, 20, 20, 18, 18, 18, 18, 12, 12, 12, 22, 12, 22, 20, 20, 12, 22, 20, 20, 18, 18, 18, 18, 12, 22, 20, 20, 18, 18, 18, 18, 16, 16, 16, 16, 16, 16, 16, 16, 12, 12, 12, 12, 12, 12, 12, 22, 12, 12, 12, 22, 12, 22, 20, 20, 12, 12, 12, 22, 12, 22, 20, 20, 12, 22, 20, 20, 18, 18, 18, 18, 12, 12, 12, 22, 12, 22, 20, 20, 12, 22, 20, 20, 18, 18, 18, 18, 12, 22, 20, 20, 18, 18, 18, 18, 16, 16, 16, 16, 16, 16, 16, 16, 12, 12, 12, 22, 12, 22, 20, 20, 12, 22, 20, 20, 18, 18, 18, 18, 12, 22, 20, 20, 18, 18, 18, 18, 16, 16, 16, 16, 16, 16, 16, 16, 12, 22, 20, 20, 18, 18, 18, 18, 16, 16, 16, 16, 16, 16, 16, 16, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 22, 12, 12, 12, 12, 12, 12, 12, 22, 12, 12, 12, 22, 12, 22, 20, 20, 12, 12, 12, 12, 12, 12, 12, 22, 12, 12, 12, 22, 12, 22, 20, 20, 12, 12, 12, 22, 12, 22, 20, 20, 12, 22, 20, 20, 18, 18, 18, 18, 12, 12, 12, 12, 12, 12, 12, 22, 12, 12, 12, 22, 12, 22, 20, 20, 12, 12, 12, 22, 12, 22, 20, 20, 12, 22, 20, 20, 18, 18, 18, 18, 12, 12, 12, 22, 12, 22, 20, 20, 12, 22, 20, 20, 18, 18, 18, 18, 12, 22, 20, 20, 18, 18, 18, 18, 16, 16, 16, 16, 16, 16, 16, 16, 12, 12, 12, 12, 12, 12, 12, 22, 12, 12, 12, 22, 12, 22, 20, 20, 12, 12, 12, 22, 12, 22, 20, 20, 12, 22, 20, 20, 18, 18, 18, 18, 12, 12, 12, 22, 12, 22, 20, 20, 12, 22, 20, 20, 18, 18, 18, 18, 12, 22, 20, 20, 18, 18, 18, 18, 16, 16, 16, 16, 16, 16, 16, 16, 12, 12, 12, 22, 12, 22, 20, 20, 12, 22, 20, 20, 18, 18, 18, 18, 12, 22, 20, 20, 18, 18, 18, 18, 16, 16, 16, 16, 16, 16, 16, 16, 12, 22, 20, 20, 18, 18, 18, 18, 16, 16, 16, 16, 16, 16, 16, 16, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 12, 12, 12, 12, 12, 12, 12, 22, 12, 12, 12, 22, 12, 22, 20, 20, 12, 12, 12, 22, 12, 22, 20, 20, 12, 22, 20, 20, 18, 18, 18, 18, 12, 12, 12, 22, 12, 22, 20, 20, 12, 22, 20, 20, 18, 18, 18, 18, 12, 22, 20, 20, 18, 18, 18, 18, 16, 16, 16, 16, 16, 16, 16, 16, 12, 12, 12, 22, 12, 22, 20, 20, 12, 22, 20, 20, 18, 18, 18, 18, 12, 22, 20, 20, 18, 18, 18, 18, 16, 16, 16, 16, 16, 16, 16, 16, 12, 22, 20, 20, 18, 18, 18, 18, 16, 16, 16, 16, 16, 16, 16, 16, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 12, 12, 12, 22, 12, 22, 20, 20, 12, 22, 20, 20, 18, 18, 18, 18, 12, 22, 20, 20, 18, 18, 18, 18, 16, 16, 16, 16, 16, 16, 16, 16, 12, 22, 20, 20, 18, 18, 18, 18, 16, 16, 16, 16, 16, 16, 16, 16, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 12, 22, 20, 20, 18, 18, 18, 18, 16, 16, 16, 16, 16, 16, 16, 16, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 13];
    b=[];for i=1:numel(stored)
    a=dec2bin(i);
    c=find(a=='1');
    if numel(c)>=(numel(a)+1)/2
    if mod(numel(a)+1,2)==1
    b=[b numel(a)+1];
    else
    d=c((numel(a)+1)/2);
    b=[b 2*d];
    end
    else
    b=[b numel(a)+1];
    end
    end
    for i=1:numel(stored)
    if (b(i))
    if b(i)~=stored(i)
    'error',
    end
    end
    end
    
  • Оскільки алгоритм перевіряє 2048 перших тестових корпусів, я сліпо припускаю, що це було б для будь-якого тестового випадку, тому мій алгоритм працює щодо декількох властивостей, які я виявив у цьому процесі, без болю зсуву та переміщення вказівника:

    1 - якщо подвійне число 1 у двійковому перекладі не перевищує довжину послідовності, Lтому вихід єL+1

    2- якщо довжина послідовності є парною, а попередня умова не встановлена, тож вихід є однаковим L+1

    3- в іншому випадку вихід удвічі більший за L/2показник 1.


Чи можете ви уточнити, що ви маєте на увазі під "вихід удвічі більший за L / 2-й індекс 1." ? Це неймовірно незрозуміло.
орл

@orlp у цій послідовності 10010001, друга частота 1 - 4, 2 - 8.
Abr001am,

1
Це може бути збільшено до принаймні 89 байт a=dec2bin(input(''));c=find(a=='1');g=nnz(a)+1;if nnz(c)<g/2|mod(g,2);g,else,2*c(g/2),end, що дає лише один елемент послідовності.
Девід

8

Пітона, 122 119 113 110 108 107 103 байт

def l(b):
 p=e=w=len(b);d=i=1
 while e:p+=1-2*b[w-e];d*=2*(1!=d-p>~w)-1;p-=d;e=(e-d)%-~w;i+=1
 return i

Вводиться в якості списку двійкових цифр. Функція помічника для тестування:

b = lambda n: [int(d) for d in bin(n)[2:]]

Кредит Lynn за збереження 7 байт.


4
Пью-лава. : D
AdmBorkBork

Це не так багато, але ... я думаю, що p-d-1in[-2,w]зберігає один байт.
Лінн

Зміна заяви на d*=2*(1!=d-p>~w)-1економію ще чотирьох! ° v °
Лінн

@Lynn Приємне використання законів де Моргана!
orlp

Ви можете, будь ласка, надати широкий діапазон вихідних даних для порівняння з моєю? thanx
Abr001am

3

Python 2, 99 байт

def l(b):l=len(b);return(l>=sum(b)*2or l%2<1)and-~l or[i+1for i,c in enumerate(b)if b[i]][l/2]*2

Порт Python блискучої відповіді Agawa001.

Читаема версія:

def l(b):
    if len(b) >= 2*sum(b) or len(b)%2 == 0:
        return len(b) + 1

    return 2*[i+1 for i, c in enumerate(b) if b[i]][len(b)//2]

@ Agawa001 Я ще не зрозумів ваш алгоритм, але я експериментально перевірив його до 10 мільйонів.
orlp

3

MATL, 31 , 25 байт

BXHnQtHsy2/<w2\+~?2/Hfw)E

Це просто версія MATL алгоритму Agawa001, за винятком того, що він приймає цілий вхід N і повертає N-й член у послідовності. Це було хитро дотримуватися всіх елементів у стеці! Довелося вдатися до буфера обміну, щоб не звести з розуму. Ви можете спробувати онлайн!

Можна перетворити на цикл, що друкує перші N термінів, додаючи :"@перед кодом і ]Dпісля.

Дякуємо Луїсу Мендо за збереження 6 цілих байтів!


2

Джулія 0,4, 4̷4̷ 42 байти

x->(k=endof(x)+1;try k=2find(x)[k/2]end;k)

Ця функція приймає єдине ціле число у вигляді списку його двійкових цифр як вхідне.

Алгоритм еквівалентний алгоритму з відповіді @ Agawa001 і моєї відповіді Jelly .

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

Як це працює

find(x)повертає 1-базисні індекси всіх ненульових елементів x . Ми намагаємося отримати доступ до результуючого масиву в індексі k / 2 і, якщо це вдало, перезапишемо k з подвоєним вибраним індексом.

Це не вдасться, якщо і лише у тому випадку, якщо одна з наступних дійсна:

  • k / 2 - неінтегральний поплавок, тому і піднімається InexactError .

  • В масиві індексів менше k / 2 елементів, тому BoundsError піднімається.

У будь-якому випадку перезапис k не вдасться, тому його первісне значення повернеться.


1

JavaScript (ES6), 65 байт

s=>(l=s.length+1)%2|!(m=s.match(`(0*1){$l/2}}`))?l:m[0].length*2

Приймає двійковий рядок. Використовує перевірку відмов з різних інших відповідей.


1

Python 2, 74 байти

def f(x):k=len(x)+1;print next((i*2for i in range(k)if k==2*sum(x[:i])),k)

Ця функція приймає єдине ціле число у вигляді списку його двійкових цифр як вхідне.

Алгоритм еквівалентний алгоритму з відповіді @ Agawa001 і моєї відповіді Jelly .

Перевірте це на Ideone .

Як це працює

nextнамагається знайти перше ціле число 2i, для якого k==2*sum(x[:i])повертається істина. Оскільки x[:i]містить елементи i , це дає 1-індекс на основі (k / 2) -го 1 .

nextне вдасться, якщо k / 2 є нецілісним або якщо x містить менше k / 2 . У цьому випадку повертається значення за замовчуванням k .


0

> <> , 63 байти

2r11&>}:?v{1->:l2-%?vr{{$>1+$}$:2=$@&101.
 +&?!^&n;>{1+^ .0+bf<

З того моменту, як я побачив зразок прикладу в цьому виклику, я знав, якою мовою користуватися :)

Використовуючи N, щоб отримати N- й член.

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

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

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