Вызов
Дан непустой массив целых чисел, например:
[5, 2, 7, 6, 4, 1, 3]
Сначала разделите его на массивы, где ни один элемент не больше предыдущего (т. Е. Не восходящие массивы):
[5, 2] [7, 6, 4, 1] [3]
Затем переверните каждый массив:
[2, 5] [1, 4, 6, 7] [3]
Наконец, объедините их все вместе:
[2, 5, 1, 4, 6, 7, 3]
Это должно быть то, что возвращает ваша программа / функция возвращает. Повторите эту процедуру достаточно раз, и массив будет полностью отсортирован.
правила
- Ввод и вывод могут быть предоставлены любыми стандартными методами и могут быть в любом приемлемом формате массива.
- Входной массив никогда не будет пустым, но может содержать негативы и / или дубликаты.
- Абсолютное значение каждого целого всегда будет меньше, чем 2 31 .
Контрольные примеры
Надеемся, что они охватывают все крайние случаи:
[1] -> [1]
[1, 1] -> [1, 1]
[1, 2] -> [1, 2]
[2, 1] -> [1, 2]
[2, 3, 1] -> [2, 1, 3]
[2, 1, 3] -> [1, 2, 3]
[2, 1, 2] -> [1, 2, 2]
[2, 1, 1] -> [1, 1, 2]
[3, 1, 1, 2] -> [1, 1, 3, 2]
[3, 2, 1, 2] -> [1, 2, 3, 2]
[3, 1, 2, 2] -> [1, 3, 2, 2]
[1, 3, 2, 2] -> [1, 2, 2, 3]
[1, 0, 5, -234] -> [0, 1, -234, 5]
[1, 0, 1, 0, 1] -> [0, 1, 0, 1, 1]
[1, 2, 3, 4, 5] -> [1, 2, 3, 4, 5]
[5, 4, 3, 2, 1] -> [1, 2, 3, 4, 5]
[2, 1, 5, 4, 3] -> [1, 2, 3, 4, 5]
[2, 3, 1, 5, 4] -> [2, 1, 3, 4, 5]
[5, 1, 4, 2, 3] -> [1, 5, 2, 4, 3]
[5, 2, 7, 6, 4, 1, 3] -> [2, 5, 1, 4, 6, 7, 3]
[-5, -2, -7, -6, -4, -1, -3] -> [-5, -7, -2, -6, -4, -3, -1]
[14, 5, 3, 8, 15, 7, 4, 19, 12, 0, 2, 18, 6, 11, 13, 1, 17, 16, 10, 9] -> [3, 5, 14, 8, 4, 7, 15, 0, 12, 19, 2, 6, 18, 11, 1, 13, 9, 10, 16, 17]
счет
Это код-гольф , поэтому выигрывает самый короткий код в байтах.
code-golf
array-manipulation
sorting
ETHproductions
источник
источник
O(n^2)
O(n)
. поменяйте местами первый и последний элементы, затем поменяйте местами второй и второй последние элементы и т. д., когда вы доберетесь до средней остановки.O(n)
, но реверс может быть встроен прямо в алгоритм (это то, что делает мой ответ JS); так как каждая итерация проходит по каждому элементу в массиве один раз, это одна итерацияO(n)
. (Я думаю ...)Ответы:
JavaScript (ES6), 64 байта
Рекурсия FTW! Основной алгоритм, используемый здесь, заключается в том, чтобы отслеживать текущий не восходящий прогон в массиве, «возвращая» его всякий раз, когда обнаруживается восходящий элемент. Мы делаем это рекурсивно, постоянно конкатенируя результаты, пока у нас не кончатся пункты. Создавая каждый прогон в обратном порядке (
[n,...z]
вместо[...z,n]
), мы можем избежать затрачиваемого времени.reverse()
бесплатно.Тестовый фрагмент
Показать фрагмент кода
источник
[n,...a]
. Что такоеn
? Это только первый элемент в вашем массиве?n
это первый элемент в массиве, аa
остальная часть массива. Вы можете найти больше информации здесь ....a
? Это так, чтобы вы могли воспользоватьсяn
? Еще одна вещь, когда вы звонитеf(a,q)
,q
устанавливается ли параметрz
?f=([n])=>...
будет улавливать только первый элемент, иf=([n,a])=>...
будет захватывать только первый вn
а второй вa
. Еще один способ сделать тоf=([n,...a])=>,,,
, что будетf=a=>(n=a.unshift(),...
.z
второй параметр в функции, когдаf(a,q)
вызывается,f
видит его какz
. Надеюсь это поможет!Python 3 , 63 байта
Попробуйте онлайн!
источник
Желе , 8 байт
Попробуйте онлайн!
Объяснение:
источник
JavaScript (ES6), 70 байт
Конечно, это уже побито ответом ETHproductions , но это лучшее, что я мог придумать до сих пор без использования рекурсии.
Примечание. Инициализация
r
иo
одного и того же объекта с помощьюr = o = []
может выглядеть опасной идеей. Но это безопасно сделать здесь, потому чтоr
сразу же назначается его собственный экземпляр (содержащий первый элементa
) на первой итерации сr = [n, ...r]
.Контрольные примеры
Показать фрагмент кода
источник
MATL , 15 байт
Ввод - это вектор-столбец в формате
[5; 2; 7; 6; 4; 1; 3]
(точка с запятой - это разделитель строк).Попробуйте онлайн!
Возьмите вход
[5; 2; 7; 6; 4; 1; 3]
в качестве примера.объяснение
источник
Mathematica,
3027 байтов3 байта сохранены благодаря @Martin Ender .
Анонимная функция. Принимает список чисел в качестве ввода и возвращает список чисел в качестве вывода.
источник
Python 2, 100 байт
Действительно ужасный гольф, но я хотел опубликовать свое решение (одно не просто превзойти Денниса) ...
Тест на repl.it!
Входные данные должны быть представлены в виде литерала списка Python, например
[5, 3, 4, 2, 6, 1]
.Основная идея состоит в том, чтобы интенсивно использовать синтаксис среза Python, вырезая каждый необходимый раздел из массива, обращая его и добавляя его в новый массив.
источник
d,L,x=input(),[],0;d+=...
.Пайк,
118 байт ( старая версия )Попробуй это здесь! (работает на последней версии)
источник
Сетчатка , 163 байта
Да, я знаю, как это ужасно. Поддерживать нули и негативы было очень весело. Количество байтов предполагает кодировку ISO 8859-1.
Попробуйте онлайн
Объяснение:
источник
05AB1E ,
19181614 байтовСохранено 2 байта, используя сортировочный трюк Луиса Мендо
Попробуйте онлайн!
объяснение
Пример ввода
[5, 2, 7, 6, 4, 1, 3]
Предыдущее 16-байтовое решение
источник
JavaScript (ECMA 6),
121128125119108 байтовЛямбда - выражение принимает один
Array
параметр,a
.Спасибо @ETHproductions за помощь в обнаружении моей первой ошибки.
источник
return(b+","+c).split`,`
чтобы сохранить несколько байтов в конце.c.unshift
вместо того,c.push
чтобы удалить необходимость повернуть вспятьc
. После этого я получил 94 байта .Рубин,
6055 байтВ значительной степени то, о чем просил вызов. Я определил лямбду
s
, которая принимает массивx
и разделяет его (разбивает) на более мелкие части, где следующий элемент будет больше, чем. Это возвращает перечислитель, который мы можем вызвать map и обратить порядок частей, прежде чем, наконец, свести все это вместе с flatten, который объединяет элементы в определенном порядке в один массив.тесты
источник
Брахилог , 10 байт
Попробуйте онлайн!
объяснение
источник
c
, при запуске в обратном порядке, сначала разбивается на меньшее количество списков?Дьялог АПЛ ,
715 байтТребуется
⎕ML←3
, что по умолчанию во многих системах. *∊
подключить⌽¨
каждый Обращенная⍵⊂⍨
аргумент разделен * путем вырезания, где каждый соответствующий элемент больше, чем его предшественник в1+
один плюс⍵-
аргумент минус⌊/⍵
самый маленький элемент аргументаСтарое 7-байтовое решение не работает с неположительными целыми числами:
Требуется
⎕ML←3
, что по умолчанию во многих системах. *∊
заручиться поддержкой⌽¨
каждый Обращенная⊂⍨
самостоятельно распределяли ** Partition (
⊂
) - это функция, которая обрезает свой правый аргумент, где соответствующий левый аргумент больше предыдущего. (К сожалению, он принимает только неотрицательные целые числа, а ноль имеет особое значение.) Начиная с версии 16, эта функциональность⊂
доступна во всех системах (даже в тех, где⎕ML≠3
), использующих глиф⊆
.источник
Haskell, 49 байтов
Пример использования:
(%[]) [5,2,7,6,4,1,3]
->[2,5,1,4,6,7,3]
.Рекурсивный подход. Функция
%
принимает входной список в качестве первого параметра и накопитель,l
который до сих пор отслеживает не восходящий фрагмент (в обратном порядке). Базовый случай достигается, когда список ввода пуст, а затем результатом является аккумулятор. Если входной список не пустой и первый элементa
не помещается в текущий chunk (any(<a)l
), верните аккумулятор и добавьте рекурсивный вызов к остальной части списка иa
в качестве нового аккумулятора (l++b%[a]
). Иначе, сделайте рекурсивный вызов для остальной части списка иa
добавьте его в аккумулятор (b%(a:l)
). Основная функция(%[])
вызывает%
с пустым аккумулятором.источник
Сетчатка , 98 байт
Число байтов предполагает кодировку ISO 8859-1.
Попробуйте онлайн!
источник
R, 64 байта
Читает ввод из стандартного ввода. Мы разбиваем входные данные на список векторов, для
split()
которых требуется фактор-переменная, которая группирует входные данные. Коэффициент создается путем накопления суммы логического вектора, для которого разница положительна.Рассмотрим вектор:
Теперь, взяв разность и добавив
F
к ней, получимy=c(F,diff(x)>0)
следующий логический вектор:Взятие кумулятивной суммы
cumsum(y)
дает вектор, в котором каждая группа представлена уникальным фактором, который мы можем объединить сsplit
функцией:источник
diffinv
а неcumsum
.Октава,
7544 байтаНа основании MATL ответа @LuisMendo
Попробуйте онлайн!
Предыдущий ответ
Попробуйте онлайн!
перевернуть массив
взять первую разницу
f
найти позицию, где следующий элемент меньше, чем предыдущий элемент
первое различие позиций возвращает длину каждого вложенного массива
использовать длину каждого
mat2cell
вложенного массива, чтобы разбить массив на вложенный список массивовперевернуть вложенный список
выровнять вложенный список
источник
Pyth - 15 байт
Попробуйте это онлайн здесь .
источник
Perl 6 , 59 байт
Решение на основе регулярных выражений.
Потому что это
СпартаПерл !!m/ /
: Stringify входной массив и сопоставить регулярное выражение с ним.(\-? \d+)
: Сопоставьте число и запишите его как$0
.<?{ [>=] $0 }>
: Утверждение нулевой ширины, которое совпадает только в том случае, если все$0
захваченные до сих пор в текущем подборе совпадения находятся в не возрастающем порядке.([ ] +)+
: Повторяйте последние два шага как можно чаще, в противном случае начинайте новое совпадение.map , [0]
: Перебрать суб-совпадения.|+«*.[0].reverse
Для каждого из них возьмите список значений, с которыми сопоставлены$0
, переверните его, приведите значения к числам (+«
) и вставьте их во внешний список (|
).Perl 6 , 63 байта
Решение для обработки рекурсивных списков.
Более трудоемкий, чем я надеялся.
Несмотря на то, что в языке есть много удобных встроенных функций, похоже, что для разбиения списка их нет (например, в Ruby
slice_when
или HaskelltakeWhile
).источник
Сложенный , неконкурентный, 34 байта
Все еще постоянно развивается этот язык.
Аргумент лежит на TOS. Попробуй это здесь!
chunkby
берет функцию и собирает массивы смежных данных, которые удовлетворяют этой функции. Функция тогда:Это дает строго уменьшающийся массив.
$revmap
в основном[rev]map
и переворачивает каждый элемент.flat
наконец сглаживает массив.Немного веселья для фактической сортировки массива:
Это выводит (например):
источник
Python,
151139 байтСохранено 12 байт благодаря @ Flp.Tkc!
Нигде рядом с @ Flp.Tkc, не говоря уже о ...
источник
+= data,
запятую, неявно создающую кортеж, который затем объединяется со списком, добавляя данные в качестве последнего элемента в списке. В этом контексте делайтеr+=l[i:j+1][::-1],
Python 2, 74 байта
Вход в
a
, выход вc
источник
Python 3, 191 байт
Я не уверен,
sorted
разрешено ли здесь использование функции для проверки, но я не мог придумать вескую причину против этого, и это уменьшило мой счетчик байтов на ~ 30 байт.источник
Clojure, 105 байт
Перегородки в пар на последовательных числа, помещают
true
илиfalse
между ними, перегородками поnot
кtrue
и числам сталиfalse
иfalse
true
, переворачивает разделы и сохраняют числовые значения.источник