Во время работы с числами я нашел интересную перестановку, которую вы можете сгенерировать из списка чисел. Если вы будете повторять одну и ту же перестановку достаточно много раз, вы всегда окажетесь в исходном массиве. Давайте использовать следующий список:
[1, 2, 3, 4, 5]
В качестве примера
Обратный массив. Теперь наш массив
[5, 4, 3, 2, 1]
Переупорядочить (поменять) каждую пару. В нашем списке 2 пары:
[5, 4]
и[3, 2]
. К сожалению, мы не можем сгруппировать их1
в пару, поэтому оставим их в покое. После замены каждой пары новый массив:[4, 5, 2, 3, 1]
Повторите шаги 1 и 2, пока мы не вернемся к исходному массиву. Вот следующие 4 шага:
Step 2: Start: [4, 5, 2, 3, 1] Reversed: [1, 3, 2, 5, 4] Pairs Swapped: [3, 1, 5, 2, 4] Step 3: Start: [3, 1, 5, 2, 4] Reversed: [4, 2, 5, 1, 3] Pairs Swapped: [2, 4, 1, 5, 3] Step 4: Start: [2, 4, 1, 5, 3] Reversed: [3, 5, 1, 4, 2] Pairs Swapped: [5, 3, 4, 1, 2] Step 5: Start: [5, 3, 4, 1, 2] Reversed: [2, 1, 4, 3, 5] Pairs Swapped: [1, 2, 3, 4, 5] # No more steps needed because we are back to the original array
Если длина списка, n нечетная, всегда будет ровно n шагов, чтобы вернуться к исходному массиву. Если n четное, для возврата к исходному массиву всегда потребуется 2 шага, если только n не равно 2, и в этом случае потребуется 1 шаг (потому что реверс и свопинг - это одно и то же).
Ваша задача на сегодня (если вы решите принять ее) состоит в том, чтобы визуализировать этот набор шагов для списков произвольной длины. Вы должны написать программу или функцию, которая принимает одно положительное целое число n в качестве входных данных и выполняет этот набор шагов для списка [1, n]
. Вы должны вывести каждый промежуточный шаг по пути, будь то печать каждого шага или возврат их всех в виде списка шагов. Я не очень требователен к формату вывода, если ясно, что вы генерируете каждый шаг. Это означает (например) любой из них:
Вывод каждого шага в виде списка в STDOUT
Возврат списка списков
Возврат списка строковых представлений каждого шага
Возврат / вывод матрицы
было бы приемлемо.
Вы также должны вывести исходный массив, независимо от того, идет ли он в конце или в начале. (технически оба верны)
Вам придется обработать крайний случай 2, сделав 1 шаг вместо 2 , поэтому убедитесь, что ваше решение работает с вводом 2 (а 1 - это еще один потенциальный крайний случай).
Как обычно, это код-гольф , поэтому применяются стандартные лазейки, и вы пытаетесь сделать свое решение короче, чем любой другой на выбранном вами языке (или даже попытаться обыграть другой язык, который обычно короче вашего, если вы чувствуете себя лучше) за вызов).
Тест IO
1:
[1]
2:
[1, 2]
3:
[2, 3, 1]
[3, 1, 2]
[1, 2, 3]
4:
[3, 4, 1, 2]
[1, 2, 3, 4]
5:
[4, 5, 2, 3, 1]
[3, 1, 5, 2, 4]
[2, 4, 1, 5, 3]
[5, 3, 4, 1, 2]
[1, 2, 3, 4, 5]
7:
[6, 7, 4, 5, 2, 3, 1]
[3, 1, 5, 2, 7, 4, 6]
[4, 6, 2, 7, 1, 5, 3]
[5, 3, 7, 1, 6, 2, 4]
[2, 4, 1, 6, 3, 7, 5]
[7, 5, 6, 3, 4, 1, 2]
[1, 2, 3, 4, 5, 6, 7]
9:
[8, 9, 6, 7, 4, 5, 2, 3, 1]
[3, 1, 5, 2, 7, 4, 9, 6, 8]
[6, 8, 4, 9, 2, 7, 1, 5, 3]
[5, 3, 7, 1, 9, 2, 8, 4, 6]
[4, 6, 2, 8, 1, 9, 3, 7, 5]
[7, 5, 9, 3, 8, 1, 6, 2, 4]
[2, 4, 1, 6, 3, 8, 5, 9, 7]
[9, 7, 8, 5, 6, 3, 4, 1, 2]
[1, 2, 3, 4, 5, 6, 7, 8, 9]
И для хорошей меры, вот один гигантский контрольный пример:
27:
[26, 27, 24, 25, 22, 23, 20, 21, 18, 19, 16, 17, 14, 15, 12, 13, 10, 11, 8, 9, 6, 7, 4, 5, 2, 3, 1]
[3, 1, 5, 2, 7, 4, 9, 6, 11, 8, 13, 10, 15, 12, 17, 14, 19, 16, 21, 18, 23, 20, 25, 22, 27, 24, 26]
[24, 26, 22, 27, 20, 25, 18, 23, 16, 21, 14, 19, 12, 17, 10, 15, 8, 13, 6, 11, 4, 9, 2, 7, 1, 5, 3]
[5, 3, 7, 1, 9, 2, 11, 4, 13, 6, 15, 8, 17, 10, 19, 12, 21, 14, 23, 16, 25, 18, 27, 20, 26, 22, 24]
[22, 24, 20, 26, 18, 27, 16, 25, 14, 23, 12, 21, 10, 19, 8, 17, 6, 15, 4, 13, 2, 11, 1, 9, 3, 7, 5]
[7, 5, 9, 3, 11, 1, 13, 2, 15, 4, 17, 6, 19, 8, 21, 10, 23, 12, 25, 14, 27, 16, 26, 18, 24, 20, 22]
[20, 22, 18, 24, 16, 26, 14, 27, 12, 25, 10, 23, 8, 21, 6, 19, 4, 17, 2, 15, 1, 13, 3, 11, 5, 9, 7]
[9, 7, 11, 5, 13, 3, 15, 1, 17, 2, 19, 4, 21, 6, 23, 8, 25, 10, 27, 12, 26, 14, 24, 16, 22, 18, 20]
[18, 20, 16, 22, 14, 24, 12, 26, 10, 27, 8, 25, 6, 23, 4, 21, 2, 19, 1, 17, 3, 15, 5, 13, 7, 11, 9]
[11, 9, 13, 7, 15, 5, 17, 3, 19, 1, 21, 2, 23, 4, 25, 6, 27, 8, 26, 10, 24, 12, 22, 14, 20, 16, 18]
[16, 18, 14, 20, 12, 22, 10, 24, 8, 26, 6, 27, 4, 25, 2, 23, 1, 21, 3, 19, 5, 17, 7, 15, 9, 13, 11]
[13, 11, 15, 9, 17, 7, 19, 5, 21, 3, 23, 1, 25, 2, 27, 4, 26, 6, 24, 8, 22, 10, 20, 12, 18, 14, 16]
[14, 16, 12, 18, 10, 20, 8, 22, 6, 24, 4, 26, 2, 27, 1, 25, 3, 23, 5, 21, 7, 19, 9, 17, 11, 15, 13]
[15, 13, 17, 11, 19, 9, 21, 7, 23, 5, 25, 3, 27, 1, 26, 2, 24, 4, 22, 6, 20, 8, 18, 10, 16, 12, 14]
[12, 14, 10, 16, 8, 18, 6, 20, 4, 22, 2, 24, 1, 26, 3, 27, 5, 25, 7, 23, 9, 21, 11, 19, 13, 17, 15]
[17, 15, 19, 13, 21, 11, 23, 9, 25, 7, 27, 5, 26, 3, 24, 1, 22, 2, 20, 4, 18, 6, 16, 8, 14, 10, 12]
[10, 12, 8, 14, 6, 16, 4, 18, 2, 20, 1, 22, 3, 24, 5, 26, 7, 27, 9, 25, 11, 23, 13, 21, 15, 19, 17]
[19, 17, 21, 15, 23, 13, 25, 11, 27, 9, 26, 7, 24, 5, 22, 3, 20, 1, 18, 2, 16, 4, 14, 6, 12, 8, 10]
[8, 10, 6, 12, 4, 14, 2, 16, 1, 18, 3, 20, 5, 22, 7, 24, 9, 26, 11, 27, 13, 25, 15, 23, 17, 21, 19]
[21, 19, 23, 17, 25, 15, 27, 13, 26, 11, 24, 9, 22, 7, 20, 5, 18, 3, 16, 1, 14, 2, 12, 4, 10, 6, 8]
[6, 8, 4, 10, 2, 12, 1, 14, 3, 16, 5, 18, 7, 20, 9, 22, 11, 24, 13, 26, 15, 27, 17, 25, 19, 23, 21]
[23, 21, 25, 19, 27, 17, 26, 15, 24, 13, 22, 11, 20, 9, 18, 7, 16, 5, 14, 3, 12, 1, 10, 2, 8, 4, 6]
[4, 6, 2, 8, 1, 10, 3, 12, 5, 14, 7, 16, 9, 18, 11, 20, 13, 22, 15, 24, 17, 26, 19, 27, 21, 25, 23]
[25, 23, 27, 21, 26, 19, 24, 17, 22, 15, 20, 13, 18, 11, 16, 9, 14, 7, 12, 5, 10, 3, 8, 1, 6, 2, 4]
[2, 4, 1, 6, 3, 8, 5, 10, 7, 12, 9, 14, 11, 16, 13, 18, 15, 20, 17, 22, 19, 24, 21, 26, 23, 27, 25]
[27, 25, 26, 23, 24, 21, 22, 19, 20, 17, 18, 15, 16, 13, 14, 11, 12, 9, 10, 7, 8, 5, 6, 3, 4, 1, 2]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27]
Удачи в гольф!
источник
1 2 3 4 5
, нет1 2 4 3 5
.array[0]
будет только 1 в начале и в конце процесса доn = 999
. Если посмотреть на шаблон, кажется, что для каждого нечетного n первый элемент идет1, n-1, 3, n - 3, 5, n - 5, 7...
вверх доn - 2, 3, n, 1
, что всегда будет делать n шагов. Я не вижу никакой причины, что этот шаблон изменился бы с большим n .1, n, 2, n-2, 4, n-4, 6, n-6, 8, n-8, ...
и по индукции легко показать, что элемент в четном положении x перемещается в nx после одного шага и элемент в нечетной позиции x перемещается в n-x + 2 . Так что если n = 2k + 1 , то после 2k-го шага 1 будет на 2k , а на следующем шаге на n-2k = 1 .Ответы:
TI-Basic (серия 83),
585754 байта (104 символа)объяснение
Принимает входные данные
Ans
(например, написать,5:prgmNAME
чтобы использовать списки размера пять).Создает три вспомогательных списка заданного размера (которые создаются заново
ᶫB
на каждом шаге):ᶫB = ᶫC = {1,2,3,4,5,...}
иᶫD = {-1,-1,-2,-2,-3,...}
. На каждом шаге сортируетᶫC
иᶫD
в порядке убывания, применяя одну и ту же перестановку кᶫA
. В случаеᶫC
, это меняетᶫA
, а в случаеᶫD
, это меняет местами смежные пары, потому что TI-Basic использует действительно глупую реализацию сортировки выбора, дляSortD(
которой переупорядочивает столько идентичных элементов, сколько возможно. когдаᶫA
ᶫB
снова становится равным , мы останавливаемся.Нет, серьезно, их встроенный алгоритм сортировки - моя вторая по величине жалоба с интерпретатором TI-Basic. (Моя самая большая жалоба заключается в том, как много вложенных циклов замедляет работу интерпретатора, поскольку данные цикла хранятся в стеке, но стек выращен не с того конца, поэтому калькулятор должен перемещать весь стек каждый раз при нажатии элемента или выскочил.) Но на этот раз это удобно.
-1 байт:
Pause
сохраняет значение, на которое печатаетсяAns
, которое короче, чем ссылкаᶫA
.-3 байта: принять входные данные в
Ans
источник
Желе , 10 байт
Попробуйте онлайн!
объяснение
Заметка
Если исходный диапазон должен быть в конце, добавьте
ṙ1
к коду 12 байт.источник
05AB1E ,
1311 байтПопробуйте онлайн!
объяснение
источник
JavaScript (ES6),
8985редактировать 4 байта, сохраненные thx @JustinMariner
Используя тот факт, что, когда любой элемент находится в нужном месте, все элементы.
Меньше гольфа
Тест
источник
for(l=[];n;l[n-1]=n--);
, попробуйте онлайн! ,Mathematica, 142 байта
источник
JavaScript (ES6), 79 байт
Выводит список для каждого шага.
Обратите внимание, что нам не нужно инициализировать массив, чтобы заставить шарик катиться. Если неинициализировано (
x
не определено), мы можем использовать индексы массива (параметрi
), чтобы сделать первый шаг:Тестовые случаи:
Показать фрагмент кода
источник
R
1099594797462 байтаЕсли тот факт, что код выбрасывает предупреждения поверх фактического решения (без предупреждений, если
n
1, 3 предупреждения, еслиn
четное, иn
предупреждений, еслиn
нечетный), не является проблемой, то следующее работает аналогично предыдущему решению, благодаря vector переработка:Попробуйте онлайн!
Еще раз спасибо @Giuseppe за дополнительные 12 байтов!
Предыдущее решение без предупреждения на 94 байтах:
Попробуйте онлайн!
Исходное решение на 109 байт :
Попробуйте онлайн!
источник
print
возвращает аргумент, чтобы мы могли воспользоваться этим здесь. Я не думаю, что когда-либо виделencode
раньше; это аккуратный способ индексации!2
вembed
сmin(n,2)
?n
вместо{}
цикла while, так какn
ничего не делает. :)0:n+2*1:0
такой же, как1+0:n+c(1,-1)
для -4 байта.any(print(...) != s)
эквивалентноany(print(...)-s)
для -1 байт. И если мы сможем доказать этоm[1]==1
только в конце алгоритма, то мы можем отброситьany
, поэтому мы получаемwhile(print(...)-1)
и можем удалитьs
, поэтому мы получаем 62 байта,n=scan();m=1:n;w=0:n+2*1:0;while(print(m<-rev(m)[w[w<=n]])-1)n
Japt ,
20181512 байтПопробуйте (
-R
пометьте только для визуализации)1 байт сохранен благодаря ETHproductions.
источник
w ò mw
может бытьò2n)w
Шелуха , 9 байт
Попробуйте онлайн!
источник
Рубин ,
64 57 5250 байтПопробуйте онлайн!
Как это работает:
Сначала создайте диапазон, затем повторите перестановку x раз: используйте отрицательный индекс, но переверните последний бит, чтобы мы получили последовательность -2, -1, -4, -3 ... если x четное, это закончится хорошо, если нет, мы добавим оставшийся элемент в конце. Последний шаг: отфильтровываем повторяющиеся массивы (поэтому мы охватываем все случаи: x = 1, x = 2, нечетные и четные числа)
источник
Haskell,
7574 байтаПопробуйте онлайн!
g
выполняет парные свопы,h
один шаг (реверс + переупорядочение),!
многократно применяетсяh
(и собирает промежуточные результаты), пока заказ не будет восстановлен. Примечание:!
принимает дополнительный, но неиспользуемый дополнительный параметр0
только для того, чтобы сделать его инфиксным оператором. Основная функцияp
запускает его.Редактировать: Спасибо @Angs за байт.
источник
0!x
вместоf x
сохранения байта - попробуйте онлайн!Ява 8,
215214 байтЯ попытался сыграть в гольф с использованием реальных массивов вместо списка, но как реверсирование, так и свопинг будут занимать слишком много байтов. Может быть, это можно объединить в один цикл (вместо сперва реверсирования, а затем свопинга), но мне еще предстоит выяснить это.
Это, безусловно, можно играть в гольф еще немного, хотя.
Объяснение:
Попробуй это здесь.
источник
Java (OpenJDK 8) ,
257245243226206205 байтПопробуйте онлайн!
источник
n->{java.util.Arrays x=null;int i=0,k,f,a[]=new int[n],t[]=new int[n];for(;i<n;a[i]=t[i]=++i);do{for(f=0;f<n/2;k=t[f],t[f]=t[n+~f],t[n+~f++]=k);for(k=1;k<n;t[k]=t[--k],t[k]=f,k+=3)f=t[k];System.out.println(x.toString(t));}while(!x.equals(a,t));}
( 245 байт ) Сводка измененийjava.util.Arrays x=null;
:;n-f-1
кn+~f
; убраны скобки петли; Измененный 2xk-1
для--k
(а также изменен ,k+=2
чтобыk+=3
нейтрализовать это.,f
и повторно используяi
.for(i=0;i<n/2;k=t[i],t[i]=t[n+~i],t[n+~i++]=k);
for(i=0;i<n/2;t[i]=t[n+~i],t[n+~i++]=k)k=t[i];
MATL , 17 байт
Попробуйте онлайн!
объяснение
источник
Stax , 17 байт
Запустите и отладьте его
объяснение
Удивил, что он работает так же быстро, как и тестировал до 399, прежде чем я больше не хотел настраивать свой браузер.
источник
JavaScript (ES6), 122 байта
r.push(a)
может быть использован вместо того,r.push(b)
чтобы поставить исходную перестановку впереди.источник
Haskell , 97 байт
Это чувствует себя немного долго :(
Попробуйте онлайн!
Объяснение / Ungolfed
источник
С накоплением , 42 байта
Попробуйте онлайн!
Выполняет данное преобразование с помощью
periodsteps
встроенного. Однако эта встроенная функция возвращает все элементы, включая диапазон ввода в качестве первого и последнего элементов. Поэтому мы обезглавливаем список, возвращая все, кроме первого элемента.источник
AWK , 123 байта
Не очень туго, но это лучшее, что я мог придумать.
Попробуйте онлайн!
источник
Python 2 ,
16515913881 байтПопробуйте онлайн!
-20 байт благодаря @ChasBrown . (Вздох, я сделал целый вызов по поводу расширенного синтаксиса срезов)
Вау! GolfStorm (-57 байт)! Спасибо Яну Гёделю, Тшу и Джонатану Фреху.
источник
list(reversed(a))
попробоватьa[::-1]
.' '*[2-(x<3),x][x%2]
[b,0][b==a]
->b*(a!=b)
.JavaScript, 136 байт
источник