เวลาผ่านไปสักพัก


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เป็นจำนวนเต็มทั้งหมดน้อยกว่า 100,000 และไม่เคยลบ)

นี่คือดังนั้นจำนวนไบต์น้อยที่สุดจึงจะชนะการท้าทายนี้


3
เราสามารถเขียนฟังก์ชั่นได้หรือไม่
LegionMammal978

1
@ LegionMammal978 ใช่
Adnan

"สมมติว่า X, Y และ Z เป็นจำนวนเต็มทั้งหมดน้อยกว่า 99999 และไม่เคยติดลบ" คือ 99999h99999m99999s อินพุตที่ถูกต้องหรือไม่
Cruncher

@Cruncher ใช่นั่นเป็นอินพุตที่ถูกต้อง
Adnan

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 / inshead ของ / h | m | s /


คุณสามารถแยกบน regex นี้: ->gets.tr('ms',?h).split(?h) gets.split(/\w/)
Doorknob

@Doorknob ฉันเพิ่งเขียนมันใหม่เพื่อ regexes แต่คุณสั้นลง ขอบคุณ!
Peter Lenkefi

1
ฉันยอมแพ้ในการพยายามแข่งขัน Mma เป็นเพียง verbose เกินไป
LegionMammal978

3
@ LegionMammal978 อย่ายอมแพ้;)
Peter Lenkefi


2

Python 2, 138 126 Bytes

ตอนนี้ฉันกำลังใช้ regex อยู่นานพอสมควร ..

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 bytes อ่านจาก STDIN)
Dennis

@Dennis ขอขอบคุณอย่าลืมว่าไม่จำเป็นต้องเป็นอาร์กิวเมนต์บรรทัดคำสั่ง สิ่งเดียวที่ไม่ได้ผลสำหรับฉันคือการประกาศตัวแปรในรายการอาร์กิวเมนต์ของฟังก์ชัน ฉันได้รับข้อผิดพลาดของคอมไพเลอร์
Chris Loonam

h,m,s;main()ควรพกพาได้มากกว่า main(h,m,s)ทำงานร่วมกับ GCC ( ลิงก์ )
Dennis

โอเคขอบคุณ. รับไปที่ 112.
Chris Loonam

m=s/60;h=m/60;? หลังจากนี้คุณสามารถกำจัดของs+=เกินไป
ugoren

2

JavaScript 110 ไบต์

โดยที่ x คืออินพุต

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 Bytes + 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
Gust van de Wal

@GustvandeWal เพื่อให้ห่างไกล FireFox เป็นเบราว์เซอร์เท่านั้นที่จะสนับสนุนการกำหนด destructuringดังนั้นซอจะไม่ช่วยให้โชคร้าย
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]regex ใช้ฟังก์ชัน verbose ในตัว.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

VB.NET (107 ไบต์)

การส่งครั้งแรกสำหรับรหัสกอล์ฟดังนั้นฉันคาดเดาจำนวนตัวอักษร => นับไบต์?

MsgBox(TimeSpan.Zero.Add(TimeSpan.Parse(Regex.Replace(InputBox("XhYmZs"),"[hm]",":").Trim("s"))).ToString)


1

Python 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 + date, 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หรือหลีกเลี่ยงการเรียกใช้โปรแกรมเกี่ยวกับการเปลี่ยนแปลงเวลาท้องถิ่น (เช่นการประหยัดเวลากลางวัน)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.