Написать функцию или программу , которая принимает строку входы, полностью полбы, английские названия месяцев в названии случае: January
, February
, March
и т.д. (нуль / CR / LF прекращено в порядке, разграничены с некоторыми не-буквенного символа , если вы этого хотите) и либо
сравнивает два входа, возвращая значение Truthy, если второй вход больше (в месячном порядке), чем первый. Равные значения приводят к значению Falsey
или сортирует произвольную последовательность (список, строку с разделителями и т. д.) в хронологическом порядке
(Суть задачи заключается в определении метода / выражения, которое дает правильный лексикографический вид. Некоторые языки могут иметь более короткий ответ с одним или другим)
Вы не можете использовать какие-либо внутренние методы анализа времени (например strptime
), чтобы перевести название месяца в число или предварительно сопоставленное отображение названий месяцев. Используйте свойства самих строк, экономной справочной таблицы, которую вы определяете, или что-то умное.
пример
Функциональные примеры, хотя первое запрещено правилами ...
import datetime
def is_later_month(a, b):
'''
Example of prohibited code because it relies on language
features about how to parse month names
'''
return datetime.strptime(a, '%B') < datetime.strptime(b, '%B')
Тем не менее, все версии в порядке, потому что мы кодируем
months = {
'January': 1, 'February': 2, 'March': 3,
'April': 4, 'May': 5, 'June': 6,
'July': 7, 'August': 8, 'September': 9,
'October': 10, 'November': 11, 'December': 12,
}
def is_later_month(a, b):
"""
Returns True/False when comparing two months.
"""
return months[a] < months[b]
Или вы могли бы сделать функцию сортировки
months = {'as above...'}
def sort_months(l):
"""
Sorts list and returns it. Different input and output than the above,
but equally valid. Sorting versus comparing might be shorter in your
favorite language.
"""
return sorted(l, key=lambda x: months[x])
Пример тестов
assert is_later_month('January', 'February')
assert is_later_month('January', 'December')
assert is_later_month('November', 'December')
assert not is_later_month('July', 'July')
assert not is_later_month('October', 'September')
months
список всех названий месяцев, я бы запретилmonths[x] < months[y]
в качестве ответа. Список названий месяцев имеет некоторые более специфические особенности (разная длина, общность), которые упрощают / усложняют задачу по случайно сгенерированным строкам.Ответы:
Желе , 19 байт
Это монадическая ссылка, которая принимает список в качестве аргумента и сортирует его. Попробуйте онлайн!
Фон
Желе использует модульную индексацию на основе 1. Если мы повторяем названия месяцев достаточно часто, чтобы получить 11 символов, мы получаем следующий массив.
В 11- м (последнем) столбце все символы разные, поэтому мы можем использовать их для определения порядка месяцев.
Как это устроено
источник
машинный код x86,
2625 байтHexDump:
Код сборки:
Следующая хеш-функция помещает названия месяцев в правильном порядке (определяется методом грубой силы):
Он применяется к первым 4 байтам (32 битам) входной строки, расположенным в порядке с прямым порядком байтов. Затем сравниваем результат и используем
SALC
для установки регистр результата (al):источник
Желе , 15 байт
Здесь нет ссылки на переводчика онлайн, потому что это одна медленная подача. Программа использует функцию хеширования
354^(input interpreted as base 32 int) % 991
в качестве ключа сортировки, которая дает выходные данные в правильном порядке. Программа не завершится в ближайшее время, потому что результаты возведения в степень огромны - для «сентября» необходимо вычислить число с 0,24 квадриллионными цифрами!Объяснение желе:
Python подтверждение концепции сценария - обратите внимание на использование
pow
для модульного возведения в степень, что гораздо более эффективно:источник
Python,
646157 байтЛямбда принимает два месяца в качестве входных данных и сравнивает их. Проверьте это на Ideone .
Спасибо @ljeabmreosn за то, что вы сыграли в гольф 3 байта и проложили путь еще 3!
источник
s[10%len(s)]
на(4*s)[10]
работу?Python,
8171 байтhttps://repl.it/CluN/1
Сравнивает индекс
m
по вторым и третьим буквам двух месяцев.83-байтовая версия для сортировки списка месяцев:
источник
Рубин, 58 байт
Использует сортировку по месяцам из ответа @ atlasologist .
Функция сравнения немного длиннее - 63 байта
источник
J
6665 байтИспользует тот факт, что f (m) = 2 * (ord (m [0]) + ord (m [-1])) // len (m) является допустимой функцией в ограниченной области 12 месяцев:
Использование:
(Ни в коем случае это не лучшая идея, но я не хотел украсть чей-то хитрый рейтинг!)
Вот более короткая версия с использованием метода @ atlasologist :
J, 63 байта
Использование:
И намного более короткая версия с использованием @ Dennis's умный метод :
J, 34 байта
источник
Haskell, 74 байта
Мой первый код гольф, ура! Общая идея этого навеяна главным ответом в Jelly и тем фактом, что когда циклически повторяются названия месяцев, 11-й символ всегда уникален.
Вот незагрязненная версия, чтобы увидеть, как это работает:
e
Функция представляет собой функцию eleventhChar ( к сожалению , не может сдирать 4 байта из - за ограничение мономорфизма я думаю) и#
функция инфиксной соответствуетinOrder
функции.Небольшое изящное решение, но могут быть способы сброса большего количества байтов (я нашел некоторые только во время написания этого!)
источник
e s=head.drop 10$cycle s
как вы делали в вашем объяснении, используя.
вместо$
:e=head.drop 10.cycle
. Однако использование оператора индекса списка!!
еще короче:e=(!!10).cycle
Ява,
133123Golfed:
Я искал умную технику, как в ответе ассемблера, но это заняло слишком много времени, чтобы понять, поэтому я выбрал ту же технику, которую использовали все остальные.
Ungolfed:
источник
substring
вместо этого, еслиcharAt
"" +
так как нет больше сырыхchar
s.Машинный язык ARM в Linux
4440 байтЯ использовал хеш-функцию, отличную от решения Анатолиг и попытался использовать инструкции для большого пальца, чтобы сохранить несколько байтов (хотя я выбрал 8 байтов, переходя в режим большого пальца).
Вы можете попробовать это на устройстве Raspberry Pi или Android с GNURoot.
Для запуска введите что-то вроде
Текущая версия теперь правильно обрабатывает случай равенства (и другие).
источник
bfac
?ite ge
условно выполняет следующую инструкцию (movge r0, #0
), еслиr3 >= r0
, в противном случае , выполняется следующая инструкция (movlt r0, #1
). Я думаю, что здесь есть место, чтобы сбросить пару байтов, но у меня не было времени поработать над этим :-)Perl 6 , 55 байт
Для сравнительных версий потребуется еще несколько байтов:
Тестовое задание:
источник
Хаскель, 118 персонажей
Использует тот факт, что имя каждого месяца уникально по его первым и четвертым символам (или 3-му по май) для определения типа данных, который может автоматически анализироваться и сравниваться языком. Функция 'r' преобразует строку, захватывая первые четыре символа (или меньше), а затем просто выбирая первый и последний. Тогда «a # b» является оператором для сравнения значений:
Возможно, это можно сделать более эффективным способом, но я хотел попробовать сделать это, используя полезный тип данных для представления месяцев.
источник
PowerShell,
968863 байтанапример
Теперь выполняется вторая задача сортировки списка по порядку; Предыдущие версии делали сравнение двухмесячного теста:
На основе вторых двух символов в названии месяца.
источник
Python
8382 байтаТест: https://repl.it/repls/TimelyDecimalBrowsers
Получает сумму первых 3 символов и создает один символ для поиска.
источник
Javascript, 118 байт
Может быть больше в гольфе, вероятно, избавившись
c
и используяarray.map
, но это то, что у меня есть сейчас ...источник
for(i=0;i<12;)c.push(p[[4,3,7,0,8,6,5,1,11,10,9,2][i++]]);
Баш, 101 байт
это такая функция, как is_later
тестовое задание
источник
к4, 29
Порт @ Денниса желе ответ .
Это сортировщик, а не компаратор; Интересно, что компаратор тривиально реализуется тем же алгоритмом, и только на один байт длиннее:
источник
Bash + coreutils,
94 байта,93 байтаЭто попытка придумать преобразование, которое сортирует лексикографически. Если вы внимательно посмотрите на ключ преобразования
FMAyulgSOND
вы увидите месяцы с февраля по декабрь (январь становится пустым после преобразования; он вытягивается вверх, используя «B» в качестве разделителя). Реверсирование, усечение и удаление неключевых букв позволяют осуществить этот трюк.90 байтов, используя C Locale
... где ␉ символ табуляции.
80 байтов, используя C Locale
... используя метод @ atlasolog. Необходимо использовать этот подход для работы с большим количеством языков.
Тест / Usage
выходы:
источник