프로그램
두 개의 문자열 A 와 B가 제공 됩니다. 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가 제공 됩니다. 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
Edit Nevermind 가 표시 됩니다. 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에서 공백으로 구분 된 시간을 읽습니다.
11 바이트를 절약 한 @betseg와 1 바이트를 절약 한 @Johan du Toit에게 감사드립니다!
i,j;f(char*a,char*b){i=atoi(b)-atoi(a);j=atoi(b+2)-atoi(a+2);j<0?i--,j+=60:0;printf("%d:%02d",i,j);}
scanf()
여러 정수를 읽는 친구입니다.
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
메모 dc
때문에, 식 (60)의 분할을 date
H로 입력을 읽는 대신의 M을 MM : SS한다.
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>
.
<?=date('i:s',($s=strtotime)($argv[2])-$s($argv[1]));
명령 행 인수에서 입력을받습니다.
<?=date('i:s',($x=strtotime)($argv[2])-$x($argv[1]));
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
, 후속 출력 결과 -위한 및 B - ( ) ( 짝수로 지정 ). 구문 분석 할 때을 추가해야 할 수도 있습니다 . 1:45
3:15
[01:30:00]
hh:mm:ss
CultureInfo.InvariantCulture
"0:" + a/b
:00
.
;
, 당신은 태닝 즉 사용할 수 끝에 a=>b=>
당신은 충분히 평가해야 할, DateTime
또는 포함 using System;
.
b - a
내가 어떤 규칙도 놓치지 않았다고 가정하면 ..
Rebol에는 여러 리터럴 데이터 유형에 대한 산술 연산 기능이 내장되어 있습니다. 이것은 Red 와 같은 하위 항목에도 적용됩니다.
J.U-Zbm+*60hdedmmvkcd\:.z%"%d:%02d".DJ60
줄 바꿈으로 구분하여 입력을받습니다.
Pyth는 이것에 유용한 내장 기능이 없었습니다. 나는 멋진 eval () 물건을 시도했지만 Pyth는 거의 *
0으로 선행하거나 0으로 물건을 평가할 수 없습니다 . 이것은 내가 기대했던 것보다 훨씬 길었다. 출력에 선행 0을 추가하는 데 약간의 바이트가 사용됩니다. 적어도 나는 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 : s 대신 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
두 번째 값을 가져옵니다
(+c[1]+60-d[1])%60
문자열 분을 반환합니다.
return +c[0]-d[0]-d[1]>c[1]?1:0+":"+(+c[1]+60-d[1])%60
:
명령 (데이터가 코드 철학) 이므로 dc에서 입력을 잘못 읽습니다 . 대신 공백을 사용할 수 있습니까? 그렇지 않으면 다른 언어를 찾아야합니까?