Недавно я прочитал теорию графов, особенно гиперкубы, и подумал об интересных способах построения путей на них. Вот что я придумал.
Как вы знаете, вы можете построить п-мерный гиперкуб путем принятия всех кортежей , состоящих из 1
и в 0
качестве вершин и соединить их, тогда и только тогда они различаются по одной цифре. Если вы интерпретируете эти двоичные цифры как целое число, вы получите граф с хорошо пронумерованными вершинами. Например для n=3
:
Допустим, вы хотите прогуляться по этому гиперкубу и начать с вершины 0
. Теперь, как вы определяете, какую вершину вы хотите посетить дальше? Правило, которое я придумал, состоит в том, чтобы взять номер a
вершины, в которой вы находитесь, перевернуть ее mod(a,n)
бит s (индексирование с нуля) и перейти к полученной вершине. Формально это правило может быть рекурсивно определено как
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]
что это верная вершина, вам почти не нужно заботиться о каких-либо вещах гиперкуба и просто следовать правилу.Ответы:
Желе, 9 байт
Принимает два аргумента командной строки.
Попробуй это здесь .
источник
Хаскелл, 124
Это находит круг с помощью алгоритма двух указателей, обходящих разные скорости, и интенсивно использует / злоупотребляет подходом Haskell к спискам (например, два указателя на самом деле являются списками).
g
это функция, которая вычисляет ответ. дайте егоn
и затем,a[0]
и он вернет вам номер (обратите внимание, что онn
должен быть определен как тип,Int
чтобы избежать неоднозначности типа).источник
JavaScript (ES6), 69 байт
Возвращает 18812 для (23, 10).
источник
MATL ,
383728 байтЭто работает в текущей версии (15.0.0) языка.
Попробуйте онлайн !
объяснение
источник
Pyth,
2217 байтОбъяснение:
Попробуй это здесь .
источник