В прекрасной и увлекательной книге Вернора Винджа « Глубина в небе» (которую я, кстати, очень рекомендую 1 ), культура Кенг Хо , охватывающая различные звездные системы, не имеет понятия «дни», «месяцы». лет »и т. д., и, следовательно, имеет уникальную систему учета времени, которая измеряет время полностью в секундах. Наиболее часто используемые единицы являются Ksec (kilosecond), мксек (megasecond) и GSEC (gigasecond). Вот удобная таблица из моей собственной копии книги (поскольку я не могу найти ее в Интернете):
В настоящее время вы летите на Pham Nuwen , и вы только что получили сообщение от странной, неизвестной планеты под названием " Земля ". 2 Они используют другие единицы времени, чем вы, и ваши компьютеры их не распознают. Как постоянный программист-археолог корабля, ваша задача состоит в том, чтобы исправить код обработки времени, чтобы он распознавал земные единицы времени.
Естественно, так как вы не в состоянии простуды еще для нескольких Ksecs, вы хотите сделать свой код максимально коротким, чтобы его можно было быстро написать. К счастью, как межзвездная торговая культура, у Кенг Хо есть доступ ко всем изобретенным языкам программирования.
вход
На входе будет одна строка, содержащая один или несколько разделенных пробелами
компонентов . Компонент определяется как целое число> 0 и ≤ 255, то пространство, а затем один из second
, minute
, hour
, day
, week
, month
,
year
, decade
, или century
, возможно , множественное число (с дополнительным s
, или
centuries
для последнего случая).
Вот некоторые действительные примеры входных данных:
10 days 12 hours
1 year
184 centuries 1 second
9 weeks 6 days 2 hours 1 minute 20 seconds
Вы можете предположить следующее относительно ввода:
Плюрализация единиц всегда согласуется с соответствующим номером.
Если на входе есть несколько компонентов , они всегда будут в порядке убывания длины.
Вот что означают различные входные единицы для целей этой задачи:
unit relative absolute
---------------------------------------
second 1 second 1 second
minute 60 seconds 60 seconds
hour 60 minutes 3600 seconds
day 24 hours 86400 seconds
week 7 days 604800 seconds
month 30 days 2592000 seconds
year 365 days 31536000 seconds
decade 10 years 315360000 seconds
century 10 decades 3153600000 seconds
Выход
Вот модули Qeng Ho, которые должен поддерживать ваш код:
unit relative absolute
----------------------------------------
second 1 second 1 second
Ksec 1000 seconds 1000 seconds
Msec 1000 Ksecs 1000000 seconds
Gsec 1000 Msecs 1000000000 seconds
Используйте следующий алгоритм для определения вывода вашего кода:
Сначала сложите общее количество времени, которое представляет вход.
Найдите самую большую единицу Qeng Ho, которая короче или равна времени ввода - по сути, найдите самую большую единицу, в которой есть хотя бы одна из них.
Преобразуйте общее количество времени, указанного во входных данных в эту единицу, и выведите результат, округленный до трех знаков после запятой.
Вы можете выбрать, какой из следующих методов использовать: округление вверх, округление вниз, округление от нуля или округление в направлении ∞ или -∞. Если округленный результат заканчивается 0
, вы можете либо удалить конечные нули, либо оставить столько, сколько хотите (или сделать оба, в зависимости от ввода).
Если округленный результат точно 1.000
, вы должны использовать особую форму ( second
, Ksec
, Msec
, Gsec
); в противном случае использовать форму множественного числа ( seconds
,
Ksecs
, Msecs
, Gsecs
).
В некоторых крайних случаях вы можете использовать единицу измерения, например, Ksec, но получить округленный результат 1000 000 Ksecs. В этом случае вы можете просто вывести
1000.000 Ksecs
вместо 1 Msec
.
Вы можете всегда предполагать, что входные данные представлены в порядке убывания единиц (век, декада, год и т. Д.); Кроме того, компонент, который идет после любого данного модуля, всегда будет короче (то есть, 1 decade 20 years
является неправильным вводом).
Контрольные примеры
Примечание: результаты, помеченные звездочкой ( *
), могут отличаться на незначительную величину из-за разницы округления.
input output
-------------------------------------------------------------
1 hour 3.600 Ksecs
1 day 86.400 Ksecs
2 weeks 1.210 Msecs
1 year 31.536 Msecs
32 years 1.009 Gsecs *
1 second 1.000 second
1 century 6 decades 5.046 Gsecs *
255 centuries 804.168 Gsecs
2 weeks 6 days 1 hour 19 minutes 4 seconds 1.733 Msecs
1 week 3 days 3 hours 7 minutes 875.220 Ksecs
1 week 4 days 13 hours 46 minutes 40 seconds 1.000 Msec
2 months 2 hours 5.191 Msecs *
16 minutes 39 seconds 999.000 seconds
правила
- Это код-гольф , поэтому выигрывает самый короткий код в байтах.
1: только если вы любите жесткий scifi, конечно. В этом случае я рекомендую сначала прочитать «Огонь на глубине» , что (на мой взгляд) еще более фантастично.
2: хорошо, технически «Старая Земля» упоминается несколько раз в «Глубине в небе» , но ...
2 months 2 hours
как «2 месяца * 2 часа».