Может ли массив быть не перетасованным?

15

Фон

Очень опытные обработчики карт способны использовать технику, при которой они идеально режут колоду пополам, а затем прекрасно чередуют карты. Если они начинают с отсортированной колоды и выполняют эту технику безупречно 52 раза подряд, колода будет восстановлена ​​в отсортированном порядке. Ваша задача состоит в том, чтобы взять колоду карт целочисленного массива и определить, может ли она быть отсортирована, используя только перемешивания Фаро.

Определение

Математически, перемешивание Фаро - это перестановка из 2 n элементов (для любого натурального числа n ), которая переводит элемент в позицию i (с индексом 1) в позицию 2 i (мод 2 n +1). Мы также хотели бы иметь возможность обрабатывать списки нечетной длины, поэтому в этом случае просто добавьте один элемент в конец списка (джокер, если у вас есть один удобный) и Фаро перемешает новый список, как указано выше, но игнорируйте добавлен фиктивный элемент при проверке порядка в списке.

Цель

Напишите программу или функцию, которая принимает список целых чисел и возвращает или выводит правду, если некоторое количество случайных чисел Фаро приведет к сортировке этого списка в неубывающем порядке (даже если это число равно нулю - маленькие списки должны давать правду). В противном случае верните или выведите ложь.

Примеры

[1,1,2,3,5,8,13,21]  => True
[5,1,8,1,13,2,21,3] => True
[9,36,5,34,2,10,1] => True
[1,0] => True
[0] => True
[] => True
[3,2,1] => True
[3,1,2] => False
[9,8,7,6,5,4,3,2,1,0] => True
[9,8,7,6,5,4,3,2,0,1] => False
[3,1,4,1,5,9,2,6,9] => False
[-1,-1,-1,-2] => True

счет

Это поэтому выигрывает самый короткий источник в байтах.

quintopia
источник
Чтобы избежать путаницы с любыми другими обработчиками карт, следует отметить, что существует два вида перетасовок Фаро. В случайном порядке и в случайном порядке . Описанный здесь метод является случайным. Интересно, что для того, чтобы вернуть колоду в первоначальный порядок, требуется всего 8 перестановок. Больше информации
BrainSteel
Разве это не просто "перемешать N + 1 раз и посмотреть, отсортированы ли какие-либо списки по пути"?
lirtosiast
На самом деле n раз достаточно, потому что выполнение 2n раз гарантированно найдет все возможные перестановки, но вы получите по крайней мере один из возрастающих или убывающих порядков в первых n.
Quintopia
1
Связанный. Связанный.
Мартин Эндер
1
первый элемент всегда остается в первой позиции?
Eumel

Ответы:

3

Pyth - 26 25 24 байта

Использует кумулятивное уменьшение, чтобы применить Faro shuffle несколько раз и сохранить все результаты. Затем он просматривает его и проверяет, являются ли они инвариантными при сортировке, а затем использует сумму для проверки, являются ли они истинными. Возвращает положительный результат или ноль.

smSI-db.usC_c2NQsC.tc2Qb

Тестовый пакет .

Maltysen
источник
3

MATL , 41 байт

itn2\?YNh]tnt1+:"x[]2e!PY)ttZN~)tS=At.]wx

Выход - 1или 0.

объяснение

i              % get input array
tn2\           % is size odd?
?              % if that's the case
  YNh          % concat NaN at the end
]              % end if
tn             % get size of input array
t1+:           % vector 1:n+1, where n is input size, so loop will be entered even with []
"              % for loop
  x[]2e!PY)    % delete result from previous iteration and do the shuffling
  ttZN~)       % remove NaN, if there's any
  tS=A         % check if array is sorted
  t.           % copy the result. If true, break loop
]              % end for
wx             % remove unwanted intermediate result

пример

>> matl itn2\?YNh]tnt1+:"x[]2e!PY)ttZN~)tS=At.]wx
> [1,1,2,3,5,8,13,21]
1
Луис Мендо
источник