プログラム
AとBの 2つの文字列が与えられます。Aはタイマーの現在の位置で、Bはタイマーが停止する位置です。両方の文字列の形式はm:ssです。残り時間を決定するプログラムを作成する必要があります。この時間もm:ssまたはmm:ssとしてフォーマットする必要があります。
例
0:00 0:01 -> 0:01
0:55 1:00 -> 0:05
1:45 3:15 -> 1:30
01:30
有効な出力は?(先頭ゼロ)
AとBの 2つの文字列が与えられます。Aはタイマーの現在の位置で、Bはタイマーが停止する位置です。両方の文字列の形式はm:ssです。残り時間を決定するプログラムを作成する必要があります。この時間もm:ssまたはmm:ssとしてフォーマットする必要があります。
0:00 0:01 -> 0:01
0:55 1:00 -> 0:05
1:45 3:15 -> 1:30
01:30
有効な出力は?(先頭ゼロ)
回答:
=B1-A1
Aがセル内にA1
あり、Bがセル内にあると仮定しますB1
|vy':¡
05AB1E にブートストラップされて、私にできることは何もありません...私はExcelが正直にこれに勝つかもしれないと思います。
45:45
A1にし、22:22
B1で、その後、結果は23:23:00
編集ネヴァーマインド-の最大期待値mが 9である
tr : \ |dc -e?r60*+r-r60*-60~rn58PA~rnn
説明:テストケースとして「1:45 3:15」を使用しています(最後の例)。中間ステップを引用符で示します。
tr : \ | # replace colons with spaces: "1 45 3 15"
dc -e? # start dc script, push input to LIFO stack: "15 3 45 1"
r60*+ # turn time B to total seconds: "195 45 1"
r-r60*- # turn time A to total seconds and get difference: "90"
60~r # turn difference (time left) to minutes and seconds: "1 30"
n58P # pop and print minutes, print colon (ASCII code 58): "30"
A~rnn # print seconds. Padding with zeroes is done by dividing by
#10 (A), and printing the quotient and the remainder.
OPの最大値m
は9であると述べられているため、分の値にゼロパディングが必要かどうかはチェックしないことに注意してください。
以下は、元の44バイトの回答です。このdate
コマンドを使用して、残り秒数をm:ss
フォーマットに変換しました。
date -d@`tr : \ |dc -e?r60*+r-r60*-p` +%M:%S
のような入力を受け取ります"2:45","5:01"
。
a,b=[60*int(s[-5:-3])+int(s[-2:])for s in input()]
print'%d:%02d'%divmod(b-a,60)
a,b=[60*int(s[-5:-3])+int(s[-2:])for s in input()]
print'%d:%02d'%divmod(b-a,60)
:)
f(a,b,c,d){scanf("%d:%d%d:%d",&a,&b,&c,&d);d+=(c-a)*60-b;printf("%d:%02d",d/60,d%60);}
STDINからスペースで区切られた時間を読み取ります。
date -d@`date -f- +%s|dc -e??r-60/p` +%M:%S
date -f- +%s # read in 2 line-delimited dates and output as number of seconds since the epoch
|dc -e # pipe to dc expression:
?? # - read 2 input numbers
r- # - reverse and subtract
60/ # - divide by 60
p # - output
` ` # evaluate date|dc command
date -d@ +%M:%S # format seconds difference and output
入力はM:SSではなくH:MMとして読み取られるdc
ため、式は60で除算されることに注意してくださいdate
。
f=s=>s.split`:`.reduce((a,e,i)=>a+e*(!i?60:1),0);t=n=>~~(n/60)+":"+n%60;t(f(b)-f(a));
f=s=>s.split`:`.reduce((a,e,i)=>a+e*(!i?60:1),0);
t=n=>~~(n/60)+":"+n%60;
t(f(b)-f(a));
私はそこにいくらかの節約があるかもしれないと感じます..しかし、私はそれらを現在見ていません。
編集-コメントの優れた提案。
s
ます。
s.split(":")
、新しい構文を使用できます:s.split<backtick>:<backtick>
。
using System;a=>b=>((DateTime.Parse(b)-DateTime.Parse(a))+"").Remove(5);
入力を文字列として受け取ります。
b="3:15"
a="1:45"
。
形式でDateTime.Parse()
日付を返すためhh:mm:ss
、を使用して結果を文字列に解析し+""
、末尾をトリミングすることができます:00
。
これhh:mm
は、1分に60秒と1時間に60分の両方があるので機能します。
0:01
0:00
返す 0:01
1:00
0:55
返す 0:05
3:15
1:45
返す 1:30
DateTime.Parse()
入力を取っている-例えば、1:45
-としてhh:mm
ではなくmm:ss
、以下の出力が得られる-のためにA 1:45
とB 3:15
- ()([01:30:00]
偶数で指定します)。解析時にaを追加する必要がある場合があります。hh:mm:ss
CultureInfo.InvariantCulture
"0:" + a/b
:00
。
;
最後に必要であると信じています、あなたはカリーを使用することができますa=>b=>
、すなわち、あなたは完全に修飾するDateTime
か、含める必要がありますusing System;
。
J.U-Zbm+*60hdedmmvkcd\:.z%"%d:%02d".DJ60
入力を改行で区切ります。
Pythにはこれに役立つ組み込みの時間はありませんでした。私はいくつかの派手なeval()のものを試しましたが、Pythは*
何もまたは先行ゼロを評価できません。これは思っていたよりずっと長くなりました。出力に先行ゼロを追加するのにかなりのバイトが費やされます。少なくとも私はbashより短い。質問があれば説明を追加します。
J.U-Zbm+*60hdh_dmmvkcd\:.z
K%J60
s[/J60\:*<KT\0K
r(m:_:s)=60*read[m]+read s
a#b|(d,m)<-divMod(r b-r a)60=show d++':':['0'|m<=9]++show m
しかし、これにはいくつかのライブラリ関数があるのだろうか
編集:インポートを削除し、m:ssではなくm:sを表示するエラーも修正しました。
また、適切にフォーマットされたバージョン:
convert :: String -> Integer
convert (a:_:b) = (read [a])*60+(read b)
diffTime :: String -> String -> String
diffTime s1 s2 = let (d,m) = divMod (c b-c a) 60 in show d ++ ":" ++ pad2d m
pad2d :: Int -> String
pad2d n = ['0'|n<=9]++show n
EDIT2:Laikoniのおかげで、ゴルフ(30?)バイトができました!また、いくつかの他のゴルフをした。バイト。
CREATE PROCEDURE d @a time,@b time AS BEGIN DECLARE @d int DECLARE @s varchar(2) SET @d=datediff(s,@a,@b);SET @s=CAST(@d%3600/60 AS VARCHAR(3)) SELECT CAST(@d/3600 AS VARCHAR(3))+':'+(SELECT CASE WHEN LEN(@s)=1 THEN '0'+@s ELSE @s END)END
使用法:
EXEC d '00:55','01:00'
以前にPostGresの例を見て、SQLで多くのゴルフの試みをしていないことに気付いたので、T-SQLでそれを試してみました。これで、SQLでゴルフがあまり見られない理由がわかりました:D
Martin Enderのおかげで8バイト節約されました!
{r':/60b}2*\m60mds2Te[':\
説明
{ e# Start of block
r e# Read one time from input
':/ e# Split on colons, gives [minutes seconds]
60b e# Convert from base 60
}2* e# Run this block 2 times
e# At this point, we have the two times in seconds on the stack
\ e# Swap top elements
m e# Subtract
60md e# Divmod the result by 60, to convert back to minutes and seconds
s e# Convert the seconds to a string
2Te[ e# Pad it to 2 characters by adding 0s to the left (T = 0)
': e# Push a colon character
\ e# Swap top elements, bringing seconds back to the top
私はまだゴルフをコーディングするのが初めてなので、誰か提案があれば感謝します。
a, b = input()
def z(x):
x = x.split(":")
return int(x[0])*60+int(x[1])
a, b = z(a),z(b)
s, m = b-a,0
while s >= 60:
s -= 60
m += 1
print(str(m)+":"+str(s))
String c(String a,String b){long s=x(b,1)-x(a,1)+(x(b,0)-x(a,0))*60,m=s%60;return(s/60)+":"+(m>9?m:"0"+m);}long x(String s,int i){return new Long(s.split(":")[i]);}
説明:
String c(String a, String b){ // Method with two String parameters and String return-type
long s = x(b,1) - x(a,1) // Get difference in seconds from input times
+ (x(b,0) - x(a,0)*60, // plus the difference in minutes times 60 to get the seconds
m = s%60; // Temp variable of seconds after we've subtracted the minutes (used multiple times)
return (s/60) // Return minutes
+":" // plus ":"
+(m>9?m:"0"+m); // plus seconds (with a leading 0 if necessary)
} // End of method
long x(String s,int i){ // Separate ethod with String and Integer parameters and long return-type
return new Long(s.split(":")[i]; // Return either minutes or seconds of String parameter based on the index
} // End of method
テストコード:
class M{
String c(String a,String b){long s=x(b,1)-x(a,1)+(x(b,0)-x(a,0))*60,m=s%60;return(s/60)+":"+(m>9?m:"0"+m);}long x(String s,int i){return new Long(s.split(":")[i]);}
public static void main(String[] a){
M m = new M();
System.out.println(m.c("0:00", "0:01"));
System.out.println(m.c("0:55", "1:00"));
System.out.println(m.c("1:45", "3:15"));
}
}
出力:
0:01
0:05
1:30
$ txr -e '(awk (:let (s "%M:%S"))
((mf (time-parse s))
(prn (time-string-local (- [f 1].(time-utc) [f 0].(time-utc)) s))))'
13:49 14:49
01:00
0:13 1:47
01:34
5:01 5:59
00:58
6:00 6:00
00:00
6:00 5:00
59:00
凝縮: (awk(:let(s"%M:%S"))((mf(time-parse s))(prn(time-string-local(-[f 1].(time-utc)[f 0].(time-utc))s))))
require'time';t=Time;d=t.parse($*[1])-t.parse($*[0]);puts t.at(d.to_i).utc.strftime '%H:%M'
コマンドライン引数から入力を受け取ります。
ruby outatime.rb $A $B
ruby outatime.rb 1:45 3:15
出力:
01:30
a=>b=>{c=a.split`:`,d=b.split`:`;return +c[0]-d[0]-d[1]>c[1]?1:0+":"+(+c[1]+60-d[1])%60}
コロンで入力を分割します
c=a.split`:`,d=b.split`:`;
文字列をintに変換します
+c[0]
分の値を取得します
+c[0]-d[0]-d[1]>c[1]?1:0
2番目の値を取得します
(+c[1]+60-d[1])%60
分:秒の文字列を返します
return +c[0]-d[0]-d[1]>c[1]?1:0+":"+(+c[1]+60-d[1])%60
:
コマンド(コード哲学としてのデータ)であるため、dcでは入力が誤って読み取られます。代わりにスペースを使用できますか、またはこれに答えるために他の言語を見つける必要がありますか?