しばらくして


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

入力の形式は常に同じです:XhYmZsX時間、Y分、Z秒(XYおよびZが100000未満の整数で負でないことを想定)

これはであるため、最小のバイト数がこのチャレンジに勝ちます


3
関数を書くことはできますか?
LegionMammal978

1
@ LegionMammal978、はい
アドナン

「X、Y、Zは99999未満の整数であり、決して負ではない」と99999h99999m99999sは有効な入力ですか?
ランチャー

@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}"

/ h | m | s /の/ \ w /を@Doorknobに感謝します


正規表現で分割できます: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

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

C 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からの読み取り)
デニス

@Dennisありがとう、コマンドライン引数である必要はないことを忘れていました。私のために働いていなかった唯一のものは、関数の引数リスト内の変数の宣言でした。それでコンパイラエラーが発生しました。
クリスルーナム

h,m,s;main()より移植性が高い必要があります。main(h,m,s)GCCで動作(リンク
デニス

はい、ありがとう。112にそれを手に入れた
クリスLoonam

m=s/60;h=m/60;?この後、あなたも取り除くことができs+=ます。
ウゴレン

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として保存)

非推奨split機能のため、PHP 5でのみ機能します。通知は表示されないと仮定します。

使い方:

  • ¤—’¢"[hm]"反転されており、有効な定数名です。PHPは未定義の定数を文字列として使用します(引用符用に1文字を保存します)
  • ·Å–ÅŒ 同じです "H:i:s"
  • すべては、単一の短いエコー文です。<?=x,yxとyを出力します。を使用!すると、$s割り当ての結果はブール値に変換されて否定され、文字列に変換されて出力されます。(string)false === ''
  • split("[hm]", "XhYmZs")文字列をに分割します[X,Y,Zs]。次に、3600*X+60*Y+Zs秒数です。PHP Zsは次の整数に変換しますZ
  • タイムゾーンオフセットを減算し、date(Z)この結果をタイムスタンプとして使用し、その時間部分を「時間:分:秒」として出力します。UTC(オフセット0)では、タイムスタンプ01970/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に変更してSub2バイト節約できます。あなた離れたこともゴルフの周りのすべての不要な空白=とそれぞれの後に,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)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

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バイト

-rフラグの+1バイトを含む)

#!/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.