Дана последовательность целых чисел или, если быть более точным, перестановка 0..N
преобразования этой последовательности следующим образом:
- выход [x] = реверс (вход [вход [x]])
- повторение
Например: [2,1,0]
становится [0,1,2]
и наоборот есть [2,1,0]
. [0,2,1]
становится [0,1,2]
и обратное [2,1,0]
.
Пример 1
In: 0 1 2
S#1: 2 1 0
S#2: 2 1 0
Output: 1
Пример 2
In: 2 1 0
S#1: 2 1 0
Output: 0
Пример 3
In: 3 0 1 2
S#1: 1 0 3 2
S#2: 3 2 1 0
S#3: 3 2 1 0
Output: 2
Пример 4
In: 3 0 2 1
S#1: 0 2 3 1
S#2: 2 1 3 0
S#3: 2 0 1 3
S#4: 3 0 2 1
Output: 3
Ваша задача - определить функцию (или программу), которая принимает перестановку целых чисел 0..N
и возвращает (или выводит) количество шагов, пока не произойдет перестановка, которая уже произошла. Если X
преобразуется в, X
то выход должен быть нулевым, если X
преобразуется в Y
и Y
в X
(или Y
), то выход должен быть 1.
Y -> Y: 0 steps
Y -> X -> X: 1 step
Y -> X -> Y: 1 step
A -> B -> C -> D -> C: 3 steps
A -> B -> C -> D -> A: 3 steps
A -> B -> C -> A: 2 steps
A -> B -> C -> C: 2 steps
A -> B -> C -> B: also 2 steps
Testcases:
4 3 0 1 2 -> 0 3 4 1 2 -> 4 3 2 1 0 -> 4 3 2 1 0: 2 steps
4 3 2 1 0 -> 4 3 2 1 0: 0 steps
4 3 1 2 0 -> 4 1 3 2 0 -> 4 3 2 1 0 -> 4 3 2 1 0: 2 steps
1 2 3 0 4 -> 4 1 0 3 2 -> 0 3 4 1 2 -> 4 3 2 1 0 -> 4 3 2 1 0: 3 steps
5 1 2 3 0 4 -> 0 5 3 2 1 4 -> 1 5 3 2 4 0 -> 1 4 3 2 0 5 ->
5 1 3 2 0 4 -> 0 5 3 2 1 4: 4 steps
Если ваш язык не поддерживает «функции», вы можете предположить, что последовательность задана в виде списка целых чисел, разделенных пробелами, таких как 0 1 2
или 3 1 0 2
в одной строке.
Забавные факты:
- последовательность 0,1,2,3, .., N всегда преобразуется в N, ..., 3,2,1,0
- последовательность N, .., 3,2,1,0 всегда преобразуется в N, .., 3,2,1,0
- последовательность 0,1,3,2, ..., N + 1, N всегда преобразуется в N, ..., 3,2,1,0
Бонусное задание : выяснить математическую формулу.
Необязательные правила :
- Если первый индекс вашего языка равен 1 вместо 0, вы можете использовать перестановки
1..N
(вы можете просто добавить один к каждому целому числу в примере и тестовых случаях).
3,0,1,2
должен преобразовать в2,3,0,1
Ответы:
JavaScript (ES6), 54 байта
Попробуйте онлайн!
источник
[]
с функцией?g[a]
могут быть использованы для доступа к собственностиa
.g
для хранения государства в.Python 2 , 67 байт
Попробуйте онлайн!
источник
Pyth,
1098 байтОбъяснение:
Тестовый пакет .
источник
Haskell, 52 байта
Попробуйте онлайн!
источник
Perl 6 ,
4435 байт-9 байт благодаря nwellnhof
Попробуйте онлайн!
Объяснение:
источник
J,
332726 байт-7 благодаря барботеру
Попробуйте онлайн!
как
оригинальное объяснение. мое последнее улучшение только изменяет часть, которая находит «индекс первого элемента, который мы уже видели». теперь он использует "сито", чтобы сделать это в меньшем количестве байтов.
Обратите внимание, что вся последняя фраза
1<:@i.~[:({:e.}:)\
посвящена поиску «указателя первого элемента, который уже был замечен». Это кажется ужасно долгим для получения этого, но я больше не мог играть в гольф. Предложения приветствуются.источник
Желе , 6 байт
Попробуйте онлайн!
1-индексироваться.
источник
Дьялог АПЛ,
292827 байтПринимает в штучной упаковке массивы. Обучу и объясню позже.
Попробуйте это здесь как набор тестов .
источник
Чисто , 90 байт
Попробуйте онлайн!
источник