Нове замовлення №2: Поверніть мені шлях


15

Вступ (може бути проігноровано)

Розміщення всіх позитивних чисел у звичайному порядку (1, 2, 3, ...) трохи нудне, чи не так? Отже, ось низка викликів навколо перестановок (перестановок) усіх позитивних чисел. Це другий виклик у цій серії. Перший виклик можна знайти тут .

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

Поворотний енкодер для приладів для вимірювання кута, позначених у 3-бітовій двійковій системі.

Зауважте, що таке кодування залишає певну свободу. Наприклад, після двійкового 1100 є чотири можливі наступні коди: 1101, 1110, 1000 та 0100. Саме тому я визначу a(n) як найменше, раніше не використовуване значення, яке відрізняється лише одним символом у двійковому кодуванні. Ця послідовність відповідає A163252 .

Оскільки це завдання "чистої послідовності", завдання полягає у виведенні a(n) для заданого n в якості вхідного сигналу, де a(n) - A163252 .

Завдання

З урахуванням цілого вводу n , виведіть a(n) у цілочисленному форматі ( не у двійковому форматі).

a(n) визначається як найменше додатне ціле число, яке не зустрічається раніше в послідовності, таким чином, щоa(n1) іa(n) відрізняються лише одним бітом, коли вони записуються у двійковій формі .

Примітка: тут передбачається індексація на основі 1; Ви можете використовувати індексацію 0 на основі, так ( 0 ) = 1 ; a ( 1 ) = 3 і т. д. Будь ласка, зазначте це у своїй відповіді, якщо ви вирішили скористатися цим.a(0)=1;a(1)=3

Тестові справи

Input | Output
--------------
1     | 1
5     | 4
20    | 18
50    | 48
123   | 121
1234  | 1333
3000  | 3030
9999  | 9997

Правила

  • Вхід і вихід є цілими числами (ваша програма повинна, як мінімум, підтримувати введення та виведення в межах від 1 до 32767)
  • Неправильний вхід (0, плавці, рядки, негативні значення тощо) може призвести до непередбачуваного виводу, помилок або (не) визначеної поведінки. У A163252 , ( 0 ) визначається як 0. Для цього завдання ми будемо ігнорувати це.a(0)
  • Застосовуються правила вводу / виводу за замовчуванням .
  • Бійниці за замовчуванням заборонені.
  • Це , тому найкоротші відповіді в байтах виграють

Заключна примітка

Дивіться наступні пов'язані (але не рівні) питання PP&CG:

Відповіді:


1

Стакс , 19 17 байт

êÑ{╚α8è╙mc┼σ▀»É▲ü

Запустіть і налагоджуйте його

Він припиняє роботу в якийсь момент після вказаного домену через ітерацію індексу жорсткого коду. (32767)

Розпакований, неозорений та коментований, це виглядає приблизно так.

z0,         push an empty array, literal zero, and the input, in that order
             - the zero represents the last calculated value in the sequence
             - the array contains all the previous ones
D           repeat the rest of the program n times (from input)
  +         append the last calculated value to the array
  17r       [0 .. 16] (these are the bit indices necessary to cover the input range)
  {|2nH|^m  calculate candidate values; previous value with each of these bits toggled 
  n-        remove all values previously calculated
  |m        keep the minimum candidate remaining

Виконати цей


Ви на 1 байт за найкоротшу відповідь 05AB1E. Чи плануєте ви далі оптимізувати це? Інакше я прийму відповідь Кевіна ...
до

1
Якщо у мене є можливість, я попрацюю над цим сьогодні, десь у наступні 14 годин.
рекурсивна

Добре. Я буду тримати його відкритим ще один день. Удачі!
agtoever

@agtoever: Дякую Я закінчив зараз.
рекурсивна

Молодці! Ти виграв! Вітаємо!
agtoever

4

JavaScript (ES6), 65 байт

1-індексований.

n=>{for(o=p=[k=1];o[k]|~-(i=p^k)&i?k++:k=o[p=k]=!!n--;);return p}

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

Прокоментував

n => {                  // n = index of requested term
  for(                  // for loop:
    o =                 //   o = storage object for the terms of the sequence
    p =                 //   p = last term found in the sequence
      [k = 1];          //   k = current term
    o[k] |              //   if k was already encountered
    ~-(i = p ^ k) & i ? //   or (p XOR k) has more than 1 bit set:
      k++               //     increment k
    :                   //   else:
      k = o[p = k]      //     set o[k], set p to k
        = !!n--;        //     stop if n is equal to 0 or set k to 1; decrement n
  );                    // end of for()
  return p              // return p
}                       // end

У TIO я отримую переповнення стека для n> ~ 1024. Будь-які пропозиції щодо того, як вирішити цю проблему в інших умовах Абу? Правило: " Ваша програма повинна, принаймні, підтримувати введення та виведення в діапазоні
теорій

1
@agtoever Я оновив його до нерекурсивної версії.
Арнольд

4

Желе , 26 20 байт

ṀBLŻ2*^1ị$ḟ⁸Ṃ;
0Ç⁸¡Ḣ

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

Повна програма, яка приймає n як єдиний аргумент. Працює для всіх тестових випадків. Також зауважте, що, хоча це не потрібно, він обробляє n = 0.

Пояснення

Посилання помічника: знайдіть наступний термін і додайте

Ṁ              | maximum of list so far
 B             | convert to binary
  L            | number of binary digits
   Ż           | 0..above number
    2*         | 2 to the power of each of the above
      ^        | exclusive or with...
       1ị$     | ... the most recent term in the list so far
          ḟ⁸   | filter out anything used already
            Ṃ  | find the minimum
             ; | prepend to existing list

Головна посилання

0              | start with zero
 Ç             | call the above link
  ⁸¡           | and repeat n times
    Ḣ          | take the last term added

3

Java (JDK) , 142 138 124 123 132 130 98 байт

  • збільшено до облікового запису для імпорту, зберегло байт завдяки @ kevin-cruijssen
  • переключила колекцію на масив int завдяки @ olivier-grégoire
n->{int s[]=new int[9*n],j,k=0;for(;n-->0;s[k=j]++)for(j=0;s[++j]>0|n.bitCount(j^k)>1;);return k;}

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


1
Я боюся, що імпорт повинен бути включений до підрахунку байтів. Однак можна пограти в import java.util.*;+ Set s=new HashSet();до var s=new java.util.HashSet();. Крім того, інші можуть бути golfed до: Integer i=0,j,k=0;for(;i++<n;s.add(k=j))for(j=0;s.contains(++j)|i.bitCount(j^k)>1;);return k;. Хоча приємна відповідь, тому +1 від мене. :)
Кевін Круїссен

1
Збережено ще 2 байти, використовуючи, Stackа не HashSet. Набагато повільніше, але працює!
Даніель Віддіс

1
O(n)O(nn)

2
Ви все одно можете пограти в нього до 126 байт, другий гольф я запропонував у своєму першому коментарі. :)
Кевін Кройсейсен


2

Python 2 , 81 байт

Індексація на основі 1

l=[0];p=0
exec"n=0\nwhile(p^n)&(p^n)-1or n in l:n+=1\np=n;l+=p,;"*input()
print p

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


Python 2 , 79 байт

Це займає багато часу (9999 не було закінчено після локального запуску протягом 7 хвилин)

l={0};p=0;n=input()
exec'p=min({p^2**k for k in range(n)}-l);l|={p};'*n
print p

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


1
Максимальний вхід 32767 не підтримується (глибина рекурсії за замовчуванням не залежить від системи).
Ерік Аутгольфер

Навіть даний тестовий випадок 9999 не підтримується. :)
Даніель Віддіс

@EriktheOutgolfer Змінив його на ітеративний підхід, ймовірно, все ще не закінчується в часі на TIO, але працює локально просто чудово.
ов

@ovs О, самі очікування не мають значення.
Ерік Аутгольфер

Класно! Я щойно спробував це за n = 9999, і він завершився успішно приблизно через годину. +1. Так! ;-)
agtoever



1

Вугілля деревне , 65 байт

≔⁰θFN«⊞υθ≔¹ηW¬‹θ⊗η≦⊗ηW∧›η¹∨¬&θη№υ⁻θη≧÷²ηW№υ⁻|θη&θη≦⊗η≔⁻|θη&θηθ»Iθ

Спробуйте в Інтернеті! Посилання на багатослівну версію коду. Пояснення:

≔⁰θ

Ініціалізуйте результат до 0.

FN«

nЧаси циклу .

⊞υθ

Збережіть попередній результат, щоб ми його більше не використовували.

≔¹ηW¬‹θ⊗η≦⊗η

Знайдіть найвищий біт у попередньому результаті.

W∧›η¹∨¬&θη№υ⁻θη≧÷²η

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

W№υ⁻|θη&θη≦⊗η

Тепер спробуйте XORing цей біт з попереднім результатом, подвоюючи біт, поки не буде знайдений невидимий результат. Це обробляє випадки, коли потрібно встановити біт, знову ж таки, у порядку зростання значення, але також випадок, коли потрібно переключити найменш значущий біт, який попередній цикл не намагається тестувати (тому що гравця потрібно перевірити на що тут). Якщо попередній цикл виявив небачений результат, цей цикл ніколи не запускається; якщо цього не відбулося, цей цикл буде марно повторно перевіряти ці результати.

≔⁻|θη&θηθ

Оновіть результат, фактично XORing біт з ним.

»Iθ

Вивести кінцевий результат у кінці циклу.


1

05AB1E , 21 20 18 байт

ÎFˆ∞.Δ¯θy^bSO¯yå_*

Досить неефективно, тому чим більший вклад, тим довше потрібно для отримання результату. Чи працює для введення0Однак .

Спробуйте в Інтернеті або перевірте першенумови .

Пояснення:

Î                # Push 0 and the input
 F               # Loop the input amount of times:
  ˆ              #  Pop the current number and add it to the global_array
  ∞.Δ            #  Inner loop starting at 1 to find the first number which is truthy for:
     ¯θy^        #   XOR the last number of the global_array with the loop-number `y`
         b       #   Convert it to binary
          SO     #   Sum it's binary digits
     ¯yå_        #   Check if the loop-number `y` is NOT in the global_array yet
            *    #   Multiply both (only if this is 1 (truthy), the inner loop will stop)
                 # (after the loops, output the top of the stack implicitly)

1

Haskell , 101 байт

import Data.Bits
(u!n)0=n
(u!n)m|q<-minimum[x|r<-[0..62],x<-[xor(2^r)n],notElem x u]=(n:u)!q$m-1
[]!0

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

Зрозуміло соромно проводити імпорт саме так xor, але я ще не знайшов хорошої роботи. Мені також цікаво, чи є кращий спосіб виразити цикл.


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