Алгоритм сортировки выглядит так:
Пока список не отсортирован, закрепите половину всех элементов (удалите их из списка). Продолжайте, пока список не будет отсортирован или пока не останется только один элемент (который сортируется по умолчанию). Этот алгоритм сортировки может давать разные результаты в зависимости от реализации.
Процедура удаления элемента должна решаться реализацией, но список должен быть вдвое длиннее, чем раньше, после одного прохода процедуры удаления элемента. Ваш алгоритм может решить удалить либо первую половину, либо список, вторую половину списка, все нечетные элементы, все четные элементы, по одному, пока список не станет вдвое длиннее, или любой не упомянутый.
Входной список может содержать произвольное количество элементов (в пределах разумного, скажем, до 1000 элементов), а не только идеально делимые списки из 2 ^ n элементов. Вам придется либо удалить (n + 1) / 2, либо (n-1) / 2, если список нечетный, либо жестко задан, либо выбран случайным образом во время выполнения. Решите сами: что бы сделал Танос, если бы во вселенной было нечетное количество живых существ?
Список сортируется, если ни один элемент не меньше предыдущего. Дубликаты могут появляться на входе и на выходе.
Ваша программа должна получить массив целых чисел (через stdin или в качестве параметров, либо отдельные элементы, либо параметр массива) и вернуть отсортированный массив (или вывести его в stdout).
Примеры:
// A sorted list remains sorted
[1, 2, 3, 4, 5] -> [1, 2, 3, 4, 5]
// A list with duplicates may keep duplicates in the result
[1, 2, 3, 4, 3] -> [1, 3, 3] // Removing every second item
[1, 2, 3, 4, 3] -> [3, 4, 3] -> [4, 3] -> [3] // Removing the first half
[1, 2, 3, 4, 3] -> [1, 2] // Removing the last half
[1, 2, 4, 3, 5]
может дать разные результаты:
// Removing every second item:
[1, 2, 4, 3, 5] -> [1, 4, 5]
или же:
// Removing the first half of the list
[1, 2, 4, 3, 5] -> [3, 5] // With (n+1)/2 items removed
[1, 2, 4, 3, 5] -> [4, 3, 5] -> [3, 5] // With (n-1)/2 items removed
или же:
// Removing the last half of the list
[1, 2, 4, 3, 5] -> [1, 2] // With (n+1)/2 items removed
[1, 2, 4, 3, 5] -> [1, 2, 4] // With (n-1)/2 items removed
или же:
// Taking random items away until half (in this case (n-1)/2) of the items remain
[1, 2, 4, 3, 5] -> [1, 4, 3] -> [4, 3] -> [4]
[9, 1, 1, 1, 1]
. Мой собственный алгоритм не удалось на этом входеОтветы:
R , 41 байт
Попробуйте онлайн!
источник
is.unsorted
а неany(...)
будет также 41 байт.Python 3 ,
384239 байтПопробуйте онлайн!
-3 bytes
благодаря @JoKing и @Quuxplusoneисточник
!= sorted(t)
должна быть> sorted(t)
.Python 2 , 39 байт
Попробуйте онлайн!
источник
Brachylog (v2), 6 байт
Попробуйте онлайн!
Это функция представления. Вход слева, вывод справа, как обычно. (Ссылка TIO использует аргумент командной строки, который автоматически превращает функцию в полноценную программу, чтобы вы могли увидеть ее в действии.)
объяснение
Бонус раунд
Попробуйте онлайн!
Снимок должен быть случайным, не так ли? Вот версия программы, которая выбирает выживающие элементы случайным образом (при этом гарантируя, что половина выживает в каждом раунде).
Это было бы намного короче, если бы мы могли изменить порядок элементов, но почему алгоритм сортировки хотел бы сделать это ?
источник
Perl 6 , 30 байт
Попробуйте онлайн!
Рекурсивная функция, которая удаляет вторую половину списка, пока список не отсортирован.
Объяснение:
источник
C # (интерактивный компилятор Visual C #) , 76 байт
Попробуйте онлайн!
источник
Java 10,
10697 байт-9 байт благодаря @ OlivierGrégoire .
Попробуйте онлайн.
Оставляйте первую половину списка только на каждой итерации и удаляйте элементы , если размер списка нечетный.n + 12
Объяснение:
источник
n->{for(;n.reduce((1<<31)+0d,(a,b)->a==.5|b<a?.5:b)==.5;n=n.skip(n.count()/2));return n;}
короче с использованием потоков, но я не смог выяснить, как избежатьjava.lang.IllegalStateException: stream has already been operated upon or closed
ошибки после возврата потокаreduce
это терминальная операция, которая закрывает поток. Вы никогда не сможете звонитьreduce
дважды в одном потоке. Вы можете создать новый поток, хотя.Wolfram Language (Mathematica) , 30 байтов
Попробуйте онлайн!
@ Doorknob сэкономил 12 байт
источник
x[[;;;;2]]
).OrderedQ
, но не смог заставить его работатьOrderedQ
в своем первом подходе (см.JavaScript (ES6),
4948 байтСохранено 1 байт благодаря @tsh
Удаляет каждый 2-й элемент.
Попробуйте онлайн!
источник
p++&1
->a^=1
Рубин , 37 байт
Попробуйте онлайн!
источник
05AB1E ,
87 байт-1 байт благодаря @Emigna .
Удаляет все нечетные 0-индексированные элементы на каждой итерации, поэтому удаляет элементов, если размер списка нечетный.n - 12
Попробуйте онлайн или проверьте еще несколько тестовых случаев (или проверьте эти тестовые примеры с пошаговыми инструкциями для каждой итерации ).
7 байтов альтернатива @Grimy :
Удаляет последние элементов (или элементов, если размер списка нечетный) при каждой итерации.N2 n - 12
Попробуйте онлайн или проверьте еще несколько тестовых случаев (или проверьте эти тестовые примеры с пошаговыми инструкциями для каждой итерации ).
Объяснение:
источник
ι
вместо,2ä
если вы переключитесь на сохранение любой другой элемент стратегии.ΔÐ{Ê>äн
TI-BASIC (TI-84),
47424544 байта-1 байт благодаря @SolomonUcko!
Входной список находится в
Ans
.Выход находится
Ans
и неявно распечатывается.Объяснение:
Примечание: TI-BASIC - это токенизированный язык. Количество символов не равно количеству байтов.
источник
not(min(L1=Ans
с ,max(L1≠Ans
чтобы сохранить байты.Желе , 7 байт
Попробуйте онлайн!
источник
Haskell ,
5755 байт (только благодаря ASCII)Попробуйте онлайн!
Оригинальный код:
Попробуйте онлайн!
Ungolfed:
источник
Октава , 49 байт
Попробуйте онлайн! Это было путешествие, где скучнее лучше. Обратите внимание на две гораздо более интересные записи ниже:
50 байтов
Попробуйте онлайн! Вместо неинтересного императивного решения мы можем сделать рекурсивное решение только для одного дополнительного байта.
53 байта
Попробуйте онлайн! Ага. Рекурсивная анонимная функция, благодаря блестящему ответу @ floorcat на мои советы . Анонимная функция, которая возвращает рекурсивную анонимную функцию, определяя себя в своем списке аргументов. Мне нравятся анонимные функции. Ммммм.
источник
MATL , 11 байт
Попробуйте онлайн!
Это работает, удаляя каждый второй элемент.
объяснение
источник
Japt , 10 байт
Попробуй
источник
Java (JDK) , 102 байта
Уже есть ответ на C #, поэтому я решил попробовать свой ответ на Java.
Попробуйте онлайн!
источник
Crystal , 58 байт
С
Array#sort
( 58 байт ):Попробуйте онлайн!
Без
Array#sort
( 101 байт ):Попробуйте онлайн!
источник
Шелуха ,
65 байт1 байт сохранен благодаря Zgarb
Попробуйте онлайн!
объяснение
источник
Ċ2
вместо того,(←½
чтобы сохранить байт.Gaia ,
98 байтПопробуйте онлайн!
Объяснение:
источник
Юлия 1,0 , 30 байт
Попробуйте онлайн!
Принимает каждый второй элемент массива, если не отсортирован.
источник
-
для 20 байтов. также мы почти всегда не считаем символы: | так что было бы хорошо, если бы это было удалено из шапкиC ++ (gcc) , 103 байта
Я не могу комментировать, но я улучшил версию от movatica, уменьшив количество включений и используя авто.
-2 байта: floorcat
-2 байта: только ASCII
Попробуйте онлайн!
источник
l.size()/2
?(n+1)/2
или(n-1)/2
оба действительны. хм ....VDM-SL , 99 байт
Никогда не отправлял в vdm раньше, поэтому не уверен в определенных правилах языка. Итак, я представил как определение функции, которая принимает
seq of int
и возвращаетseq of int
Полная программа для запуска может выглядеть так:
источник
Pyth, 10 байт
Попробуйте это онлайн здесь . Это удаляет вторую половину на каждой итерации, округляя вниз. Для того, чтобы изменить его , чтобы удалить первую половину, округление, изменить
h
кe
.источник
hc
на%
. Это также позволяет вам удалить конечную лямбда-переменнуюZ
и позволить Pyth неявно заполнить ее, чтобы сохранить всего 2 байта.C ++ (gcc) ,
139137116 байт-2 байта спасибо потолочной кошке, -21 байт спасибо PeterZuger
Измените размер вектора до его первой половины, пока он не будет отсортирован.
Попробуйте онлайн!
источник
include
sK (ок) ,
2220 байтРешение:
Попробуйте онлайн!
Перебирайте ввод до тех пор, пока он не отсортирован ... если он не отсортирован, возьмите первые n / 2 элементов.
Редактирование:
источник
(.5*#x)#x
->*2 0N#x
2 0N
но предположил, что это будет дольше (без тестирования), спасибо!Юлия 1,0 , 33 байта
Попробуйте онлайн!
источник
Сетчатка , 38 байт
Попробуйте онлайн! Принимает числа через запятую. Объяснение:
Преобразовать в одинарный.
Повторите, пока список не отсортирован ...
... удалить каждый четный элемент.
Преобразовать в десятичную.
источник
C (gcc) , 66 байт
Отбирает вторую половину списка каждую итерацию (
n/2+1
элементы, если длина нечетна).Попробуйте онлайн!
Принимает ввод как указатель на начало массива, за
int
которым следует его длина. Выводит путем возврата новой длины массива (сортирует по месту).Безголовая версия:
источник
~i+n
вместоi<n-1