Как описано в этом вопросе :
Dropsort, разработанный Дэвидом Морганом-Маром, является примером «алгоритма сортировки» по линейному времени, который создает список, который фактически отсортирован, но содержит только некоторые из исходных элементов. Любой элемент, который не меньше, чем максимум элементов, предшествующих ему, просто удаляется из списка и удаляется.
Для того, чтобы использовать один из своих тестовых примеров, ввод {1, 2, 5, 4, 3, 7}
урожайности {1, 2, 5, 7}
, как 4
и 3
оба упали за то , что меньше , чем ранее «сортируются» значение, 5
.
Мы не хотим «сортировать» алгоритмы, мы хотим, чтобы они были реальными. Поэтому я хочу, чтобы вы написали программу, которая, учитывая список чисел, выводит список списков DropSorted (чтобы быть полным алгоритмом сортировки, нам нужно объединить эти списки, но объединение двух отсортированных списков уже было сделано ранее, и просить вас сделать это снова - это в значительной степени задавать два вопроса, так что этот вопрос, в частности, является этапом «разделения» нашей полной DropSort).
Однако расположение и содержание наших списков имеет решающее значение. Вывод вашей программы должен быть эквивалентен выводу DropSort, за которым следует DropSort отброшенных значений и так далее, пока у вас не будет только списка отсортированных цепочек. Снова заимствуем существующий набор тестов (и добавим еще два):
Input -> Output
{1, 2, 5, 4, 3, 7} -> {{1, 2, 5, 7}, {4}, {3}}
{10, -1, 12} -> {{10, 12}, {-1}}
{-7, -8, -5, 0, -1, 1} -> {{-7, -5, 0, 1}, {-8, -1}}
{9, 8, 7, 6, 5} -> {{9}, {8}, {7}, {6}, {5}}
{10, 13, 17, 21} -> {{10, 13, 17, 21}}
{10, 10, 10, 9, 10} -> {{10, 10, 10, 10}, {9}} //Note equivalent values aren't dropped
{5, 4, 3, 8, 7, 6} -> {{5, 8}, {4, 7}, {3, 6}}
{0, 2, 5, 4, 0, 7} -> {{0, 2, 5, 7}, {4}, {0}}
Вы можете предположить, что ввод не пуст.
Это код-гольф , поэтому применяются стандартные правила!
[5, 4, 3, 8, 7, 6] -> [5, 8], [4,3,7,6]
?{3,4,5,3,4,5,3,4,5}
привести к{{3,4,5,5,5},{3,4,4},{3}}
?Ответы:
MATL ,
15109 байт5 байт, используя идею @beaker о кумулятивном максимуме
Ввод представляет собой числовой вектор строки в формате
[1, 2, 5, 4, 3, 7]
(запятые не обязательны). Вывод содержит списки, разделенные символами новой строки, с номерами в каждом списке, разделенными пробелами.Попробуйте онлайн! Или проверьте все тестовые случаи .
объяснение
Для данного массива код выбирает из него каждую запись, равную кумулятивному максимуму до этой записи.
Например, учитывая
код выбирает первую, вторую, третью и шестую записи:
Затем процесс повторяется для подмассива, образованного оставшимися записями (в исходном порядке):
Это необходимо сделать до тех пор, пока подмассив оставшихся записей не станет пустым. Верхняя граница необходимого количества итераций - размер ввода. Последние итерации могут не понадобиться. В этом случае они работают с пустым массивом, создавая дополнительные пустые массивы.
В конце концов, стек содержит требуемые массивы и, возможно, несколько пустых массивов, которые вообще не отображаются.
источник
Haskell,
67 5958 байтОбъяснение: Учитывая список списков (которые уже отсортированы) и значение
x
,!
оператор помещаетx
в конец первого списка, последний элемент которого меньше или равенx
. Если такого списка не существует, список[x]
помещается в конец.Попробуйте онлайн.
источник
Шелуха , 10 байт
Попробуйте онлайн!
Это сочетание другого моей шелухи ответа и Haskell ответа XNOR в . Дубликат
ü<
кажется неуклюжим, но я не знаю, как от него избавиться ...объяснение
Функция
ü<
переводитсяnubBy(>)
в Haskell. Он пересекает список слева направо, сохраняя те элементы, для которых ранее ни один элемент не был строго больше. Другими словами, он выполняет дропсорт. Оставшиеся элементы получаются путем взятия разницы списков исходного списка и результатаü<
.источник
Haskell , 50 байтов
Попробуйте онлайн!
источник
\\
функцию: (Шелуха , 16 байт
Попробуйте онлайн!
объяснение
Эта первая строка является основной функцией, а вторая - вспомогательной функцией более высокого порядка (она принимает функцию в качестве аргумента и возвращает новую функцию). Это доступно по нижнему индексу
₁
. Идея состоит в том, что₁≤
выполняет DropSort и₁>
дает оставшиеся элементы.В основной функции мы
₁>
повторяем функцию остатков и применяем функцию дропсорта₁≤
к результатам.источник
Python 3 ,
131 112 10395 байтБольшое спасибо @Mr. Xcoder для сокрушительного 19 байтов!
Большое спасибо @ovs за потрясающие 17 байтов!
Попробуйте онлайн!
Объяснение:
источник
if-else
Могут быть свернуты в[m,d][i<m[-1]]+=[i]
.[m,d]
штуку, но она как-то не работала ....(len(d)>0)
естьbool(d)
, потому что пустые списки являются ложными в Python. +1, отличное решение!i,
это просто сокращение(i,)
, которое содержит кортежa
.a,*x = x or [0]
это расширенная распаковка python3 . Вот полезный пост SO на эту тему с некоторыми примерами.Haskell ,
11310710292 байтаПопробуйте онлайн!
Это чувствует себя действительно долго.
объяснение
!
выполняет сортировку по списку, а#
собирает обрезки.g
затем повторно применяется#
до тех пор, пока список не станет пустым, записывая результаты в список.источник
head a
сa!!0
сохранением байта.APL, 27 байт
Объяснение:
⍵≡⍬:⍬
: если вход пуст, вернуть пустой списокX←⍵≥⌈\⍵
: все числа больше или равны рабочему максимуму(⊂X/⍵)
: список этих номеров,∇⍵/⍨~X
: с последующим результатом выполнения этой функции на оставшихся номерахисточник
{⍵≡⍬:⍬⋄(⊂⍵~r),∇r←⍵/⍨⍵<⌈\⍵}
. Мортен обеспокоен отсутствием ответа на его электронные письма. Все в порядке?JavaScript (ES6), 64 байта
Ungolfed:
Показать фрагмент кода
источник
?!
это какой-то новый оператор ...?!
(i,n,o=[])=>[i.filter(a=>(n||a)<=a?(n=a,1):!o.push([a])),...o]
Видимо, великие умы думают (вроде) одинаково. К сожалению, я не могу сбрить больше байтов ... Просто отметив, что вы можете удалитьf=
свой код, и, возможно, мой код может дать вам некоторые идеи о том, как играть в свой гольф еще больше.f=
из своего кода, потому что это рекурсивно. Ваш интересный подход, но он не работает для пары тестовых случаев. Например, он возвращается[[5,8],[4],[3],[7],[6]]
для предпоследнего случая.R 61 байт
Попробуйте онлайн!
Рекурсивная функция.
sum(x|1)
является условным обозначениемlength(x)
, поэтому эта рекурсия будет выполняться до тех пор, пока она неx
будет пустой.cummax
принимает кумулятивный максимумx
, который затем сравнивается сx
снова. Это создает логический вектор длиныx
, где все ИСТИНЫ соответствуют отсортированным значениям. Мы используем это, чтобы взять подмножествоx
иprint
это. Затем функция вызывается снова в оставшейся частиx
.источник
Ява 8,
182179177 байт-3 байта благодаря @Nevay .
-2 байта при использовании
Stack
вместоVector
.Объяснение:
Попробуй это здесь.
источник
try{}catch{}
вместо проверки,l.size()
чтобы сохранить некоторые?0
и удалить скобки внешнего цикла forl->{List r=new Vector(),t;for(int p,i,x;l.size()>0;)for(p=l.get(0),r.add(t=new Vector()),i=0;i<l.size();p=x)if((x=l.get(i++))>=p)t.add(l.remove(--i));return r;}
(-3 байта).C #,
188203 байтаКоличество байтов включает +18 для:
Попробуйте онлайн!
источник
C ++ 14,
118108 байтИспользуя алгоритм из ответа Haskell w0lf .
Как неназванная родовая лямбда. Первый параметр является контейнером значений для droport (например
vector<int>
), а второй параметр требует совместимого пустого контейнера контейнеров (например,vector<vector<int>>
) для возвращаемого значения через ссылку.В первой версии программы был
R.clear;()
первый оператор, поэтому контейнер контейнеров не должен быть пустым. Питер Кордес подумал, что это может быть включено в спецификацию, поэтому для этого уронил 10 байт.Попробуйте онлайн!
Ungolfed:
источник
R.clear()
и просто потребовать, чтобы вызывающая сторона начала с пустого контейнера.Python 2 , 88 байт
-4 байта благодаря Арнольду Палмеру
Попробуйте онлайн!
Решение, похожее на haskell @ w0lf [ответ] [1]
Редкий вариант использования для
for-else
строительстваПеребирать отсортированные списки
for l in r
(пустые в начале).Если элемент (из ввода)
i
больше, чем последний элемент спискаl[-1]
, добавить элемент в списокl+=[i]
, разбить.Если список не был принят, добавьте новый список с этими элементами
r+=[[i]]
источник
R, незавершенное производство (89, но не удалось)
Проведение некоторой работы здесь, потому что я загнал себя в угол, используя
%in%
(Это не удается на дублирующих записях, в частности, в последнем тестовом примере), и мне нужно пойти и заняться другими делами сейчас, но это здесь, если кто-то хочет использовать это:Ungolfed:
источник
z=function(x)"if"(sum(x|1),{a=x[(i=x>=cummax(x))] c(list(a),z(x[!i]))},NULL)
работы]
иc
является новой"if"
прежде, но я довольно новичок в R гольф. Вы должны опубликовать как свой собственный ответ, и я могу снять мой. Мне нравится то, что вы сделали сi
индексом, чтобы обойти%in%
проблему.cummax
!JavaScript (ES6),
717068 байтДовольно просто, просто перебирает массив, ищет первый внутренний массив, чье последнее значение равно
<=
следующему значению, для удаления, если его не существует, добавляет новый внутренний массив со следующим значением к выводу, в противном случае добавляет следующее значение к первому найден внутренний массив, соответствующий условию.Обновления
Благодаря Neil, сохранены три байта преобразования
(...,o)
в...&&o
и повторно организовать обратный вызов ,map()
чтобы быть более компактным.источник
&&o
на байт короче(,o)
.[...b].pop()
, но я думаю, что(o.find(b=>[...b].pop()<=n)||(n=[n],o)).push(n)
спасает тебя один или два байта.Japt , 29 байт
Проверьте это онлайн!
источник
C (gcc) ,
176175173 байтаПопробуйте онлайн!
Несколько читаемая версия:
источник
PHP,
911039685 байт(Отредактировано, чтобы добавить 12 символов
print_r($r);
для соответствия требованию к выводу)(Отредактировано, чтобы удалить 7 байтов при разрешении ошибок PHP)
(Отредактировано, чтобы удалить 11 байтов при дальнейшем выполнении задания)
Учитывая вход
$a
, он дает результат$r
Милая:
Псевдорекурсивный внешний цикл инициализирует пустые массивы keep
$b
и discard$d
, затем выполняет основной цикл сортировки отбрасыванием, наконец устанавливая отбрасывания как новый вход и добавляя keep к результату.$r
источник
PHP ,
102 байта, 98 байтовПопробуйте онлайн!
-4 байта, благодаря @Umbrella
объяснение
Функция принимает входной список в виде массива.
$s
, который станет окончательно возвращенным списком списков, объявляется статическим. Это расширяет область его действия для всех вызовов этой функции, позволяя вызывать функцию рекурсивно без необходимости передавать этот список результатов в качестве аргумента или возвращать его.Переберите каждое значение в списке.
Это меньше, чем самый большой текущий член списка?
Да, внесите его в список
$f
для дальнейшей сортировки.Нет, поместите это в список
$l
.Нажмите список
$l
на список списков.Если в списке есть что-нибудь
$f
, отправьте его снова для дальнейшей сортировки.Вернуть список списков.
источник
<?php function d($a){return$r;}
, вы от всей души раздавили меня. Кроме того, я просто понял, что мы оба забыли вывести.$v<max($l)?$f[]=$v:$l[]=$v;
с${$v<max($l)?f:l}[]=$v;
- по крайней мере, она работает в моих тестах.Sage, 102 байта
Очень похоже на @Dead опоссума ответ .
Дописывает каждый член
x
изw
к первому списку вa
{списка списков} сx
большим , чем в последнем элементе.если нет, присоединяет
[x]
кa
.Мне бы очень понравилось, если бы
exists
вернули,a
если ничего не нашли! Также пытаюсь применить однострочную идею @ officialaimm ...Вопрос: Если бы я удалил свой код из функции, мне пришлось бы назначить
w
ввод правильно? Так сэкономит ли это байты?источник
Окамль ,
6962 байтаОбъяснение:
источник
APL,
1008883797857567776 байт-0 байт благодаря Kritixi Lithos ...
Попробуйте онлайн!
Должен быть лучший способ сделать это ( есть ). Любые советы очень ценятся и приветствуются.
Как?
(Обратите внимание, что некоторые из этих объяснений могут быть неправильными, так как я забыл, как это работает)
источник
{⍬≢⍴⍵}
может стать(⍬≢⍴)
{(⍵/⍨~E),⊂⍵/⍨E←(⍬≡⍴)¨⍵}
? Кажется, он отделен от всего остального[[1,2,5,7],[4],3]
, а не обязательным[[1,2,5,7],[4],[3]]
.(,¨)
Желе, 26 байт
Это тот же метод, что и ответ APL от Marinus.
Попробуйте онлайн! ,
источник
JavaScript (Node.js) ,
125109106 байт-
1618 байт из Захари-1, удалив
{
и}
изменив инкремент, чтобы включить «установить последний на текущий»По сути, спрашивает, является ли текущий элемент больше, чем последний элемент, добавьте в первый список. В противном случае добавьте ко второму.
Во время этого выяснилось, что сравнение с любым числом
NaN
всегда будет результатомfalse
. Интересный!Объяснение:
Попробуйте онлайн!
источник
var
?x
.