Стрілецьке переміщення - це тип перетасовки, де колоду розбивають на дві секції, а потім перегородки з'єднуються назад, щоб створити нову колоду перетасованих.
Картки з'єднані таким чином, що картки підтримують свій відносний порядок у розділі, до якого вони входять . Наприклад, якщо карта A знаходиться перед карткою B на колоді, а картки A і B знаходяться в одному розділі, то карта A повинна бути перед карткою B в остаточному результаті, навіть якщо кількість карт між ними збільшилася. Якщо A і B знаходяться в різних розділах, вони можуть бути в будь-якому порядку, незалежно від їх початкового порядку, у кінцевому результаті.
Кожен переміщення стрілецької зброї можна розглядати як перестановку оригінальної колоди карт. Наприклад перестановка
1,2,3 -> 1,3,2
являє собою стрілецький перетасування. Якщо ви розділите колоду так
1, 2 | 3
ми бачимо, що кожна карта в 1,3,2
такому ж відносному порядку, як і для кожної іншої карти в її розділі. 2
все ще після 1
.
З іншого боку, наступна перестановка не є стрілецьким переміщенням.
1,2,3 -> 3,2,1
Ми можемо це побачити, оскільки для всіх двох (нетривіальних) розділів
1, 2 | 3
1 | 2, 3
є пара карток, які не підтримують свого відносного впорядкування. У першому розділі 1
і 2
зміни їх упорядкування, а в другому розділі 2
і 3
зміни їх упорядкування.
Однак ми бачимо, що 3, 2, 1
це можна зробити, склавши два стрілецькі мішки,
1, 3, 2 + 2, 3, 1 = 3, 2, 1
Насправді досить простий факт, який слід довести, це те, що будь-яка перестановка може бути зроблена моїм поєднанням певної кількості перестановок стрілецьких перестановок.
Завдання
Ваше завдання - створити програму чи функцію, яка приймає перестановку (розміром N ) як вхідну та виводить найменшу кількість перестановок стрілецького перебору (розміром N ), які можна об'єднати для формування вхідної перестановки. Вам не потрібно виводити самих мішалок, скільки їх є.
Це кодовий гольф, тому відповіді будуть набрані в байтах, а менша кількість байтів буде кращою.
Ви можете вивести або 1, або 0 для перестановки ідентичності.
Випробування
1,3,2 -> 1
3,2,1 -> 2
3,1,2,4 -> 1
2,3,4,1 -> 1
4,3,2,1 -> 2
4,3,2,1
бути 2
? Спочатку ми розбиваємося на середині та отримуємо, 3,1,4,2
а потім знову розділяємо середину і використовуємо ту саму перестановку