Ходьба по гіперкубі


9

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

Як ви знаєте, ви можете побудувати п-мірний гіперкуб шляхом прийняття всіх кортежів , що складаються з 1і в 0якості вершин і з'єднати їх, тоді і тільки тоді вони розрізняються по одній цифрі. Якщо ви інтерпретуєте ці двійкові цифри як ціле число, ви отримуєте графік із чітко пронумерованими вершинами. Наприклад для n=3:

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

Скажімо, ви хочете погуляти цим гіперкубом і почати біля вершини 0. Тепер, як визначити, яку вершину ви хочете відвідати далі? Правило, яке я придумав - взяти номер aвершини, на якій ви знаходитесь, перевернути її mod(a,n)біт (індексація на основі нуля) та перейти до отриманої вершини. Формально це правило можна рекурсивно визначити як

a[m+1] = xor(a[m], 2^mod(a[m],n)).

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

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

Як бачите, ви будете ходити по колу! Насправді, у всіх вимірах і для всіх початкових точок ваш шлях закінчиться циклом. Наприклад для, n=14і a[0]=0це виглядає приблизно так

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

Для завзятого амблера довжина його запланованого маршруту є досить важливою інформацією. Отже, ваше завдання - написати функцію або програму, яка приймає розмір гіперкуба nяк початкову вершину a[0]як вхід та виводить кількість вершин у отриманому циклі.

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

n   a[0]   Output
-----------------
3   0      6
14  0      50
5   6      8
17  3      346

Правила

  • Стандартні лазівки заборонені
  • Вихід / введення можуть бути у будь-якому відповідному форматі
  • Ви можете вважати a[0]дійсною вершиною

Оцінка балів

Виграє найкоротший код у байтах.

Якщо у вас є додаткова інформація на цю тему, я буду рада почути!


Враховуючи правило a[m+1] = xor(a[m], 2^mod(a[m],n)), не має значення, якщо вершини належать до гіперкуба, правда?
Луїс Мендо

Правильно. Якщо a[m]був на гіперкубі, a[m+1]теж буде. І як ви можете вважати, a[0]що це вершинна вершина, вам майже не потрібно дбати про будь-які речі з гіперкубами, а просто слідувати правилу.
murphy

Відповіді:


4

Желе, 9 байт

%⁴2*^µÐḶL

Бере два аргументи командного рядка.

%⁴2*^µÐḶL        A monadic link. Inputs: a_0. b also taken from command line.
%⁴2*^              Variadic link. Input: a
%⁴                   a modulo b. ⁴ is second input, b.
  2*                 Get 2 to that power
    ^                and bitwise xor with a.
     µ             Start a new, monadic link (input: a_0)
      ÐḶ             All elements of the cycle created when the preceding link
                     is applied repeatedly, starting with a_0.
        L            Length.

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


2

Хаскелл, 124

import Data.Bits
(y:z:w)%(x:s)|x==y||x==z=[i|(i,r)<-zip[1..]s,r==x]!!0|0<1=w%s
g n=(tail>>=(%)).iterate(\a->xor a$2^mod a n)

Це знаходить коло за алгоритмом двох покажчиків, що рухаються навколо-в-різній швидкості, і сильно використовує / зловживає підходом Haskell до списків (наприклад, два покажчики є фактично списками).

gце функція, яка обчислює відповідь. дайте його nі тоді, a[0]і він поверне вам номер (зауважте, що nслід визначити його типу, Intщоб уникнути двозначності типу).


1

JavaScript (ES6), 69 байт

(n,a)=>{g=m=>m^1<<m%n;for(c=1,b=a;(b=g(g(b)))!=(a=g(a));)c++;return c}

Повертає 18812 для (23, 10).


1

MATL , 38 37 28 байт

xi`vt0)2y1G\^Z~yywP=fn~]2M1$

Це працює в поточній версії (15.0.0) мови.

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

Пояснення

x       % take first input: n. Delete (gets copied into clipboard G)
i       % take second input: initial value of a
`       % do...while loop
  v     %   concatenate all stack contents vertically
  t0)   %   duplicate. Get last element of that array: current a
  2     %   push 2
  y     %   duplicate second-top element in stack: current a
  1G    %   push first input (n)
  \     %   a modulo n
  ^     %   2 raised to that
  Z~    %   xor of that with current a
  yy    %   duplicate top two elements in stack: array of old a's and new a
  w     %   swap: move array of old a's to top
  P     %   reverse that array. So first entry is most recent a (before current)
  =f    %   indices of old values that equal current value. There may be 0 or 1
  n~    %   is it empty?
]       % if so, continue with a new iteration
2M      % push array of indices. It contains exactly 1 index
1$      % set 1 input for implicit display function, so it only displays the index

@lirtosiast Правда! Дякую. Редаговано
Луїс Мендо

1

Pyth, 22 17 байт

Lx^2%bQbl.uyNuyGE

Пояснення:

Lx^2%bQbl.uyNuyGE     Implicit: Q=first line n. E=second line a[0].
Lx^2%bQb              y = lambda b: do one iteration
                      Then
             uyGE     Apply y until a previous result is found.
                      This makes sure we're in the cycle.
         .uyN         Then apply y again until a previous result is found.
                      Keep all intermediate values but not the repeat.
        l             Get the length; i.e. the length of the cycle.

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

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