Напишите функцию, которая принимает набор целых чисел и печатает каждую перестановку набора, а перестановка выполняется между каждым шагом.
вход
набор целых чисел, например (0, 1, 2)
Вывод
список перестановок и перестановок в формате (set) (swap) (set) ...
Прецедент
Input:
(3, 1, 5)
Output:
(3, 1, 5)
(3, 1)
(1, 3, 5)
(3, 5)
(1, 5, 3)
(1, 3)
(3, 5, 1)
(3, 5)
(5, 3, 1)
(3, 1)
(5, 1, 3)
правила
- Вы можете отформатировать набор чисел, как вы хотите.
- Вы можете делать свопы в любом порядке
- Вы можете повторить перестановки и перестановки, чтобы получить новый
- Ваш код не должен фактически выполнять свопы, вывод должен просто показать, какой своп был сделан между вашим последним и текущим
- Ваш код должен функционировать только для наборов с 2 или более элементами
- В данном наборе не будет повторяющихся элементов (например, (0, 1, 1, 2) недопустимо)
Это код-гольф, поэтому выигрывает самый короткий код!
code-golf
math
permutations
Billyoyo
источник
источник
(3, 1, 4)
или около того - читая его в первый раз, я сильно растерялся, потому что при первом обмене0,1
менялись не только элементы,0,1
но и индексы0,1
, а затем следующий своп не следовал этому образцу. Я также укажу вам на Песочницу, где вы можете публиковать вызовы и получать отзывы, прежде чем публиковать их на основном сайте.Ответы:
Mathematica, 102 байта
Примеры
// столбец для более четкого результата
источник
Java,
449426 байтМетод грубой силы. Он продолжает делать случайные перестановки, пока не будут выполнены все возможные перестановки. Он использует набор строкового представления массива, чтобы проверить, сколько разных состояний было сгенерировано. Для n различных целых чисел n! = 1 * 2 * 3 * .. * n различных перестановок.
Обновить
Ungolfed:
Применение:
Как видите, свопов намного больше, чем необходимо. Но похоже на работу :-D
В качестве бонуса он работает и со строками, т.е.
источник
Set s=new HashSet();
. Ваш код в методеn
может быть один возврат:static int n(int x){return x==1?1:x*n(x-1);}
. И вы можете заменитьString z
в методеo
с родовым вместо:static<T>void o(T z){System.out.println(z);s.add(z);}
. Все вместе это уменьшит до 426 байтов .JavaScript (ES6), 186 байт
Примечание: я не уверен, насколько гибкий формат вывода, может быть, я мог бы сделать это для 171 байта:
Работает, выполняя алгоритм Steinhaus – Johnson – Trotter для массива индексов в случайном порядке и переводя обратно во входной массив. Ungolfed:
источник
Рубин, 86 байт
источник
Haskell - 135 байт
вывод:
Я использую стандартную
permutations
функцию, которая не основана на свопах, поэтому я беру перестановки перестановок и нахожу одну, которая оказывается цепочкой свопов.источник