Вызов
Напишите самую короткую программу, которая преобразует удобочитаемый интервал времени в компоненты даты:
{±YEARS|±MONTHS|±DAYS|±HOURS|±MINUTES|±SECONDS}
Примеры случаев
Каждый тестовый пример состоит из двух строк, за которыми следует ввод:
1 year 2 months 3 seconds
{1|2|0|0|0|3}
-2 day 5 year 8months
{5|8|-2|0|0|0}
3day 9 years 4 seconds -5 minute 4 years 4 years -3seconds
{17|0|3|0|-5|1}
правила
- Вы не можете использовать
strtotime
или любую встроенную функцию, которая делает всю работу. - Кратчайший код выигрывает (в байтах)
- Вы можете распечатать свой вывод
stdout
или файл, результат также может быть возвращен функцией, это зависит от вас - Маркер может быть в форме единственного или множественного числа.
- Компоненты могут быть в случайном порядке
- Между номером и токеном не должно быть пробелов
- Знак необязателен, если временной интервал положительный (вход и выход)
- Если компонент появляется более одного раза, следует добавить значения
- Каждый компонент имеет свой собственный знак
- Компоненты должны обрабатываться отдельно (например,
80 minutes
остается равным 80 на выходе) - Ввод гарантированно будет в нижнем регистре
Счастливого гольфа!
Sign is optional when the time interval is positive
Означает ли это, что входные данные могут содержать+
знаки?Ответы:
CJam, 60 байтов
Застряв в 60-х годах, мне наконец удалось сжать до 60 байт. Достаточно хорошо! Отправим его!
Попробуйте онлайн
сплющенные:
Расширено и прокомментировано:
Сначала я начал использовать подход, основанный на токене, но он довольно твердо застрял на ... 61 байте. Вздох. Таким образом, я полностью изменил механизм и переключился на этот основанный на характере подход, который намного более интересен в любом случае.
Мой метод синтаксического анализа работает путем добавления любых допустимых числовых символов (
0
-9
и-
) в буфер и синтаксического анализа буфера в виде целого числа при достижении определенного символа из одного из имен единиц времени. Эти символыy
,t
,d
,h
,i
, иc
, которые все удовлетворяют условиям, что они появляются в имени единицы времени и не появляются перед символом распознавания в любом другом имени единицы времени. Другими словами, когда достигается один из этих символов распознавания единиц времени, числовой буфер будет заполнен последним увиденным числом, если это фактически указывает на единицу времени, или числовой буфер будет пуст, если он только появляется, но не должен сигнал, некоторые другие единицы времени. В любом случае числовой буфер анализируется как целое число или 0, если он был пустым, и это добавляется к соответствующему значению единицы времени. Таким образом, символы распознавания, появляющиеся в других единицах времени после символа распознавания, не имеют никакого эффекта.Другие сумасшедшие хаки включают в себя:
Для всех, кто интересуется моим решением на основе токенов, которое застряло на 61 байте, я также опубликую его здесь. Я никогда не удосужился расширить или прокомментировать это.
CJam, 61 байт
источник
Perl: 61 символов
Благодаря @nutki.
Образец прогона:
Мои бедные усилия:
7877 персонажейисточник
s/(-?\d+) *(..)/$$2+=$1/ge;$_="{ye|mo|da|ho|mi|se}";s/\w./${$&}+0/ge
s/-?\d+ *(m.|.)/$$1+=$&/ge;$_="{y|mo|d|h|mi|s}";s/\w+/${$&}+0/ge
(m.|.)
->m?(.)
сохраняет дополнительные 4.Рубин,
119106868584 байтаОдин байт сохранен благодаря Sp3000.
Это безымянная функция, которая принимает входные данные в виде строки и возвращает результат (также в виде строки). Вы можете проверить это, назначив его
f
, скажем, и назвависточник
Python 2, 99 байт
Это лямбда-функция, которая принимает строку и просто использует регулярное выражение для извлечения необходимых чисел.
Благодаря Мартину за указание на то , что
\s*
только может быть<space>*
. Легко забыть, что регулярные выражения соответствуют пробелам буквально ...источник
JavaScript 100
105 112Изменить Добавление шаблонных строк (впервые реализовано в декабре 2014 г., поэтому подходит для этой задачи) - в то время я не знал о них
Редактировать Эврика, наконец-то я понял смысл
m?
всех остальных ответов!Тестовое задание
источник
R 197 байт
Я понимаю, что это не конкурентная запись вообще, я просто хотел найти решение в R. Любая помощь, сокращающая это, конечно, приветствуется.
Как и ответ Мартина, это безымянная функция. Чтобы вызвать его, назначьте его
f
и передайте строку.Это довольно отвратительно, поэтому давайте посмотрим на версию без гольфа.
На основе одной структуры легко увидеть, что происходит, даже если вы не слишком знакомы с R. Я подробно остановлюсь на некоторых аспектах, которые выглядят незнакомцами.
paste0()
как R объединяет строки без разделителя.str_extract_all()
Функция исходит от Hadley Уикхемstringr
пакета. Обработка регулярных выражений в базовом пакете в R оставляет желать лучшего, и это именно то, что нужноstringr
. Эта функция возвращает список совпадений регулярных выражений во входной строке. Обратите внимание, как регулярное выражение заключено в функциюperl()
- это просто говорит о том, что регулярное выражение выполнено в стиле Perl, а не в стиле R.gsub()
выполняет поиск и замену с использованием регулярного выражения для каждого элемента входного вектора. Здесь мы говорим заменить все, что не является числом или знаком минус, пустой строкой.И там у вас есть это. Дальнейшие объяснения будут с удовольствием предоставлены по запросу.
источник
library(stringr)
в свой источник?Кобра - 165
источник
C ++ 14,
234229 байтРедактировать: сократить 5 байтов, используя объявление старого стиля вместо
auto
.Я знаю, что победитель уже выбран, и что это будет самая длинная заявка на данный момент, но я просто должен был опубликовать решение C ++, потому что держу пари, что никто не ожидал его вообще :)
Честно говоря, я очень доволен тем, насколько коротким он оказался (по меркам C ++, конечно), и я уверен, что он не может быть короче этого (всего одно замечание, см. Ниже) , Это также довольно хорошая коллекция новых возможностей для C ++ 11/14.
Здесь нет сторонних библиотек, используется только стандартная библиотека.
Решение в форме лямбда-функции:
Ungolfed:
По какой-то причине мне пришлось написать
вместо просто
потому что итератор будет возвращать только одно совпадение, если я передам временный объект. Мне это не кажется правильным, поэтому мне интересно, есть ли проблема с реализацией регулярных выражений в GCC.
Полный тестовый файл (скомпилированный с GCC 4.9.2 с
-std=c++14
):Выход:
источник
PHP, 141 байт
принимает входные данные из первого аргумента командной строки; использует
[,]
для вывода вместо{|}
. Беги с-r
.сломать
источник