Думаю многим понравилась недавнее открытие цикличных головоломок (смотрите статью о них выше).
http://twistypuzzles.ru/forum/index.php/topic,90.msg23828.html#msg23828данный класс головоломок образуется за счет использования нестандартных углов, сумма которых не сходится к 360, но сходится на угле кратном 360 (360 * х = 720,1080,...).
а генерирующая последовательность достаточно простая (L, R) - повторив ее сколько то раз мы и получим головоломку. Возможны и более сложные генераторы.
Цикличными головоломки называются за счет одной особенности: у них возможна одна единственная последовательность поворотов, которая при длительном повторе приведет в исходное состояние. никаких ответвлений нет. это даже не головоломка в обычном понимании - можно идти только вперед или назад по извилистому замкнутому коридору. фактически вся формула прохождения цикла будет - (L,R)*N
также удивительная особенность этих головоломок : очень длинные циклы, которые приводят в начальное состояние.
в конце концов, я задался вопросом : как найти размер этого цикла? для любой подобной головоломки.
сначала я искал длину цикла вручную. потом я автоматизировал процесс с помощью симулятора. программа просто выдавала число поворотов. но я не был на 100% уверен, что программа работает без ошибок...
в какой-то момент я догадался как можно найти точное значение длины цикла. без проверки в симуляторе.
тк головоломка цикличная, в ней не возможны никакие формулы для перестановок частей. каждая часть движется по полной траектории из таких же одинаковых частей.
если у нас есть X одинаковых частей, то чтобы часть вернулась на свое место надо выполнить (L,R)*X повороты.
получается у каждой части есть свой размер мини-цикла. достаточно очевидно, чтобы два вида частей с количеством X и Y все встали на свои места, надо выполнить последовательность (L,R)*X*Y.
этот принцип можно расширить на всю головоломку! считаем количество уникальных частей, умножаем все друг на друга и умножаем на 2 (количество поворотов в генераторе).
также достаточно очевидно, что если в наборе есть части с одинаковым количеством, то не надо умножать X и X, один X можно сократить. и достаточно очевидно сделать вывод что нужно найти НОК от списка с количеством всех частей. наименьшее общее кратное - это такое наименьшее число, которое делится без остатка на все числа из списка.
НОК или LCM (англ название) легко посчитать онлайн (wolframalpha) или в продвинутых калькуляторах (Qalculate): например
https://www.wolframalpha.com/input?i=lcm%282%2C3%2C4%2C5%2C6%2C7%2C8%2C9%29------- добавил ------------------------------------------------------------------------------------
при анализе некоторых головоломок столкнулся с ситуацией, когда некоторые одинаковые части двигаются по несвязанным орбитам. получается что одна часть может давать 2-3 независимые группы с различными длинами мини-циклов. поэтому нужно скорректировать определение формулы:
теперь мы берем в параметры НОК не количество уникальных частей, а длинны уникальных орбит как у разных, так и у одинаковых частей.