Это снова в школьный сезон! Так что на неполный рабочий день вы помогаете в школьной библиотеке. Проблема в том, что главный библиотекарь никогда даже не слышал слова «Десятичный Дьюи», не говоря уже о внедрении этой системы. Вместо этого используемая система сортировки выросла «органично», поскольку библиотека расширилась ...
Стремясь сохранить свое здравомыслие, вы решили написать программу, которая поможет вам сортировать книги по мере их поступления, потому что горе вам, если вы неправильно сортируете книги. (Главный библиотекарь ОЧЕНЬ строг.)
Ввод, вывод
- Входными данными будет список (гипотетических) названий книг, по одному на строку, из STDIN / языкового эквивалента.
- Вы можете принять не более 100 книг одновременно (вы можете носить с собой только столько книг одновременно).
- В названиях книг может быть несколько слов, и эти слова могут быть разделены пробелами или другой пунктуацией (например, двоеточие
:
, тире-
и т. Д.). - Для простоты расчета предположим, что все названия имеют UTF-8.
Выходные данные - это те же заголовки, отсортированные в соответствии с приведенными ниже правилами, снова по одному на строку, в STDOUT / эквивалент языка.
Правила сортировки
Книги отсортированы по номерам на основе их среднего значения символов (т. Е. Совокупного значения символов, разделенного на количество символов в названии книги), рассчитанного по следующим правилам:
- Все символы учитываются для определения количества символов в заголовке.
- Строчные буквы подсчитываются по их положению в алфавите. (А = 1, B = 2, ... г = 26)
- Если заголовок содержит заглавные буквы, они считаются для 1,5 их строчными буквами (A = 1,5, B = 3, ... Z = 39). («Заглавные буквы важны!» - говорит библиотекарь.)
- Каждый знак пунктуации / символ в этом списке
!@#$%^&*()-=_+[]\{}|;':",./<>?~
отсчитывает -1 от совокупного значения перед усреднением. («Грандиозных названий нет!») - Если заголовок содержит число, написанное арабскими цифрами , это число перед сортировкой вычитается из среднего значения. Несколько последовательных цифр обрабатываются как одно число (например,
42
вычтет 42, а не вычтет 4, а затем вычтет 2). Отдельные цифры не учитываются для совокупного значения (т. Е. Каждая цифра дает 0), но ДО учитываются для количества символов. Обратите внимание, что это может привести к отрицательному значению и должно рассматриваться соответствующим образом. (По слухам, библиотекарь уже несколько лет влюблен в преподавателя математики.) - Если заголовок содержит два отдельных слова, которые начинаются с «,»
R
, книга получает оценку «бесконечность» и сбрасывается в стопку в углу (т. Е. Случайно расположенную в конце списка). (Библиотекарь был когда-то брошен человеком с этими инициалами, или вы так слышали.) - Пробелы не учитывают совокупное значение символа (т. Е. Они дают 0), но ДО способствуют количеству символов в заголовке.
- Символы, которые не соответствуют указанным выше правилам (например, a
ÿ
), не учитываются в совокупном значении символа (т. Е. Они дают 0), но ДОЛЖНЫ вносить вклад в количество символов в названии. - Например, гипотетическая книга
ÿÿÿÿÿ
будет иметь «оценку»(0+0+0+0+0) / 5 = 0
, а гипотетическая книгаÿÿyÿÿ
будет иметь «оценку»(0+0+25+0+0) / 5 = 5
. - Две книги, которые "забивают" одно и то же, могут быть выведены на ваш выбор. (Во всяком случае, они на одной полке)
Пример ввода 1
War and Peace
Reading Rainbow: The Best Unicorn Ever
Maus
Home for a Bunny
Пример вывода 1 (в скобках указаны «оценки», чтобы показать обоснование - вам не нужно их печатать)
War and Peace (8.5)
Home for a Bunny (10.125)
Maus (15.125)
Reading Rainbow: The Best Unicorn Ever (infinity)
Пример ввода 2
Matthew
Mark
Luke
John
Revelations
Пример вывода 2 (с «счетами» в скобках, чтобы показать обоснование - вам не нужно их печатать)
Mark (12.375)
John (13)
Revelations (13.545454...)
Luke (13.75)
Matthew (~13.786)
Пример ввода 3
42
9 Kings
1:8
7th
Пример вывода 3 (в скобках указаны «показатели», чтобы показать обоснование - вам не нужно их печатать)
42 (-42)
1:8 (-9.3333...)
9 Kings (~0.36)
7th (2.3333...)
Другие ограничения
- Это Code-Golf, потому что вы должны держать программу в секрете от постоянных глаз библиотекаря, и чем меньше программа, тем легче ее скрыть.
- Стандартные ограничения лазейки применяются
- Не позволяйте библиотекарю отвлечь вас, потратив все свое время на PPCG.
Ответы:
APL (132)
Поскольку все остальные делают то же самое, это тоже функция, которая принимает массив заголовков и возвращает его отсортированным, например:
Объяснение:
⎕ML←3
: установить⎕ML
в3
(для⊂
)⍵[⍋{
...}¨⍵]
: сортировка ввода по значениям, возвращаемым из внутренней функции↑¨⍵⊂⍨⍵≠' '
: получить первый символ каждого слова2='R'+.=
: посмотреть, если два из них'R'
.:!99
: если так, верни 99! (≈ 9,3 × 10 155 ). Это не совсем бесконечность, но это подойдет: заголовок никогда не может иметь оценку более чем в 38 раз превышающую его длину (ZZZZ ...), поэтому, если ни один заголовок не будет больше, чем примерно 2 × 10 130 йотбайт, Гарантируется, что это будет в конце.⋄
: в противном случае:(
...)÷⍴⍵
: разделите счет на длину⍵
после его вычисления:G←(⊂⎕A),(⎕UCS 96+⍳26)
: хранить вG
верхнем и нижнем регистре букв(⎕UCS 32+⍳94)~'`',⎕D,∊G
: печатаемые символы ASCII, за исключением букв, цифр, пробелов и'`'
, которые являются символами, для которых вычитается точка. (Это короче, чем записать их все, потому чтоG
используется позже.)+/⍵∊
: посчитать количество этих символов в⍵
-
вычесть это из:+/∊1.5 1×(⍳×∊⍨)∘⍵¨G
: сумма 1,5 × баллов за прописные буквы и 1 × баллов за строчные буквы.-⍨
: затем вычесть общее количество чисел в⍵
:⍵⊂⍨⍵∊⎕D
: найти группы цифр в⍵
'0',
: добавить'0'
, чтобы предотвратить пустой список⍎¨
: оценить каждую строку+/
: найти суммуисточник
!99
вы могли использовать⌊/⍬
Lua 5.3,
366364 BytesЭтот код работает только в Lua 5.3, потому что он должен работать с символами Unicode. Если вас не интересует Unicode, замените «utf8» на «string», и он будет хорошо работать с Lua 5.2 или 5.1.
Он берет свои входные данные из аргументов командной строки, поэтому либо запустите его из командной строки, либо поместите этот код над моим ответом:
источник
utf8
сstring
на Ideone и не получил никакого вывода.(arg)
сидит там, глядя мне в лицо. Этот вопрос, видимо, зажёг мне мозг. Есть +1.Mathematica,
253216 байт (214 символов)Вызовите функцию как
f[{"42", "9 Kings", "1:8", "7th"}]
; он вернет отсортированный список входных данных.Просто едва сделал это! Сопоставление с образцом в Mathematica не так лаконично, когда задействованы строки, и меня просто убивают эти длинные имена. Два дополнительных байта предназначены для
Infinity
символа Юникод.(Дайте мне знать, не попал ли я в какие-либо стандартные лазейки.)
Обновить
Посмотрев немного ближе к ответу edc65, похоже, что OP примет функцию, которая сортирует список строк. Имея это в виду, мы можем использовать каррированную форму
SortBy
(которую Mathematica называет «операторной формой»); с одним аргументом (функция, примененная к элементам списка для определения их порядка), она ведет себя как функция, которая принимает один аргумент, возвращая отсортированную форму ввода; то естьSortBy[list, f]
эквивалентно(SortBy[f])[list]
.Ungolfed
источник
JavaScript (ES6), 210
218 251Как функция с аргументом массива, возвращается отсортированный.
источник
O.innerHTML
чтобыthis.InnerHTML
в консоли браузера Firefox.C #,
352349 байтИз-за магии linq:
Могли бы сохранить еще 6 байтов, если бы обратный удар был бы включен в список знаков препинания!
источник
Go, 755 байт
Отформатированная версия:
Реализация пользовательского интерфейса сортировки сделала его длиннее, чем ожидалось. Программа читает из STDIN до конца ввода или вводится пустая строка.
источник
PHP, 362
367БОтформатированная версия:
Интересные строки:
Преобразует один символ UTF-8 в его байтовые значения и суммирует их, чтобы мы получили реальное значение для символов ASCII и значение больше 127 для многобайтовых символов.
Использует низкий приоритет оператора
and
иor
для назначения символьного значения в одном операторе безif
.источник
Perl 5 , 190 байт
Попробуйте онлайн!
источник