Все мы знаем о различных причудливых алгоритмах сортировки, но ни один из них не дает нам чисел таким образом, который легко произносить. Чтобы исправить это, я предлагаю использовать PronuationSort ™, наиболее естественный способ сортировки списков чисел.
Произношение
Официальные правила произнесения чисел (в этом вызове) таковы, что цифры произносятся одна за другой, а полученная строка сортируется в лексикографическом порядке. В качестве примера это означает, что число 845
произносится "eight four five"
и должно быть соответственно отсортировано.
Отрицательные числа
Отрицательные числа произносятся путем добавления слова "minus"
. Таким образом, -23
произносится как "minus two three"
. Обратите внимание, что это приводит к тому, что отрицательные числа оказываются в середине вывода, прямо между числами, начинающимися с 4
(четыре) и 9
(девять).
В качестве руководства официальный порядок слов для произношенияSort ™:
- восемь
- 5
- четыре
- минус
- 9
- один
- Семь
- шесть
- три
- два
- нуль
То есть,
8, 5, 4, -, 9, 1, 7, 6, 3, 2, 0
вход
Список целых чисел в диапазоне , содержащий не более 100 элементов. Ввод в виде списка строк не допускается. Если ваш язык не поддерживает ввод в виде списка, допустимо указывать ввод в виде отдельных целых чисел.
Входные данные не будут содержать недопустимых чисел или любых чисел, начинающихся с 0 (кроме самого числа 0). Входные данные, как правило, не сортируются, они могут быть заданы в любом порядке.
Выход
Те же самые целые числа, в порядке произношенияSort ™. Обратите внимание, что числа должны быть преобразованы только в их произношение, чтобы получить сортировку, выходные данные не должны содержать строк.
Примеры
В примерах средний шаг (заключенный в скобки) служит только руководством и не является частью вывода.
[1, 2, 3] -> (['one', 'two', 'three']) -> [1, 3, 2]
[-1, 0, 1, 2] -> (['minus one', 'zero', 'one', 'two']) -> [-1, 1, 2, 0]
[-100, 45, 96] -> (['minus one zero zero', 'four five', 'nine six']) -> [45, -100, 96]
[11, 12, 13, 134, 135] -> (['one one', 'one two', 'one three', 'one three four', 'one three five']) -> [11, 13, 135, 134, 12]
Есть также скрипт для проверки ваших результатов .
Ответы:
05AB1E (наследие) , 15 байтов
Попробуйте онлайн!
объяснение
источник
•ĆU‘•
. Он добавляет новую строку во время отображения / сортировки по любой причине.Σ•ĆU‘•"54-ÿ"sSk
мог бы быть 15-байтовой альтернативой, над которой я работал, если бы не эта странная ошибка ... Если я•ĆU‘•
9176320
…54-ì
четнымΣ•RT‹•Á…54-ìsSk
для 15•t∍ýJ•'-ìÁÁ
также будет работатьHaskell , 57 байт
Попробуйте онлайн!
источник
Желе ,
1513 байтПопробуйте онлайн!
Монадическая ссылка, принимающая список целых чисел, которая выдает список целых чисел.
Как?
Сортирует по порядковым значениям цифр целых чисел (где
-
это «цифра» -1), преобразованных в строки с использованием символов с их модульным индексом на основе 1 в магической строке «murgeon lix».Сортировка является буквенной, где пробел считается меньше любой буквы.
Волшебная строка «murgeon lix» была найдена при проверке словарей желе, используемых для сжатия. Нет слов из 11 букв, которые удовлетворяют требованиям (и ни одного из них больше, чем при дедупликации). так как пробел сортируется перед буквами, следующим наиболее очевидным выбором является слово длиной семь, за которым следует пробел, за которым следует слово длины три. «murgeon» и «lix» - единственная удовлетворяющая комбинация, хотя без пробела возможны и другие (например
“£Py:ƥ»
, «murgeonalix», который работает с тем же количеством байтов)Предыдущие @ 15 байтов :
Здесь
“¡Zo⁶’Œ?¤
находится первая перестановка натуральных чисел, которая будет находиться в индексе 21 340 635, когда все перестановки чисел отсортированы лексикографически - что есть[6,10,9,3,2,8,7,1,5,4,11]
. (“¡Zo⁶’
является базовым представлением 250 для 21340635, в то время какŒ?
выполняется вычисление и¤
группирует эти инструкции вместе)источник
Perl 6 , 30 байт
Попробуйте онлайн!
Порт GB решение Ruby.
Оригинальная 35-байтовая версия
Попробуйте онлайн!
Преобразуйте каждое число в строку, получите имя Unicode для каждого символа, удалите первое слово («DIGIT» или «HYPHEN»), а затем сортируйте.
источник
JavaScript (SpiderMonkey) , 69 байт
Попробуйте онлайн!
источник
+''
, видя, как вы принимаете ввод в виде массива строк.K (нгн / к) ,
2120 байтПопробуйте онлайн!
{
}
функция с аргументомx
$
форматировать как строки"
"?
"8"
<
вычислить сортировку по возрастанию перестановкиx@
аргумент в этих показателяхисточник
Python 3,
68 байт67 байт64 байтаИспользует встроенную
sorted
функцию с анонимной лямбдой для ключа. Жестко запрограммируйте порядок сортировки и сравните каждую цифру в каждом значении в списке ввода с ее позицией в списке порядка сортировки.Редактировать: 1 байт был сохранен путем удаления
8
из списка сортировки, чтобы воспользоваться возможностьюstr.find
возврата,-1
когда параметр не найден. Благодаря MaxB.Edit2: сохранены 3 байта, используя помеченный синтаксис в
list
литерале вместоlist
конструктораПопробуйте онлайн!
источник
lambda x:sorted(x,key=lambda y:map('54-9176320'.find,`y`))
Pyth,
1716 байтПопробуйте онлайн здесь или проверьте все тестовые примеры сразу здесь .
Сохранено 1 байт благодаря @ngn и их K-ответу , пропуская 8 в начале строки словаря
источник
Japt, 19 байт
Попытайся
источник
S.n(s)
:ñ_s ®n"54-9176320
(по-видимомуS.n(s)
, точно так же, как иs.b(S)
дляS
длины 1, за исключением того, что она возвращается0
вместо-1
)Сетчатка 0.8.2 , 36 байт
Попробуйте онлайн! Ссылка включает тестовый набор. Объяснение:
Переведите знак минус и цифры в их положение в порядке произношения, используя
:
для 10-й позиции.Сортировка в порядке произношения.
Переведите заказ обратно в исходный знак минус и цифры.
источник
Рубин , 50 байтов
Попробуйте онлайн!
источник
R , 58 байт
Попробуйте онлайн!
Ввод представляет собой список чисел, который неявно преобразуется в виде строки с использованием
chartr
.order
затем использует лексикографический порядок, чтобы получить порядок сортировки исходного списка.источник
Java (JDK 10) , 123 байта
Попробуйте онлайн!
Это наивная реализация Java. Должно быть много в гольф.
кредиты
источник
.chars
-IntStream и.reduce
на регулярной петле экономит 2 байта:n->{var r="";for(var c:(""+n).split(""))r+=10+"854-9176320".indexOf(c);return r;}
. Кроме того, можно сохранить еще один байт, изменив его10+"85
на20+"5
, поскольку в этом случае.indexOf
цифра for8
будет равна -1. Попробуй онлайн 123 байтаJavaScript (SpiderMonkey) ,
8773 байтаПопробуйте онлайн!
Спасибо @Arnauld за сообщение о том, что сортировка в SpiderMonkey стабильна, так что
||-(F(q)>F(p))
часть может быть окончательно отброшена.источник
Красный , 114 байт
Попробуйте онлайн!
Более читабельно:
источник
C ++, 353 байта
Это своего рода комедийная запись, но я напрасно тратил время и писал ее, поэтому я не могу не публиковать ее ... Наслаждайтесь смешком и дайте мне знать, есть ли какие-нибудь космические заставки, которые я пропустил!
Выход:
источник
Mathematica, 68 байт
Функция. Принимает список целых чисел в качестве входных данных и возвращает отсортированный список в качестве выходных данных. Просто разделяет цифры каждого числа с помощью
IntegerDigits
, преобразует каждую цифру в"zero"
,"one"
и т. Д., С помощьюIntegerName
, преобразует список в строку, разделенную пробелами, сStringRiffle
добавлением,"m "
если число является отрицательным, и сортирует на основе этой строки. Действительно, это был самый короткий подход, который я могу найти, поскольку Mathematica использует лексикографическую сортировку только для списков одинаковой длины; таким образом, подход, основанный на том,854-9176320
что занимает больше байтов, так как строковые функции очень дороги.источник
05AB1E ,
1514 байтов-1 байт благодаря @Emigna .
Попробуйте онлайн или проверьте все контрольные примеры .
Объяснение:
Посмотрите эту подсказку 05AB1E (раздел Как сжать большие целые числа ), чтобы понять, почему
•ĆU‘•
это так9176320
.источник