남은 시간은 얼마입니까?


31

프로그램

두 개의 문자열 AB가 제공 됩니다. 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

1
:명령 (데이터가 코드 철학) 이므로 dc에서 입력을 잘못 읽습니다 . 대신 공백을 사용할 수 있습니까? 그렇지 않으면 다른 언어를 찾아야합니까?
seshoumara

1
이다 01:30유효한 출력은? (제로 선도)
Luis Mendo

2
예, 유효한 것으로 인정하겠습니다. 설명을 편집하겠습니다.
Josh

1
@seshoumara 입력은 콜론을 포함해야합니다.
Josh

m에 대해 예상되는 최대 값은 얼마입니까?
Digital Trauma

답변:


92

엑셀, 6 바이트

=B1-A1

A가 셀에 A1있고 B가 셀에 있다고 가정B1


37
아뇨 ... 아뇨 ... 엑셀이 이길 수는 없습니다. 사악한 개인 +1
Magic Octopus Urn

2
취소, |vy':¡05AB1E로 부트 스트랩, 내가 할 수있는 일 없음 ... Excel에서 솔직히 이길 수 있다고 생각합니다.
Magic Octopus Urn

7
방법? 방법? Excel은 어떻게 승리합니까? 내 뇌는 이제
폭발

2
경우 m가 23보다 큰 경우, 다음 형식이 작동하지 않습니다. 예를 들어 45:45A1과 22:22B1을 입력하면 23:23:00 Edit Nevermind 가 표시 됩니다. m의 최대 예상 값 은 9입니다.
Digital Trauma

4
@EngineerToast 기본 형식이 무엇이든 저에게 효과적입니다. 방금 입력 내용을 입력하고 다른 셀로 이동 한 다음 수식을 입력하고 Enter 키를 누릅니다.
Riley

15

MATL , 17 7 바이트

YOd15XO

입력은 {'1:45' '3:15'}또는 형식의 문자열로 구성된 셀형 배열입니다 {'1:45', '3:15'}.

온라인으로 사용해보십시오!

설명

YO     % Input cell array of strings (implicit). Convert to serial date numbers
d      % Difference
15XO   % Convert to format 15, i.e. 'HH:MM'. Display (implicit)

오 좋은! 계속하십시오!
Suever

8

Bash + coreutils, 44 39 바이트

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
@DigitalTrauma 감사합니다. 그러나 결국 date 명령을 제거하고 dc에서도 형식 인쇄를 수행했습니다.
seshoumara

1
44를 넘어 서면 일반 44처럼 보입니다.
Riley

1
@Riley 나는 처음에 거기에 있어야했던 효과를 얻기 위해 44 주위의 공간을 뛰어 넘었습니다.
seshoumara


7

파이썬 2, 90 87 83 80 바이트

같은 입력을 "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()]
Felipe Nardi Batista

내가 실수하지 않으면, 당신은 다음과 같이 마지막 두 줄을 대체하는 세 개의 추가 문자를 저장할 수 있습니다 print'%d:%02d'%divmod(b-a,60):)
Morwenn


5

배치, 74 바이트

@set t=%2-(%1)
@set/as=%t::=*60+1%,m=s/60,t=s/10%%6
@echo %m%:%t%%s:~-1%

교체 :와 시간 *60+1(초)을 산출하는 식으로 변환하여. Batch는 선행 0을 8 진수로 해석하므로 1십진수 변환을 위해 a 를 초 앞에 추가합니다 . 다행스럽게도 두 1s가 취소됩니다.


5

C, 112100 바이트

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);}

온라인으로 사용해보십시오!


1
당신은 변경할 수 있습니다 %s%d함께 %02d하고 제거 ?:. 온라인으로 사용해보십시오!
betseg

1
scanf()여러 정수를 읽는 친구입니다.
Digital Trauma

1
다음을 사용하여 1 바이트를 절약 할 수도 있습니다. j <0? i ++, j + = 60 : 0;
Johan du Toit

@DigitalTrauma Nononono, 일반적으로 그가 한 주장을 사용하는 것이 더 짧습니다.
Matthew Roh

5

MySQL, 13 22 바이트

select right(timediff(B,A),5)

에 시간을 기대 A하고 B.


4

배쉬 + GNU 유틸리티, 43

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)의 분할을 dateH로 입력을 읽는 대신의 M을 MM : SS한다.


4

ECMAScript 6, 99 91 85 바이트

한 줄:

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.
Arjun

그리고 대신에 s.split(":")새로운 구문을 사용할 수 있습니다 s.split<backtick>:<backtick>.
Arjun

4

PHP, 55 53 바이트

<?=date('i:s',($s=strtotime)($argv[2])-$s($argv[1]));

명령 행 인수에서 입력을받습니다.


1
53 바이트 :<?=date('i:s',($x=strtotime)($argv[2])-$x($argv[1]));
Ismael Miguel

4

C #, 72 바이트

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:mm1 분에 60 초와 1 시간에 60 분이 있기 때문에 작동합니다 .

0:01 0:00 보고 0:01

1:00 0:55 보고 0:05

3:15 1:45 보고 1:30


3
불행하게도,이 DateTime.Parse()입력을 취하고있다 - 예를 들어 1:45-로 hh:mm아니라 mm:ss, 후속 출력 결과 -위한 및 B - ( ) ( 짝수로 지정 ). 구문 분석 할 때을 추가해야 할 수도 있습니다 . 1:45 3:15[01:30:00]hh:mm:ssCultureInfo.InvariantCulture"0:" + a/b
auhmaan

@auhmaan 아, 좋은 캐치. 나는 후행을 다듬었다 :00.
Oliver

난 당신이 필요 믿고 ;, 당신은 태닝 즉 사용할 수 끝에 a=>b=>당신은 충분히 평가해야 할, DateTime또는 포함 using System;.
TheLethalCoder

3

리볼, 5 바이트

b - a

내가 어떤 규칙도 놓치지 않았다고 가정하면 ..

Rebol에는 여러 리터럴 데이터 유형에 대한 산술 연산 기능이 내장되어 있습니다. 이것은 Red 와 같은 하위 항목에도 적용됩니다.


나는이 언어에 대해 거의 아무것도 모른다.
Magic Octopus Urn


2

Pyth, 47 45 44 40 바이트

J.U-Zbm+*60hdedmmvkcd\:.z%"%d:%02d".DJ60

줄 바꿈으로 구분하여 입력을받습니다.

Pyth는 이것에 유용한 내장 기능이 없었습니다. 나는 멋진 eval () 물건을 시도했지만 Pyth는 거의 *0으로 선행하거나 0으로 물건을 평가할 수 없습니다 . 이것은 내가 기대했던 것보다 훨씬 길었다. 출력에 선행 0을 추가하는 데 약간의 바이트가 사용됩니다. 적어도 나는 bash보다 짧다. 요청하면 설명을 추가합니다.

이 시도!

대체 솔루션, 48 바이트

J.U-Zbm+*60hdh_dmmvkcd\:.z
K%J60
s[/J60\:*<KT\0K

2

하스켈, 98 (127) 86 바이트

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?) 바이트가 떨어졌습니다! 또한 다른 기타 골프를 쳤다. 바이트.


1
이 언어와 사용하는 바이트 수를 알려주십시오.
Josh

2
예, 게시물을 누르려는 의도는 없었습니다 (텍스트 상자에서 tab + enter를 입력하면 답을 알 수 있습니까?)
일반 표시 이름

동일한 접근 방식, 86 바이트 : 온라인으로 사용해보십시오!
Laikoni

나는 목록 이해력을 사용하려고 생각하지 않았습니다. 감사합니다 :)
일반 표시 이름

2

T-SQL, 238 바이트

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


2

CJam , 34 33 25 바이트

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

2

T-SQL, 82 바이트

select left(cast(dateadd(minute, datediff(S,'0:00','0:01')/60,114) as time(0)), 5)

2

파이썬, 160 바이트

나는 아직도 골프를 코딩하는 것을 처음 사용하므로 누군가 제안이 있으면 감사하겠습니다.

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))

1
안녕하세요. 저희 사이트에 오신 것을 환영합니다. 사전 초기화 된 변수에서 프로그램에 대한 입력을받는 것 같습니다. 그러나 이것은 IO의 기본값을 벗어나면 허용되지 않습니다 . 이 특정 사례를 통해를 통해 입력하는 것이 좋습니다 raw_input().
밀 마법사

1

REXX, 79 바이트

arg t q
say right(time(,f(q)-f(t),s),5)
f:return time(s,'00:'right(arg(1),5,0))

1

피 이스, 28

%"%d:%02d".Dh.+misMcd\:60Q60

시도 해봐 .

설명

                   cd\:      # lambda to split c on ":"
                 sM          # map to convert string to int
               mi      60Q   # convert from base-60 list to give seconds
             .+              # delta of the two seconds values
            h                # single-item list to int
          .D              60 # divmod by 60
%"%d:%02d"                   # format output

1

자바 7, 164 바이트

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

1

TXR 리스프, 101 바이트

$ 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))))


바이트 수가 필요하며 이것이 완전히 골프라고 생각하지 않습니다.
Rɪᴋᴇʀ


1

PowerShell 47 바이트

param($s,[timespan]$f)($f-$s).ToString("h\:mm")

간단한 시간 스팬 수학 및 시간 및 초 문자열에 적용.


0

자바 스크립트, 88 바이트

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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.