Quanto tempo resta?


31

O programa

Você é dado duas cordas, A e B . A é a posição atual em que seu cronômetro está e B é a posição em que seu cronômetro irá parar. Ambas as strings estão no formato m: ss . Você deve escrever um programa que determine a quantidade de tempo restante, que também deve ser formatada como m: ss ou mm: ss .

Exemplo

0:00 0:01 -> 0:01
0:55 1:00 -> 0:05
1:45 3:15 -> 1:30

1
Em dc, a entrada é lida incorretamente, pois :é um comando (dados como filosofia do código). Em vez disso, posso usar espaços ou preciso encontrar outro idioma para responder a isso?
seshoumara

1
é 01:30saída válida? (zero inicial)
Luis Mendo

2
Sim, eu aceito isso como válido. Vou editar a descrição.
28417 Josh

1
@seshoumara A entrada deve conter dois pontos.
28417 Josh

Qual é o valor máximo esperado para m ?
Digital Trauma

Respostas:


92

Excel, 6 bytes

=B1-A1

Supondo que A esteja na célula A1e B esteja na célulaB1


37
Não ... NÃO ... EU NÃO DEIXEI EXCEL GANHAR. +1 você indivíduo desonesto.
Urna de polvo mágico

2
Cancele isso, |vy':¡inicializado em 05AB1E, nada que eu possa fazer ... Acho que o Excel pode honestamente vencer isso, nada mais analisa automaticamente esse formato que eu conheço.
Urna Mágica do Polvo

7
QUÃO? QUÃO? Como o Excel está ganhando? Meu cérebro deve agora explo ...
caird coinheringaahing

2
Se m for maior que 23, a formatação não parece funcionar. Por exemplo, se digito 45:45em A1 e 22:22em B1, em seguida, o resultado é 23:23:00 Editar de Nevermind - valor esperado max para m é 9.
Digital Trauma

4
@EngineerToast Seja qual for a formatação padrão que funcione para mim. Eu apenas digitei a entrada, mudei para uma célula diferente, digitei a fórmula e pressione Enter.
Riley

15

MATL , 17 7 bytes

YOd15XO

Entrada é uma matriz de células de cadeias, no formato {'1:45' '3:15'}ou {'1:45', '3:15'}.

Experimente online!

Explicação

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)

Ah legal! Continue!
Suever 28/03

8

Bash + coreutils, 44 39 bytes

tr : \ |dc -e?r60*+r-r60*-60~rn58PA~rnn

Experimente online!

Explicação: usando "1:45 3:15" como caso de teste (último exemplo). Mostro etapas intermediárias entre aspas.

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.

Observe que eu não verifico se o valor minuto precisa de preenchimento zero, porque o OP afirmou que o valor máximo para m9 é 9.


Abaixo está minha resposta original de 44 bytes, que usou o datecomando para transformar o tempo total restante em segundos no m:ssformato.

date -d@`tr : \ |dc -e?r60*+r-r60*-p` +%M:%S

2
@DigitalTrauma Obrigado. Mas no final, consegui remover o comando date e fazer o formato de impressão em CC também.
seshoumara

1
Riscado 44 looks como regulares 44.
Riley

1
@Riley Também atravessei os espaços ao redor do 44, para obter o efeito que deveria estar lá em primeiro lugar.
seshoumara


7

Python 2, 90 87 83 80 bytes

Toma entrada como "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)

Experimente online



você pode usar a compreensão da lista para salvar vários bytes:a,b=[60*int(s[-5:-3])+int(s[-2:])for s in input()]
Felipe Nardi Batista

Se não me engano, você pode salvar três caracteres adicionais substituindo as duas últimas linhas por print'%d:%02d'%divmod(b-a,60):)
Morwenn


5

Lote, 74 bytes

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

Substituir o :tempo por *60+1converte-o em uma expressão que calcula o número de segundos. O lote interpreta zeros à esquerda como octal, portanto, prefiro 1a aos segundos para garantir a conversão decimal; felizmente os dois se 1cancelam.


5

C, 112 100 bytes

Agradecemos a @betseg por salvar 11 bytes e a @Johan du Toit por salvar um byte!

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

Experimente online!


1
Você pode mudar %s%dcom %02de retire a ?:. Experimente online!
betseg 28/03

1
scanf()é seu amigo por ler vários números inteiros.
Digital Trauma

1
Você também pode salvar 1 byte usando: j <0? I ++, j + = 60: 0;
Johan du Toit 29/03

@DigitalTrauma Nononono, geralmente é mais curto usar argumentos que ele usou.
Matthew Roh

5

MySQL, 13 22 bytes

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

espera os horários em Ae B.


4

Utilitários Bash + GNU, 43

date -d@`date -f- +%s|dc -e??r-60/p` +%M:%S

Experimente online .

Explicação

         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

Observe que a dcexpressão divide por 60, porque datelê a entrada como H: MM em vez de M: SS.


4

ECMAScript 6, 99 91 85 bytes

Única linha:

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

Ligeiramente formatado:

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

Eu sinto que poderia haver algumas economias lá .. mas eu não as estou vendo no momento.

Editar - excelentes sugestões nos comentários.


Você pode remover os parênteses ao redor do s.
Arjun

E em vez de s.split(":"), você pode usar a nova sintaxe: s.split<backtick>:<backtick>.
Arjun

4

PHP, 55 53 bytes

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

recebe entrada dos argumentos da linha de comando


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

4

C #, 72 bytes

using System;a=>b=>((DateTime.Parse(b)-DateTime.Parse(a))+"").Remove(5);

Recebe entrada como strings. b="3:15" a="1:45".

Explicação:

Como DateTime.Parse()retorna uma Data no hh:mm:ssformato, sou capaz de analisar o resultado em uma string usando e +"", em seguida, aparar a trilha :00.

Isso funciona hh:mmporque existem 60 segundos em um minuto e 60 minutos em uma hora.

0:01 0:00 retorna 0:01

1:00 0:55 retorna 0:05

3:15 1:45 retorna 1:30


3
Infelizmente, DateTime.Parse()está aceitando a entrada - por exemplo 1:45- como hh:mme não mm:ss, resultando na saída a seguir - para A 1:45 e B 3:15 - [01:30:00]( hh:mm:ss) ( mesmo com o CultureInfo.InvariantCultureespecificado ). Pode ser necessário adicionar um "0:" + a/bao analisar.
auhmaan

@auhmaan Ah, boa captura. Acabei aparando a trilha :00.
Oliver

Eu acredito que você precisa de um ;no final, você pode usar curry a=>b=>, ou seja , você precisa se qualificar DateTimeou incluir totalmente using System;.
TheLethalCoder


2

Pyth, 47 45 44 40 Bytes

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

Separa a entrada por novas linhas.

Pyth não tinha tempo embutido útil para isso. Eu tentei algumas coisas sofisticadas de eval (), mas aparentemente Pyth não pode avaliar coisas com* ou quaisquer zeros à esquerda. Isso ficou muito mais tempo do que eu esperava. Alguns bytes são gastos na adição de um zero inicial à saída. Pelo menos eu sou mais baixo que o bash. Adicionará explicação, se solicitado.

Tente isso!

solução alternativa, 48 bytes

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

2

Haskell, 98 127 86 bytes

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

Experimente online!

Mas eu me pergunto se existem algumas funções de biblioteca para isso

Edição: Removida importação, também corrigiu um erro em que mostrava m: s em vez de m: ss

Além disso, versão bem formatada:

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: Golfed fora (30?) Bytes graças a Laikoni! Também jogou golfe em outras misc. bytes.


1
Você deve nos dizer qual é esse idioma e quantos bytes ele usa.
28417 Josh

2
Sim, eu não tive a intenção de imprensa pós (guia que conhecia + enter das mensagens da caixa de texto a sua resposta?)
Exibição nome genérico

Mesma abordagem, 86 bytes: Experimente online!
Laikoni 28/03

Não pensei em usar uma lista de compreensão. Thanks :)
Nome de exibição genérico

2

T-SQL, 238 bytes

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

Uso:

EXEC d '00:55','01:00'

Vendo o exemplo do PostGres anteriormente, percebi que não havia visto muitas tentativas de golfe no SQL, então tentei no T-SQL. Agora eu sei por que você não vê muito golfe no SQL: D


2

CJam , 34 33 25 bytes

Economizou 8 bytes graças a Martin Ender!

{r':/60b}2*\m60mds2Te[':\

Experimente online!

Explicação

{             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 bytes

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

2

Python, 160 bytes

Ainda sou novo no código de golfe, portanto, se alguém tiver alguma sugestão, eu agradeceria.

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
Olá e bem-vindo ao nosso site. Parece que você está recebendo informações de variáveis ​​pré-inicializadas para o seu programa. No entanto, este não é permitido sob fora padrões para IO . Eu recomendaria que este caso específico recebesse informações via raw_input().
Assistente de trigo

1

REXX, 79 bytes

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

1

Pyth, 28

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

Experimente .

Explicação

                   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

Java 7, 164 bytes

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

Explicação:

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

Código do teste:

Experimente aqui.

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

Saída:

0:01
0:05
1:30

1

TXR Lisp, 101 bytes

$ 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

Condensado: (awk(:let(s"%M:%S"))((mf(time-parse s))(prn(time-string-local(-[f 1].(time-utc)[f 0].(time-utc))s))))


Você precisa de um número de bytes, e eu não acho que isso seja totalmente praticado.
Rɪᴋᴇʀ

1

Ruby , 91 bytes

require'time';t=Time;d=t.parse($*[1])-t.parse($*[0]);puts t.at(d.to_i).utc.strftime '%H:%M'

Experimente online!

Recebe entrada dos argumentos da linha de comando.

Invocação:

ruby outatime.rb $A $B

Exemplo:

ruby outatime.rb 1:45 3:15

Saída:

01:30


Bem vindo ao site!
DJMcMayhem

1

PowerShell 47 bytes

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

Matemática simples de intervalo de tempo e abrangendo a seqüência de horas e segundos.


0

JavaScript, 88 bytes

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}

Experimente online!

Explicação:

Divide as entradas nos dois pontos

c=a.split`:`,d=b.split`:`;

Converte string em int

+c[0]

Obtém o valor minuto

+c[0]-d[0]-d[1]>c[1]?1:0

Obtém o segundo valor

(+c[1]+60-d[1])%60

Retorna a string minutes: seconds

return +c[0]-d[0]-d[1]>c[1]?1:0+":"+(+c[1]+60-d[1])%60
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.