Нещодавно я читав теорію графів, особливо гіперкубів та думав про цікаві способи побудови на них шляхів. Ось що я придумав.
Як ви знаєте, ви можете побудувати п-мірний гіперкуб шляхом прийняття всіх кортежів , що складаються з 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]
був на гіперкубі, a[m+1]
теж буде. І як ви можете вважати, a[0]
що це вершинна вершина, вам майже не потрібно дбати про будь-які речі з гіперкубами, а просто слідувати правилу.
a[m+1] = xor(a[m], 2^mod(a[m],n))
, не має значення, якщо вершини належать до гіперкуба, правда?