Вступление
Время сбивает с толку. От шестидесяти секунд до минуты, от шестидесяти минут до часа, от двадцати четырех часов до дня (и не говоря уже о том, что надоедливый am / pm!).
В настоящее время нет места для такой глупости, поэтому мы решили принять единственную разумную альтернативу: десятичные дни! То есть каждый день считается целой единицей, а все, что короче, записывается как десятичная дробь этого дня. Так, например: «12:00:00» будет записано как «0.5», а «01:23:45» может быть записано как «0.058159».
Поскольку для привыкания к новой системе потребуется время, вам поручено написать программу, которая может конвертировать между ними в обоих направлениях.
Вызов
Напишите программу на выбранном вами языке, которая, учитывая современное время в формате ISO-8601 «чч: мм: сс», будет возвращать эквивалентную десятичную дробную единицу. Аналогично, с учетом десятичной дроби программа должна возвращать время в современном формате, который был первоначально указан.
Вы можете сделать следующие предположения:
- Современное время ввода и вывода может варьироваться от «00:00:00» до «24:00:00».
- Время ввода и вывода десятичного времени может варьироваться от «0» до «1», и должно быть в состоянии принимать / выводить как минимум до 5 знаков после запятой (например, «0.12345»). Больше точности приемлемо
- Программа должна быть в состоянии знать, какое направление преобразования выполнить на основе входных данных.
- Вы не можете использовать связанные со временем функции / библиотеки
Победитель будет определен по кратчайшему коду, который соответствует критериям. Они будут выбраны не менее чем за 7 десятичных дней или если / когда было достаточно представлений.
Примеры
Вот (n намеренно) плохо написанный фрагмент кода JavaScript, который будет использоваться в качестве примера:
function decimalDay(hms) {
var x, h, m, s;
if (typeof hms === 'string' && hms.indexOf(':') > -1) {
x = hms.split(':');
return (x[0] * 3600 + x[1] * 60 + x[2] * 1) / 86400;
}
h = Math.floor(hms * 24) % 24;
m = Math.floor(hms * 1440) % 60;
s = Math.floor(hms * 86400) % 60;
return (h > 9 ? '' : '0') + h + ':' + (m > 9 ? '' : '0') + m + ':' + (s > 9 ? '' : '0') + s;
}
decimalDay('02:57:46'); // 0.12344907407407407
decimalDay('23:42:12'); // 0.9876388888888888
decimalDay(0.5); // 12:00:00
decimalDay(0.05816); // 01:23:45
источник
n
гдеn
2 ^ n секунд. Таким образом, значение «6» имеет TTL около 1 минуты. Значение «12» имело TTL около 1 часа. «15» было около 8 часов и так далее. Это позволило одному байту определить время ожидания и дать вам достаточно контроля для короткого или длительного времени.Ответы:
CJam,
58 5642 байтаЯ уверен, что это слишком долго и можно много играть в гольф. Но здесь для начала:
Попробуйте онлайн здесь
источник
86400q':/:d_,({60bd\/}{~*mo60bAfmd2/':*}?
я удаляю свой ответ. Этоmo
так, что 0.058159 преобразуется в 01:23:45Python 2,
159150141 + 2 = 143 байтаПростое решение, вероятно, может быть намного короче. Будет работать над этим.
Добавлены два байта для учета входных данных, которые необходимо заключить в "s". Кроме того, Sp3000 указал на проблему с интерпретацией восьмеричных значений eval () и показал способ сократить форматирование, использовать map () и удалить один отпечаток.
Проверьте это на ideone здесь.
источник
Javascript ( ES6 ),
116110 байтовкомментарии:
источник
24:00:00
выдает1
но обратное неверноPython 3: 143 байта
Тот же счетчик байтов, что и в решении Python 2, но, похоже, мы использовали разные подходы к математике.
источник
Юлия,
152143142 байтаЧто ж, я обновил свой подход, чтобы быть менее «юлианским», как говорится, ради игры в гольф. Для лучшего (хотя и менее лаконичного) подхода см. Историю изменений.
Это создает безымянную функцию, которая принимает строку или 64-разрядное число с плавающей запятой и возвращает 64-разрядное число или строку с плавающей запятой соответственно. Чтобы назвать его, дайте ему имя, например
f=x->...
.Ungolfed + объяснение:
Примеры:
источник
C, 137 байтов
Программа Full C Принимает ввод на стандартный вывод и выводит на стандартный вывод.
Развернулся и прокомментировал:
источник
J 85 байт
Результаты:
Т '12: 00: 00 '
0,5
Т 0,5
12 0 0
Т '12: 34: 56 '
0.524259
Т 0,524259
12 34 56
Всего 85
источник
Javascript,
194192190188 байтисточник
JavaScript ES6,
98130 байтисточник
C
156152 байтаЯ думал, что это будет легко для C. Но все же получилось довольно большим. :(
Тестовая программа:
Выход:
источник
PHP,
7069 байтпринимает входные данные из аргумента командной строки, печатает в STDOUT:
Если входные данные содержат двоеточие, преобразуйте в unix time и разделите на (секунды в день),
иначе умножьте числовое значение на (секунды в день) и отформатируйте время unix в
hh:mm:ss
.источник
Perl
109108101 + 6 (-plaF:
флаг) = 107 байтС помощью:
Попробуйте это на Ideone.
источник
Excel, 178 байт
источник