Вдохновленный Взятые из вопроса на переполнение стека .
Соревнование
Получив целое число n>1
, выведите все массивы, которые можно получить, поменяв местами ровно две записи в массиве [1, 2, ..., n]
.
Массивы могут быть изготовлены в любом порядке.
Вы можете последовательно использовать [0, 1, ..., n-1]
(на основе 0) вместо [1, 2, ..., n]
(на основе 1).
Дополнительные правила
Ввод и вывод являются гибкими, как обычно .
Программы или функции разрешены на любом языке программирования . Стандартные лазейки запрещены.
Самый короткий код в байтах побеждает.
Контрольные примеры
Ввод 2
дает вывод (предполагается 1 на основе)
2 1
Ввод 3
дает вывод (обратите внимание, что три массива могут быть в любом порядке)
1 3 2
2 1 3
3 2 1
Ввод 4
дает выход
1 2 4 3
1 3 2 4
1 4 3 2
2 1 3 4
3 2 1 4
4 2 3 1
Ввод 7
дает выход
1 2 3 4 5 7 6
1 2 3 4 6 5 7
1 2 3 4 7 6 5
1 2 3 5 4 6 7
1 2 3 6 5 4 7
1 2 3 7 5 6 4
1 2 4 3 5 6 7
1 2 5 4 3 6 7
1 2 6 4 5 3 7
1 2 7 4 5 6 3
1 3 2 4 5 6 7
1 4 3 2 5 6 7
1 5 3 4 2 6 7
1 6 3 4 5 2 7
1 7 3 4 5 6 2
2 1 3 4 5 6 7
3 2 1 4 5 6 7
4 2 3 1 5 6 7
5 2 3 4 1 6 7
6 2 3 4 5 1 7
7 2 3 4 5 6 1
code-golf
number
combinatorics
integer
Луис Мендо
источник
источник
[0 ... n-1]
против[1 ... n]
! Я всегда чувствую себя немного раздраженным, когда мне приходится прибегать к1+
нулю, потому что у J нулевые индексы.Ответы:
Желе ,
118 байтПопробуйте онлайн!
Как это устроено
источник
y
? Это всегда было для меня загадкой.[1,2],[4,3]y1,2,3
заменяет каждый 1 в [1, 2, 3] на 4 , а каждый 2 на 3 .R , 54 байта
Попробуйте онлайн!
Возвращает матрицу, в которой каждый столбец является перестановкой.
combn(n,k)
генерирует все комбинации размераk
из спискаn
или из одного целого числа1:n
ifn
. Также необязательно принимает функцию,FUN
которая будет применена к результирующим комбинациям. Поэтому мы пишем функцию, которая выполняет обмен и возвращает список обмена. Затем все результаты накапливаются в видеarray
, которое в этом случае является двумерным и, следовательно, матрицей.источник
Python 2 , 71 байт
Попробуйте онлайн!
Использует этот совет .
источник
Haskell , 62 байта
Попробуйте онлайн!
Я просто генерирую перестановку, учитывая
x
иy
поменять местами, для каждогоx,y
источник
Python 2 , 72 байта
Попробуйте онлайн!
источник
Wolfram Language (Mathematica) , 43 байта
Попробуйте онлайн!
Объяснение:
Subsets[Range@#,{2}]
генерирует все подмножества{1,2,...,n}
размера 2, затем для каждого подмножества/.
меняет местами эти две вещи в списке{1,2,...,n}
.Этот подход неутешительно похож на многие другие представления, но вот тот, который более уникален для Mathematica, для 3 дополнительных байтов:
Попробуйте онлайн!
источник
ReplaceList[Range@#,{a___,b_,c___,d_,e___}:>{a,d,c,b,e}]&
. Мне нравится, насколько это просто (или как непосредственно это кодирует проблему), но, к сожалению, синтаксис сопоставления с образцом настолько многословен, что в итоге получается 57 байтов.Haskell, 62 байта
Попробуйте онлайн!
источник
Haskell , 71 байт
Попробуйте онлайн!
Это добавляет текущий номер к концу всех перестановок последнего и затем вычисляет все перестановки, которые включают новый номер.
источник
MATL , 12 байт
Попробуйте онлайн!
источник
:tY@wy=~!s2=Y)
. Такой же подход, как и у октавского ответа rahnema1C, 93 байта
Попробуйте онлайн!
источник
Октава, 38 байт
Попробуйте онлайн!
Создает все перестановки 1: n и выбирает из них те, которые имеют два элемента, отличных от 1: n.
источник
JavaScript (ES6), 81 байт
Печатает 0-индексированные массивы.
демонстрация
alert()
замененconsole.log()
на этот фрагмент для удобства использования.Показать фрагмент кода
источник
Python 2 , 75 байт
Попробуйте онлайн!
источник
Чисто ,
9082 байтаЭто может быть сделано в 80 байтах, но это превращается в прямой перевод ответов на Haskell.
Попробуйте онлайн!
источник
05AB1E ,
159 байтПопробуйте онлайн!
объяснение
источник
Шелуха , 9 байт
Попробуйте онлайн!
объяснение
источник
Рубин ,
5553 байтаПопробуйте онлайн!
0-основанное решение
Хитрость в том, что внутренний цикл всегда «пропускает» итерацию: первый раз он вообще не выполняется, затем только один раз на втором проходе и так далее.
Я был счастлив с 55 байтами, пока не увидел, что R можно увеличить до 54, поэтому мне пришлось довести его до 53.
источник
Python 2 , 90 байт
Попробуйте онлайн!
источник
Pyth, 9 байт
демонстрация
Самый простой способ поменять два значения - использовать
.r
функцию ротационного перевода Пайта..r<list>[A, B]
поменяет все вхожденияA
иB
вlist
.Поэтому, применяя функцию перевода к
UQ
, список из ,0
чтобыn-1
с каждым списком два элемента из разных номеров в списке, мы будем генерировать желаемый результат.Q
входn
, иU
является функцией диапазона.Самый простой способ сделать это:
.cUQ2
генерирует все 2 комбинации элементов различных элементов в диапазоне и.rLUQ
отображает.r
функцию на них и списокUQ
.Однако это будет 10 байтов.
Вместо создания
.cUQ2
отдельных упорядоченных пар мы можем создать все пары с*=U
. Это неявно эквивалентно*=UQQ
. Она начинается перезаписьQ
сUQ
, а затем принимать декартово произведениеUQ
иUQ
. Это дает все пары чисел в диапазоне, не обязательно упорядоченные или отличные..rLQ
свопы с использованием каждого списка. Напомним , чтоQ
в настоящее время составит список от0
доn-1
, а неn
.Поскольку пары не были заказаны, есть дубликаты.
{
удаляет дубликаты. Поскольку пары не были различны, неизменный список присутствует. Этот список всегда будет первым после дедупликации, поскольку{
сохраняет порядок первого появления, а неизмененный список создается поворотом на[0,0]
.t
удаляет первый элемент, давая желаемый список перестановок.источник
Pyth, 11 байт
Попробуйте онлайн
Не такой короткий, как у Исаака, но достаточно другой для публикации.
объяснение
источник
Java 8,
109105 байтЯ ржавый .. Я не играл в гольф в течение нескольких месяцев .. Закончил портирование ответа @Steadybox 'C .. Возможно, еще играю в гольф.
Попробуй это здесь.
источник
Рубин , 66 байт
Попробуйте онлайн!
источник
Рубин , 80 байт
-12 байт благодаря Unihedron.
Попробуйте онлайн!
Я имел в виду подход, который лучше всего перевести на Ruby по какой-то причине, так что ... я даже не знаю Ruby ...
источник
1..n
переменную с одним символом и использовать ее повторно (отдельные операторы с новой строкой или точками с запятой), 2. обойтись без скобок в терминальных выражениях:i==x ?y:i==y ?x:i
(обратите внимание, где у меня есть пробелы для разделения потенциального шебанга ) и 3.uniq[1,n]
вместоuniq[1..-1]
.