Определите последовательность длины prepend-append,n
которая будет перестановкой чисел, 1, 2, ..., n
которые могут быть сгенерированы следующей процедурой:
Начните с номера
1
.Для каждого числа от
2
доn
поместите этот номер в начало или конец последовательности (либо добавьте, либо добавьте его, отсюда и название последовательности).
Например, это допустимый способ генерации последовательности prepend-append длиной 4:
1
21 [beginning]
213 [end]
2134 [end]
Ваша задача состоит в том, чтобы создать программу или функцию, которая будет принимать число n
от как 3
до 30
входного, и печатать или возвращать все последовательности prepend-append длины n
в лексикографическом порядке (если вы выводите строки, а не списки, числа выше 9 будут представлены как буквы a-u
, чтобы сохранить длину строки). Например, это тот заказ для n = 4
:
1234 [RRR]
2134 [LRR]
3124 [RLR]
3214 [LLR]
4123 [RRL]
4213 [LRL]
4312 [RLL]
4321 [LLL]
В общем, существует 2 n-1 перестановка-добавление перестановок длины n
.
Вы не можете использовать любые встроенные функции сортировки на вашем языке в вашем коде. Самая короткая программа для этого на любом языке выигрывает.
источник
a-u
. Можем ли мы просто вывести списки чисел?Ответы:
CJam,
22 20 1917 байтРасширение кода :
Как это работает :
Это отладочная версия кода:
Давайте посмотрим, как это работает для ввода
3
:Попробуйте онлайн здесь
источник
Haskell, 47 байтов
источник
f n=[[n:x,x++[n]]|x<-f$n-1]>>=id
(с помощью функции concat code-golfers>>=id
).f n=[x++[n]|x<-f$n-1]++[n:x|x<-f$n-1]
,f n=map(++[n])(f$n-1)++[n:x|x<-f$n-1]
,f n=map(++[n])(f$n-1)++map(n:)(f$n-1)
,f n=(++[n])#n++(n:)#n;p#i=map p$f$i-1
Python 2, 68
Выводит список списков номеров.
Рекурсивное решение. Для
n==1
вывода[[1]]
. В противном случае добавьтеn
в начало или конец всех(n-1)
-перестановок. Предварительное добавление делает перестановку лексикографически более поздней, чем добавление, поэтому перестановки остаются отсортированными.«Булево»
b
кодирует, ставить ли[n]
в начале или в конце. На самом деле, мы перемещаем остальную часть спискаx
в выраженииx*b+[n]+x*-b
. Помещениеb
как-1
или1
позволяет использовать переворот путем отрицания, поскольку умноженный на список-1
является пустым списком.источник
Пиф, 19
Попробуйте онлайн здесь
Это полная программа, которая принимает входные данные от стандартного ввода.
Это работает аналогично решению xnor, но генерирует значения немного не в порядке, поэтому они должны быть переупорядочены. На каждом уровне происходит то, что каждый предыдущий список значений имеет новое значение, добавляемое в конец и в начало, и каждый из них заключен в 2 кортежа, которые объединены в список. Например, первый шаг делает это:
Затем этот список кортежей архивируется (и затем суммируется для удаления самого внешнего списка). В первом случае это просто дает развернутое значение сверху, так как в списке есть только одно значение.
Шаги, показывающие 2-> 3:
источник
Mathematica,
575449 байтПример:
источник
J, 26 байт
1-байтовое улучшение благодаря FUZxxl .
источник
,.
для,"1
одного персонажа.Pyth,
34333129В основном перевод ответа xnor на Python . Я все еще не очень хорошо разбираюсь в Pyth, поэтому предложения по улучшению приветствуются.
Определяет функцию
y
для возврата списка списков целых чисел.Обновление: сохранено 2 байта благодаря FryAmTheEggman .
Объяснение:
источник
-b1
может бытьtb
,[1_1)
может быть,1_1
(однако вы можете просто убрать закрывающую скобку, поскольку вам нужно только посчитать байты, необходимые для создания функции, даже если вы не сможете вызвать ее, не закрыв ее), и вы не нужноb
переносить список, так как pyth автоматически конвертируется в список при добавлении списка в int.[1,-1]
. Я могу сохранить байты в жестком коде чего-то такого короткого, особенно когда вы упрощаете логику. Я получаюL?]]1<b2sCm,+db+bdytb
Чистый Баш, 103
Дольше, чем я надеялся:
источник
JavaScript (ES6) 73
80Реализация JavaScript в прекрасном решении @ Optimizer.
Рекурсивный (73):
Итеративный (74):
Тест в консоли Firefox / FireBug
источник
Мое решение Java:
источник
false
что-то вроде5<4
.