Вчера я задавал этот вопрос о риффл-тасовках. Похоже, что вчерашний вопрос был слишком сложным, поэтому этот вопрос является связанной, но гораздо более легкой задачей.
Сегодня вас просят определить, является ли перестановка на самом деле случайным образом. Наше определение riffle shuffle адаптировано из нашего последнего вопроса:
Первая часть шаффла - это разделение. В разделе делить колода карт на две части. Два подраздела должны быть непрерывными, взаимоисключающими и исчерпывающими. В реальном мире вы хотите, чтобы ваш раздел был как можно ближе к максимально возможному, однако в этом испытании это не рассматривается, все разделы, включая вырожденные (один раздел пуст), имеют одинаковое значение.
После того, как они были разделены, карты объединяются таким образом, что карты поддерживают свой относительный порядок в пределах раздела, членом которого они являются . Например, если карта 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
измените их порядок.
задача
Учитывая перестановку с помощью любого разумного метода, определите, представляет ли она действительный случайный случай. Вы должны вывести два различных значения констант: одно для «Да, это случайное перемешивание» и одно для «Нет, это не случайное перемешивание».
Это код-гольф, поэтому ответы будут оцениваться в байтах, причем меньше байтов будет лучше.
Тестовые случаи
1,3,2 -> True
3,2,1 -> False
3,1,2,4 -> True
2,3,4,1 -> True
4,3,2,1 -> False
1,2,3,4,5 -> True
1,2,5,4,3 -> False
5,1,4,2,3 -> False
3,1,4,2,5 -> True
2,3,6,1,4,5 -> False
источник
0
для ложных, но любое целое число[1, +∞)
для правдивых?[3,1,4,2,5]
.[2,3,6,1,4,5]
.[0, ..., n-1]
вместо[1, ..., n]
ввода?Ответы:
JavaScript (ES6), 47 байт
Принимает ввод как массив целых чисел. Возвращает логическое значение.
Контрольные примеры
Показать фрагмент кода
Как?
Входной массив A является допустимым перемешиванием, если он состоит не более чем из двух различных чередующихся последовательных последовательных целых чисел.
Правила вызова указать , что мы дали перестановку из [1 ... N] . Поэтому нам не нужно дополнительно проверять, что отсортированное объединение этих последовательностей действительно приводит к такому диапазону.
Мы используем счетчик x, инициализированный в A [0], и счетчик y, изначально не определенный.
Для каждой записи z в A , начиная со 2-й:
источник
Haskell , 41 байт
Попробуйте онлайн!
Проверяет, содержит ли составленный список список
0..n-1
в порядке подпоследовательности.источник
Haskell , 43 байта
s
принимает список целых чисел, как в примерах OP, и возвращает aBool
.Попробуйте онлайн!
Как это устроено
x
поp
очереди и проверяет, может ли он быть первым элементом второго раздела шаффла. Затемor
возвращает,True
если какие-либо проверки былиTrue
.filter
)p
на элементы, меньшие и большие (или равные)x
, конкатенации и проверки, является ли результирующий список[1..length p]
, то есть элементы в порядке.[1..length p]
строго ли результат меньше бесконечного списка[1..] == [1,2,3,etc.]
, что дает тот же результат для любой перестановки.источник
Желе ,
136 байтПопробуйте онлайн!
Альтернативная версия, задание постдаты, 5 байт
Попробуйте онлайн!
Как это устроено
источник
Python 2 , 39 байт
Попробуйте онлайн!
Принимает список с 0 индексами и выводит через код выхода.
источник
Брахилог , 9 байт
Попробуйте онлайн!
Предикат завершается успешно, если входные данные представляют собой случайное перемешивание, и дает сбой, если это не так, что означает, среди прочего, что, если предикат будет выполнен как целая программа, будет напечатан успех и произойдет
true.
сбойfalse.
. Ввод принимается как список любых видов элементов и интерпретирует его как представление перестановки самого отсортированного.Я чувствую, что в
⊆ᵐ
четырехбайтовой конструкции типа «сэндвич» должно работать нечто, в духе чего⟨⊆⊇⟩
.источник
Python 2 ,
756047 байтспасибо Деннису за -13 байт
Попробуйте онлайн!
Выход через код выхода.
источник
Рубин , 35 байт
Попробуйте онлайн!
Как?
l & [*1..a] | l
применяет пересечение, а затем объединение: сначала получают элементы,l
которые есть,<=a
а затем добавляют оставшиеся элементыl
без изменения порядка. Если a - это число, которое мы ищем, то эта операция аналогична сортировкеl
.источник
Чистый ,
5655 байтПопробуйте онлайн!
источник
Pyth, 5 байт
Тестирование
Проверяет, содержит ли двойной список ввода отсортированную версию самого себя в качестве подпоследовательности.
Благодаря Эрику Outgolfer за 1 байт, который лучше использует неявный ввод
+QQ
, чем*2Q
.источник
}SQy+
. Это расширяется до}SQy+QQ
.Pyth , 9 байт
Тестирование.
Сохранено 3 байта благодаря isaacg .
Pyth , 14 байт
Попробуй это здесь! или Проверьте все контрольные примеры.
Выходы
True
иFalse
для riffle-shuffle и non-riffle-shuffle соответственно.Как?
источник
<#0
можно заменить еще-
на 2 байта.Шелуха , 7 байт
Тестирование!
источник
Perl, 28 байт
Включает
+1
в себя дляa
Ввод на STDIN, 1 на основе
Использует алгоритм xnor
источник
C (gcc) , 61 байт
Попробуйте онлайн!
источник