Час через деякий час


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 і ніколи не від'ємні", чи 99999h99999m99999s є дійсним введенням?
Cruncher

@Cruncher, так, це дійсний вклад
Аднан

99999 - не менше 99999.
Лука

Відповіді:



4

Ruby - 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
Я відмовляюся від спроб конкурувати. Mma просто занадто багатослівна.
LegionMammal978

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

2

Mathematica, 133 116 112 111 байт

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

2

Пітон 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виводи 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як вихід, ви можете змінити на a 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
Gust van de Wal

@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)a / 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.