Для этой задачи вы создадите функцию (ваша функция может быть полной программой), которая принимает список в качестве входных данных и возвращает перестановку этого списка. Ваша функция должна соответствовать следующим требованиям.
Это должно быть детерминированным.
Составление вашей функции с самим собой переменное число раз должно быть в состоянии получить список для любой из ее перестановок.
Это вопрос кода-гольфа, поэтому ответы будут оцениваться в байтах, причем меньше байтов будет лучше.
Дальнейшие правила
Вы можете взять любой тип списка, (
[Integer]
,[String]
,[[Integer]]
) до тех пор , как это- Может быть не пустым
- Может содержать отдельные объекты с не менее 16 возможных значений. (Вы не можете использовать Haskell
[()]
и заявить, что ваша функция естьid
) - Может содержать повторяющиеся объекты (без наборов)
Вы можете написать программу или функцию, но должны подчиняться стандартному IO.
code-golf
permutations
Специальный охотник за гарфами
источник
источник
S_n
это только цикличность дляn<3
next_permutation
функцию.Ответы:
CJam (11 байт)
Онлайн-демонстрация, показывающая полный цикл для списка из четырех элементов с одним дублирующим элементом.
рассечение
источник
Mathematica + Combinatorica (встроенный пакет) 34 байта
19 байт для загрузки пакета и 15 для функции.
Применение:
Без встроенного, 61 байт
Предполагается, что Combinatorica полностью включена в Mathematica, но я думаю, что функция NextPermutation была упущена.
источник
Python 3 , 90 байт
Попробуйте онлайн!
источник
C ++, 42 байта
Эта точная операция встроена в C ++.
источник
#include
?JavaScript (ES6),
145139137134108 байтБлагодаря @Neil удалось сэкономить 25 байтов!
Принимает ввод в виде массива букв алфавита. Возвращает следующую перестановку как другой массив.
Как?
Это поколение в лексикографическом порядке, которое обрабатывает 4 следующих шага на каждой итерации:
Найдите наибольший индекс X такой, что a [X] <a [X + 1]
Найдите наибольший индекс Y, больший чем X, такой, что a [Y]> a [X]
Поменяйте местами значение [X] со значением [Y]
Сортировать последовательность от [X + 1] до конечного элемента включительно в порядке возрастания лексикографии.
Пример:
демонстрация
Показать фрагмент кода
источник
v<a[i+1]&&(t=v,x=i)
экономит байт, и вы могли бы сделать больше экономии, используяsplice
вместо двухslice
s.map
s для 112 байтов:a=>(t=x=y=-1,a.map((v,i)=>v<a[i+1]?(t=v,x=i):y=i>x&v>t?i:y),a[x]=a[y],a[y]=t,t=a.splice(++x).sort(),a.concat(t))
a.concat(a.splice(++x).sort())
собирался работать, иначе я попытался бы это ...Желе , 6 байт
Циклы по перестановкам в порядке убывания лексикографии.
Попробуйте онлайн!
Как это работает
источник
C 161 байт
Фактический алгоритм O (n).
Пример использования:
источник
Python 2 , 154 байта
Попробуйте онлайн!
источник
exec
дал мне все виды ошибок в функцииЖеле , 10 байт
Попробуйте онлайн!
Сортировать> все перестановки> найти вход> добавить 1> индекс в "все перестановки
источник
Œ¿‘œ?Ṣ
). Мне не хотелось воровать, ну, в общем, тот же алгоритм.Q
штуку. Вы все еще можете играть в гольфṢŒ!Qµi³‘ị
.05AB1E , 7 байтов
Попробуйте онлайн!
источник
PHP , 117 байт
Принимает ввод / вывод как строковый список строчных букв
Попробуйте онлайн!
источник