Алфавитное целое
Для данного набора чисел поместите их в алфавитном порядке, когда они прописаны (то есть 1: один, 2: два, 90: девяносто, 19: девятнадцать). Ваш код должен работать для диапазона [-999999, 999999]
. Вывод должен иметь разделитель между числами. Будет работать пробел, а также пробел и запятая, как показано в примерах ниже. Входные данные могут быть массивом целых чисел, строкой чисел с разделителями или любым другим способом. Все целые числа предполагаются уникальными.
Числа не ставятся через дефис для целей этой задачи, а пробелы располагаются в алфавитном порядке перед любыми другими символами. Предполагается, что отрицательные числа выражаются с помощью слова minus
. Например, four
будет предшествовать four thousand
и номер -40
будет отсортирован с использованием строки minus forty
. Предположим, что все числа будут состоять только из числовых слов и без союзов (например, использовать two thousand forty two
вместо two thousand and forty two
).
Тестовые случаи
Однозначные целые числа:
Входные данные:
1, 2, 3, 4, 5
Выход:
5, 4, 1, 3, 2
Многозначные целые числа:
Входные данные:
-1002, 5, 435012, 4, 23, 81, 82
Выход:
81, 82, 5, 4, 435012, -1002, 23
Пробелы между словами, без дефисов, запятых или «и»:
Входные данные:
6, 16, 60, 64, 600, 6000, 60000, 60004, 60008, 60204, 60804
Выход:
6, 600, 6000, 16, 60, 64, 60000, 60008, 60804, 60004, 60204
Помните, что это код-гольф , поэтому выигрывает код с наименьшим количеством байтов. Не допускаются лазейки!
Ответы:
JavaScript (ES6),
189179186 байтОсновная идея состоит в том, чтобы преобразовать каждое входное число в короткую строку, которая находится в правильной лексографической позиции по сравнению со всеми другими парами номер-строка. Вот используемый словарь: (Не запускайте фрагмент; он просто используется, чтобы скрыть длинный список.)
Показать фрагмент кода
Это создает очень краткий способ отображения каждого числа в его лексографически правильное положение. Вот что делает рекурсивная
q
функция:В
0
начале строки необходимо убедиться, что, например, 100 (one hundred
преобразовано вPK0
) отсортировано до101
(one hundred one
преобразовано вPKP
). Это создает странный сценарий, в котором 0 (zero
) сортируется в начало массива, поэтому, чтобы обойти это, в функции сортировки мы сначала сортируем любые нули справа!x-!y||(...
.источник
[1100, 1000]
. Я ожидал бы, что выходные данные будут1000 (one thousand), 1100 (one thousand one hundred)
, но выходные данные будут в том же порядке, что и входные.1000
анализируется какone thousand zero
; Я исправлю это на мгновение. Должны ли мы поддерживать0
самостоятельно, хотя? Это уникальный случай, который добавит примерно 15 байтов в мой код.Информ 7,
214201118 байтInform 7 - абсолютно ужасный язык для игры в гольф, поэтому я хотел дать ему шанс здесь.
Отступ должен использовать вкладку (
\t
символы ), но HTML не нравится. И наоборот, Inform не любит пробелы для отступов, поэтому вам придется заменить пробелы на вкладки, если вы скопируете и вставите код отсюда, чтобы протестировать его. Или просто скопируйте и вставьте из источника Markdown.Golfed:
Входные данные должны быть таблицей Inform, например, (
\t
между столбцами):Выход:
Эта функция запускает таблицу один раз, добавляя текстовое представление каждого числа в новом столбце. Затем он сортирует строки таблицы по текстовому столбцу; в Inform строки сортируются лексикографически. Наконец, он печатает исходный столбец в новом порядке. Удобно, что формат Inform 7 «сырой, но иногда полезный» для распечатки столбцов таблицы оказывается разделенным запятыми, именно так, как требуется.
Ungolfed, с шаблоном, показывающим, как вызвать функцию:
источник
words
ли ссылка на прописанные версии чисел, встроенные в Inform 7?say "[R entry] "
должно хватить.Mathematica, 67 байт
Безымянная функция, принимающая список целых чисел в качестве аргумента и возвращающая список целых чисел в качестве значения.
#~IntegerName~"Words"
является встроенным, который меняет целое число на его имя на английском языке.IntegerName
иногда на выходе выводятся запятые и дефисы, поэтомуStringReplace
вызов избавляется от них. (К сожалению, дефис на самом деле является 3-байтовым символом, 8208, в UTF-8.) ЗатемSortBy
сортирует исходный список по алфавиту в соответствии со значением измененного целочисленного имени.Хорошее совпадение:
IntegerName
используетnegative
вместо того, чтобыminus
в своем выводе - но никакое слово, появляющееся в именах любого из разрешенных чисел, не находится в алфавитном порядке между этими двумя словами, поэтому замена не требуется!(Шляпа для ngenisis за напоминание
Sortby
.)источник
IntegerName
. В документации Wolfram говорится, что это юникод-символ 2010 года .Bash + GNU utils + bsdgames, 52
I / O - строки с разделителями новой строки.
number
форму числа (заданного утилитой bsdgames ), после:
чего следует числовая форма числа.sort
ред.sed
обрезает ведущие символы до и включая:
, оставляя числовую форму отсортированной по мере необходимости.number
правильно обрабатывает «минус», и его вывод достаточно близок к указанному формату, которыйsort
работает как требуется. Он выдает «сорок четыре» вместо «сорок четыре», но это не должно иметь значения с точки зрения сортировки.Для пакета bsdgames может потребоваться установка:
sed
Иsort
утилиты почти наверняка уже в вашем дистрибутиве.источник
-t:
бесполезно, и вы можете использоватьnumber<<<&
-t:
. Тем не менее,e
функция val в sed выполняет команды с использованиемsh
, поэтому такие функции bash, как, например<<<
, не будут работать.sh
он пытается максимально эмулировать Posix sh, это означает, что такие bashisms<<<
отключены. GNUsed
«se
Вэл функция запускает команды с/bin/sh -c ...
и/bin/bash -c ...
. Вы пробовали это?<<<
, даже в режимеPython + inflect,
979189 байтИспользовал
inflect
библиотеку для преобразованияwords
массива целых чисел в их фонетическое / строковое представление. Хранится в словаре пар k / v, где ключи были числовым представлением, а значения были строковым представлением. Возвращает список ключей, отсортированных по значениям.РЕДАКТИРОВАТЬ: Сохранено 5 и 3 байта, благодаря ETHproductions и Alex.S!
источник
a={x:inflect.engine().number_to_words(x)for x in words}
.from inflect import*
и выбрасываяinflect.
во второй строке.Mathematica, 30 байт
Ответ ниже выводит чистую функцию, которая будет принимать список целых чисел в качестве входных данных и сортировать их по алфавитному имени. Только то, что доктор прописал ;)
Вот негольфированная версия:
А вот пример использования:
Который также может быть записан как
Они производят идентичные результаты - в
f[x]
Mathematica , эквивалентноf@x
.Существует гораздо более длинный ответ, который другой пользователь разместил в Mathematica. В этом ответе делается попытка исправить некоторые небольшие различия между тем, как mathematica размечает числа по алфавиту, чтобы лучше соответствовать способу, которым указанные числа OP должны быть размечены по алфавиту, однако вещи, которые они исправляют, не влияют на порядок сортировки, и мой ответ выводит идентично их:
источник
TheirF
правильно сортирует 888 до 880 000, аMyF
не. Вероятно, проблема связана с копированием-вставкой странного дефиса: ваша версия,TheirF
вероятно, заменяет нормальные дефисы (которых нет), в то время как фактическая версия заменяет странный 3-байтовый дефис Unicode. (Было бы еще интересно посмотреть, нужно ли удалять запятые.)Common Lisp, 113 байт
Внешние библиотеки не нужны.
Выведите, если
x
есть'(1 2 3 4 5)
:источник