Время через некоторое время


15

Для этой задачи мы записываем время в следующей форме: hh:mm:ss

Несколько примеров:

12:34:08

06:05:30

23:59:00

Задача состоит в том, чтобы вывести время по истечении определенного количества часов , минут и секунд, используя время начала 00:00:00. Вы можете сравнить это с таймером, который начался в 00:00:00.

Вот пример входов (с использованием STDIN ) и выходов:

Input: 1h20m5s
Output: 01:20:05

Input: 0h100m0s
Output: 01:40:00

Через 24 часа таймер сбрасывает себя:

Input: 25h0m0s
Output: 01:00:00

Форма входа всегда одинаково: XhYmZsс Xчасами, Yминутами и Zсекундами (предположим , что X, Yи Zцелые числа меньше , чем 100000 и не отрицательные)

Это , поэтому наименьшее количество байтов побеждает в этом соревновании


3
Можем ли мы написать функции?
LegionMammal978

1
@ LegionMammal978, да
Аднан

«предположим, что X, Y и Z являются целыми числами меньше 99999 и никогда не бывают отрицательными», является ли 99999h99999m99999 допустимым входным значением?
Cruncher

@Cruncher, да, это правильный вход
Аднан

99999 не меньше, чем 99999.
Лука

Ответы:



4

Рубин - 131 115 107 97 84 байта

Я все еще играю в гольф.

h,m,s=gets.split(/\w/).map &:to_i;$><<"#{(h+m/60+s/3600)%24}:#{(m+s/60)%60}:#{s%60}"

Спасибо за @Doorknob за / \ w / заголовок / h | m | s /


Вы можете разделить на регулярное выражение: gets.tr('ms',?h).split(?h)-> gets.split(/\w/).
Дверная ручка

@ Doorknob Я только что переписал его в регулярные выражения, но ваш короче. Благодарность!
Питер Ленкефи

1
Я отказываюсь от попыток конкурировать. Мма просто слишком многословна.
LegionMammal978

3
@ LegionMammal978 Никогда не сдавайся;)
Питер Ленкефи

2

Mathematica, 133 116 112 111 байт

IntegerString[(f=FromDigits)[f/@StringSplit[#,_?LetterQ],60]~Mod~86400~IntegerDigits~60,10,2]~StringRiffle~":"&

2

Python 2, 138 126 байт

Теперь я использую регулярное выражение, хотя все еще довольно долго, хотя ..

import re
a=input();b=map(int,re.split('h|m|s',a)[:-1])
s=b[0]*3600+b[1]*60+b[2]
print(':%02d'*3)[1:]%(s/3600%24,s/60%60,s%60)

Ввод должен быть в кавычках.


2

С 149 112 байт

Проверьте это здесь

main(h,m,s){scanf("%dh%dm%ds",&h,&m,&s);s+=h*3600+m*60;h=s/3600;m=s/60;printf("%02d:%02d:%02d",h%24,m%60,s%60);}

Кредиты @Dennis для избавления от этого много.


2
main(h,m,s){scanf("%dh%dm%ds",&h,&m,&s);s+=h*3600+m*60;m=s/60;h=m/60;printf("%02d:%02d:%02d",h%24,m%60,s%60);}(110 байт, читает из STDIN)
Деннис

@ Деннис, спасибо, забыл, что это не должен быть аргумент командной строки. Единственное, что не работало для меня, было объявление переменных в списке аргументов функции; Я получаю ошибки компилятора с этим.
Крис Лунам

h,m,s;main()должен быть более портативным. main(h,m,s)работает с GCC ( ссылка )
Деннис

Хорошо спасибо.
Понизил

m=s/60;h=m/60;? После этого вы тоже можете избавиться от этого s+=.
Угорен

2

JavaScript 110 байт

Где х - вход

x=x.split(/[hms]/).map(Number);for(z=2;z--;)x[z+1]-60&&(x[z]+=~~(x[z+1]/60));y=x[0]%24+":"+x[1]%60+":"+x[2]%60

Я не думаю, что это самый эффективный способ

// How it works:
x=x.split(/[hms]/).map(Number);                // splitting the string into an array of numbers
for(z=2;z--;)x[z+1]-60&&(x[z]+=~~(x[z+1]/60)); // shifting excess of seconds to minutes, and then minutes to hours
y=x[0]%24+":"+x[1]%60+":"+x[2]%60              // putting them all together

2

PHP, 80 88 93 Б

<?=!$s=split(~¤—’¢,fgets(STDIN)),date(~·Å–ÅŒ,$s[0]*3600+$s[1]*60+$s[2]-date(Z));

(сохранено как ISO-8859-1)

Работает только на PHP 5 из-за устаревшей splitфункции. Предполагается, что уведомления не отображаются.

Как это устроено:

  • ¤—’¢является "[hm]"перевернутым и действительным имя константы, PHP использует неопределенные константы в виде строки (сохраняет один символ кавычек)
  • ·Å–ÅŒ то же самое для "H:i:s"
  • Все это одно короткое эхо. <?=x,yвыводит х и у. Используя !, результат $sприсваивания преобразуется в логическое и отрицается, а затем преобразуется в строку для вывода.(string)false === ''
  • split("[hm]", "XhYmZs")разбивает строку на [X,Y,Zs]. Затем 3600*X+60*Y+Zsколичество секунд. PHP преобразуется Zsв целое число какZ
  • Мы вычитаем смещение часового пояса date(Z), используем этот результат как метку времени и печатаем его временную часть как «часы: минуты: секунды». В UTC (смещение 0) отметка времени 0равна 1970/01/01 00:00:00. Вычитание смещения часового пояса нормализует дату как UTC без изменения фактически используемого часового пояса (это сэкономило 8 байтов для установки часового пояса).
  • Удобно, что 25 часов приведут к 01:00:00 (на следующий день).

1

AutoIt, 208 байт

Func _($0)
$1=StringRegExp($0,"[0-9]+",3)
For $2=2 To 1 Step -1
If $1[$2]>59 Then
$1[$2]=Mod($1[$2],59)-1
$1[$2-1]+=1
EndIf
Next
Return StringFormat("%02u:%02u:%02u",$1[0]-($1[0]>23?24:0),$1[1],$1[2])
EndFunc

Слишком долго. Тестовое задание:

ConsoleWrite(_("1h20m5s") & @LF)
ConsoleWrite(_("0h100m0s") & @LF)
ConsoleWrite(_("25h0m0s") & @LF)


1

Perl 5, 84 (83 байта + 1)

Использует переполнение секунд или минут.

($h,$m,$s)=split/\D/;$h+=($m+=$s/60)/60;printf"%0.2d:%0.2d:%0.2d",$h%24,$m%60,$s%60

Тестовое задание

$ echo 35:124:224s |perl -n 61736-time-after-some-time.pl
13:07:44

1

VBA ( 150 149 байт)

Function t(s)
x = Split(Replace(Replace(Replace(s, "s", ""), "m", " "), "h", " "))
t = Format(TimeSerial(x(0), x(1), x(2)), "HH:MM:SS")
End Function

1
Выглядит хорошо. VBA, кажется, отлично подходит для этой задачи. Если вы используете в msgboxкачестве вывода, вы можете изменить на Subи сохранить 2 байта. Вы также можете убрать все ненужные пустые места вокруг =и после каждого, ,чтобы сбить его около 134.
JimmyJazzx

1

JavaScript, 97 байт

x=>([h,m,s]=x.match(/\d+/g),[(+h+m/60|0)%24,(+m+s/60|0)%60,s%=60].map(a=>(a>9?'':'0')+a).join`:`)

Вы можете превратить это в скрипку? Кажется, не работает для меня. Я получаюInvalid left-hand side in assignment
Густ ван де Валь

@GustvandeWal Пока что FireFox является единственным браузером, который поддерживает назначение деструктурирования , поэтому, к сожалению, скрипка не поможет.
Mwr247

1

PowerShell, 84 байта

$a=$args-split'[hms]';"{0:HH:mm:ss}"-f(date 0).AddSeconds(3600*$a[0]+60*$a[1]+$a[2])

Разбивает ввод командной строки на массив строк на основе [hms]регулярного выражения. Использует многословную встроенную функцию .AddSeconds()для добавления (часы * 3600, минуты * 60 и секунды) к (date 0)/ k / a Monday, January 1, 0001, 12:00:00 AM, затем передает это в -fформатирование, HH:mm:ssкоторое автоматически преобразует его в 24-часовой формат часов и выводит его.

Пример:

PS C:\Tools\Scripts\golfing> .\time-after-some-time.ps1 25h100m0s
02:40:00



1

Питон 3, 158

import re
e=input()
b=[];p=0
for s in re.split('\D',e)[:3][::-1]:c,a=divmod(int(s),60);b+=[a+p];p=c
b[2]=(b[2]+p)%24;f=':%02d'*3;print(f[1:]%(b[2],b[1],b[0]))

Безголовая версия:

import re
def timer(elapsed):
    base=[]
    previous_carry=0
    for section in re.split('\D+',elapsed)[:3][::-1]:
        carry,amount=divmod(int(section),60)
        base+=[amount+previous_carry]
        previous_carry=carry
    base[2]=(base[2]+previous_carry)%24
    format_str = ':%02d'*3
    return format_str[1:]%(base[2],base[1],base[0])


1

GNU sed + дата, 51 байт

(включая +1 байт для -rфлага)

#!/bin/sed -rf
s/(.*h)(.*m)(.*s)/date -d"0:0 \1our\2in\3ec" +%T/e

Это просто заводит date добавляет указанное количество часов, минут и секунд к 00:00:00(сегодня) и отображает часть времени. Рекомендуется устанавливать TZ=UTCили избегать запуска программы при изменении местного времени (например, переход на летнее время).

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.