Описание задачи
«Нарушение» последовательности - это перестановка, при которой ни один элемент не появляется в исходном положении. Например ECABD
, это расстройство ABCDE
, но CBEDA
это не так:
ABCDE
| | <- B and D are in their orignal positions
CBEDA
Учитывая последовательность, генерировать случайное нарушение ее.
Заметки
Вы можете взять либо строку в качестве входных данных, либо массив / список элементов (целые числа, символы, объекты ...)
Вместо того, чтобы возвращать новый объект, вы можете изменить существующий, меняя его элементы
Каждое расстройство должно иметь равную вероятность возникновения
Вы можете предположить, что в последовательности более одного элемента, и ни один не появляется более одного раза
Ответы:
CJam , 14 байтов
Попробуйте онлайн!
Продолжает перетасовывать ввод, пока это не помешает.
объяснение
источник
Желе , 6 байт
Попробуйте онлайн!
объяснение
Джонатан Аллан сохранил байт.
источник
Ẋ=³S$¿
экономит байт.$
. Благодарность!Python, 85 байт
Изменяет переданный ему список (разрешенный мета и в вопросе).
Попробуйте онлайн здесь!
источник
def D(l):
с ,l=input()
а затем сохранить отступы пробелов в следующих строках (так у вас есть программа вместо функции). Не понизить, хотя!ES6 (Javascript),
7169 байтВвод и вывод - это массивы, которые должны работать с любыми типами элементов (строки, числа и т. Д.), Если их можно сравнить с "==".
Golfed
Тест
Интерактивный фрагмент
источник
Perl 6 , 33 байта
Лямбда, которая принимает список целых чисел или символов в качестве входных данных и возвращает новый список.
Если он должен поддерживать списки произвольных значений,
ne
его следует заменить на!eqv
(+2 байта).( Попробуйте онлайн. )
Объяснение:
{ }
: Определяет лямбду.pick(*)
: Генерирует случайное перемешивание списка ввода..pick(*) xx *
: Создает ленивую бесконечную последовательность таких перемешиваний.(* Zne $_).all
Лямбда, которая упаковывает два списка (его аргумент*
и аргумент внешней лямбды$_
) с помощьюne
оператора (отрицательное равенство строк), получая список логических значений, а затем создаетall
соединение, чтобы свернуть их в одно логическое состояние.first PREDICATE, SEQUENCE
: Берет первый элемент из нашей бесконечной последовательности перестановок, который удовлетворяет критерию «сумасшествия».источник
Брахилог ,
19181513 байтПопробуйте онлайн!
объяснение
источник
Perl 6 , 45 байт
Попытайся
Ввод - это массив всего.
Expanded:
источник
MATL, 7 байт
Это перевод моего поста в Октаве (и похожий на некоторые другие материалы здесь). Я вчера опубликовал свой первый пост в MATL (трещина CNR), так что я думаю, что это не оптимально, но это лучшее, что у меня есть.
Честно говоря, я не совсем уверен
t
, что там нужно, но это единственный способ заставить это работать. Он используется для того, чтобы я мог сравнить пользовательский ввод (полученный сG
) со случайной перестановкой. Я думаю, я мог бы сравнить два без этого, но ...?Во всяком случае, здесь идет:
Попробуйте онлайн!
источник
t
там или я могу от этого избавиться? Было весело пытаться играть в гольф в MATL ... :)t
(или, что эквивалентно, другогоG
). Вам нужно что-то оставить в стеке для следующей итерации или в качестве конечного результатаНа самом деле , 13 байтов
Попробуйте онлайн!
Объяснение:
источник
Октава,
5655 байтМы должны использовать,
input('')
так как это не функция. Кроме того, так как я могу выбрать, чтобы ввод был в виде строки, мы можем использовать хитрость этоnnz(x)==numel(x)
.Объяснение:
Спасибо Луису за то, что он заметил, что ввод может быть строкой, поэтому я мог бы использовать
nnz
вместоnumel
сохранения два байта.источник
MATL, 13 байт
Это совместные усилия @LuisMendo и меня. В отличие от многих других ответов здесь, этот является детерминированным в том смысле, что он не отбирает случайные перестановки, пока не получит расстройство, но генерирует все отклонения и выбирает один случайным образом.
Попробуйте онлайн!
объяснение
источник
Pyth -
109 байтЭто продолжает перемешивать ввод, в то время как любой из символов равен символам в их индексе на входе.
Попробуйте это онлайн здесь .
источник
Mathematica, 57 байт
Безымянная функция, принимая список whatevers в качестве входных данных и выводя список. После генерации всех перестановок
#
входных данныхx
мы оставляем только те, для которых набор#-x
разностей элементов не содержит a0
; затем мы делаем (равномерно) случайный выбор из этого множества.источник
#/.x_:>NestWhile[RandomSample[#,Length@#]&,#,Not@FreeQ[#-x,0]&]&
очевидно, быстрее на практике для длинных струнPHP, 85 байт
Копирует строковый аргумент в два массива, перетасовывает один из них, пока разница между ними (также сравнивая индексы элементов) не сравняется с другой. Беги с
-r
.источник
R, 59 байт
Читает список элементов в STDIN, берет длину списка и начинает выборочные диапазоны от 1 до длины, пока не найдет элемент, который не разделяет места с упорядоченным списком. Затем печатает этот список.
источник
Чудо , 32 байта
Использование:
объяснение
Более читабельно:
Рекурсивная функция
f
. Проводит поэлементное сравнение междуf
списком ввода и перетасованной версией списка ввода. Если сравнение дает какие-либо равные значения, тоf
вызывается в перетасованном списке. В противном случае мы просто возвращаем перемешанный список.источник
Рубин, 67 байт
источник
Октава,
5453 байтаСоздайте все перестановки
a
и выберите случайным образом строку, с которой нет общего элементаa
.примечание: оно случайно совпадает с ответом @flawr MATL!
источник
Clojure,
949079 байтов-4 байта, изменяя условное внутри редукции
and
и вставляяdone?
.-11 байт путем преобразования сокращения в
some
.Woot! Удар PHP.
Метод грубой силы. Перемешивает список, пока он недействителен. Это быстро заканчивается глупо, учитывая, что это метод грубой силы, который ничего не делает для предотвращения повторных попыток. Он обнаружил 1000 разложений длинного списка из 1000 элементов менее чем за секунду.
Ungolfed:
источник
Clojure, 56 байт
Обратите внимание, что строка не может быть перетасована, должна быть передана через
seq
илиvec
.Первоначально я пытался,
#(first(remove(fn[s]((set(map = % s))true))(iterate shuffle %)))
ноrecur
подход действительно короче, чемiterate
.Магия в том, что
(set(map = % s))
возвращает либо набор ложных, набор истинных или набор истинных и ложных. Это можно использовать как функцию, если она содержит,true
то ответ -true
иначе ложьnil
.=
счастлив принять два входных аргумента, не нужно оборачивать это чем-то.Может быть, есть еще более короткий способ проверить, является ли какое-либо из значений истинным?
источник
APL, 11 байт.
Со строкой в правом аргументе:
⍵[⍋(⍴⍵)?⍴⍵]
объяснение
ρ⍵
получает длину (или форму) правильного аргумента.?
возвращает случайный массив(⍴⍵)
из этих чисел.⍋
возвращает их порядок, чтобы не было дубликатов.⍵[..]
представляет случайный ассортимент строки с использованием этого индекса.источник
⍵
.