Combien de temps reste-t-il?

31

Le programme

On vous donne deux chaînes, A et B . A est la position actuelle à laquelle se trouve votre minuterie et B est la position à laquelle votre minuterie s'arrêtera. Les deux chaînes sont au format m: ss . Vous devez écrire un programme qui détermine le temps restant qui doit également être formaté en m: ss ou mm: ss .

Exemple

0:00 0:01 -> 0:01
0:55 1:00 -> 0:05
1:45 3:15 -> 1:30
Josh
la source
1
En dc, l'entrée est lue de manière incorrecte, car il :s'agit d'une commande (données comme philosophie de code). Suis-je autorisé à utiliser des espaces à la place ou dois-je trouver une autre langue pour répondre à cela?
seshoumara
1
est 01:30une sortie valide? (leader zéro)
Luis Mendo
2
Oui, je vais accepter cela comme valide. Je vais modifier la description.
Josh
1
@seshoumara L'entrée doit contenir deux points.
Josh
Quelle est la valeur maximale attendue pour m ?
Digital Trauma

Réponses:

92

Excel, 6 octets

=B1-A1

En supposant que A est dans la cellule A1et B est dans la celluleB1

Riley
la source
37
Non ... NON ... JE NE LAISERAIS PAS EXCELER GAGNER. +1 vous individu sournois.
Urne de poulpe magique
2
Annuler cela, |vy':¡amorcé dans 05AB1E, rien que je puisse faire ... Je pense qu'Excel peut honnêtement gagner cela, rien d'autre n'analyse automatiquement ce format que je connais.
Magic Octopus Urn
7
COMMENT? COMMENT? Comment Excel gagne-t-il? Mon cerveau doit maintenant exploiter ...
caird coinheringaahing
2
Si m est supérieur à 23, la mise en forme ne semble pas fonctionner. Par exemple, si je tape 45:45A1 et 22:22B1, le résultat est 23:23:00 Edit Nevermind - la valeur maximale attendue pour m est 9.
Digital Trauma
4
@EngineerToast Quelle que soit la mise en forme par défaut qui fonctionne pour moi. Je viens de taper l'entrée, je suis passée à une cellule différente, j'ai tapé la formule et j'ai appuyé sur Entrée.
Riley
15

MATL , 17 7 octets

YOd15XO

L'entrée est un tableau de cellules de chaînes, sous la forme {'1:45' '3:15'}ou {'1:45', '3:15'}.

Essayez-le en ligne!

Explication

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)
Luis Mendo
la source
Oh sympa! Continuer!
Suever
8

Bash + coreutils, 44 39 octets

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

Essayez-le en ligne!

Explication: utilisation de "1:45 3:15" comme scénario de test (dernier exemple). Je montre les étapes intermédiaires entre guillemets.

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.

Notez que je ne vérifie pas si la valeur des minutes nécessite un remplissage nul, car l'OP a déclaré que la valeur maximale pour mest 9.


Ci-dessous est ma réponse originale de 44 octets, qui a utilisé la datecommande pour transformer le temps total restant en secondes au m:ssformat.

date -d@`tr : \ |dc -e?r60*+r-r60*-p` +%M:%S
seshoumara
la source
2
@DigitalTrauma Merci. Mais au final, j'ai réussi à supprimer la commande date et à faire également l'impression du format en dc.
seshoumara
1
Barré 44 ressemble à un 44 régulier.
Riley
1
@Riley J'ai également barré les espaces autour de 44, pour obtenir l'effet qui aurait dû être là en premier lieu.
seshoumara
7

Python 2, 90 87 83 80 octets

Prend entrée comme "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)

Essayez-le en ligne

mbomb007
la source
vous pouvez utiliser la compréhension de liste pour enregistrer plusieurs octets:a,b=[60*int(s[-5:-3])+int(s[-2:])for s in input()]
Felipe Nardi Batista
Si je ne me trompe pas, vous pouvez enregistrer trois caractères supplémentaires en remplaçant les deux dernières lignes par print'%d:%02d'%divmod(b-a,60):)
Morwenn
5

c, 86

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

Lit les temps séparés par des espaces depuis STDIN.

Essayez-le en ligne .

Trauma numérique
la source
5

Lot, 74 octets

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

Remplacer le :dans le temps par le *60+1convertit en une expression qui calcule le nombre de secondes. Batch interprète les zéros non significatifs comme des octaux, donc je préfixe a 1aux secondes pour assurer la conversion décimale; heureusement, les deux 1s'annulent.

Neil
la source
5

C, 112 100 octets

Merci à @betseg pour avoir sauvé 11 octets et merci à @Johan du Toit pour avoir sauvé un octet!

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

Essayez-le en ligne!

Steadybox
la source
1
Vous pouvez changer %s%davec %02det retirez le ?:. Essayez-le en ligne!
2017
1
scanf()est votre ami pour la lecture de plusieurs entiers.
Digital Trauma
1
Vous pouvez également enregistrer 1 octet en utilisant: j <0? I ++, j + = 60: 0;
Johan du Toit
@DigitalTrauma Nononono, Il est généralement plus court d'utiliser les arguments qu'il a fait.
Matthew Roh
5

MySQL, 13 22 octets

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

attend les temps en Aet B.

Titus
la source
4

Utilitaires Bash + GNU, 43

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

Essayez-le en ligne .

Explication

         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

Notez que l' dcexpression est divisée par 60, car datelit l'entrée comme H: MM au lieu de M: SS.

Trauma numérique
la source
4

ECMAScript 6, 99 91 85 octets

Une seule ligne:

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

Légèrement formaté:

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

Je pense qu'il pourrait y avoir des économies là-dedans .. mais je ne les vois pas pour le moment.

Modifier - excellentes suggestions dans les commentaires.

Quarante3
la source
Vous pouvez supprimer les parenthèses autour du s.
Arjun
Et au lieu de s.split(":"), vous pouvez utiliser la nouvelle syntaxe: s.split<backtick>:<backtick>.
Arjun
4

PHP, 55 53 octets

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

prend l'entrée des arguments de ligne de commande

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

C #, 72 octets

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

Prend l'entrée sous forme de chaînes. b="3:15" a="1:45".

Explication:

Parce que DateTime.Parse()retourne une date au hh:mm:ssformat, je suis capable d'analyser le résultat dans une chaîne en utilisant +"", puis de couper la fin :00.

Cela fonctionne avec hh:mmcar il y a 60 secondes en une minute et 60 minutes en une heure.

0:01 0:00 résultats 0:01

1:00 0:55 résultats 0:05

3:15 1:45 résultats 1:30

Oliver
la source
3
Malheureusement, le DateTime.Parse()prend l'entrée - par exemple, 1:45- comme hh:mmet non mm:ss, résultant en la sortie de suivi - pour A 1:45 et B 3:15 - [01:30:00]( hh:mm:ss) ( même avec CultureInfo.InvariantCulturespécifié ). Vous devrez peut-être ajouter un "0:" + a/blors de l'analyse.
auhmaan
@auhmaan Ah, belle prise. J'ai fini par couper la queue :00.
Oliver
Je crois que vous avez besoin d'un ;à la fin, vous pouvez utiliser le curry, c'est a=>b=>-à- dire que vous devez entièrement vous qualifier DateTimeou inclure using System;.
TheLethalCoder
3

Rebol, 5 octets

b - a

En supposant que je n'ai manqué aucune règle ..

Rebol a une arithmétique intégrée pour un certain nombre de types de données littérales. Cela vaut également pour ses descendants tels que Red

Geeky I
la source
Je connais peu ou rien de cette langue.
Urne de poulpe magique
@carusocomputing chat.stackoverflow.com/rooms/291/rebol
Geeky I
2

Pyth, 47 45 44 40 octets

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

Prend l'entrée séparée par des retours à la ligne.

Pyth n'avait pas de temps intégré utiles pour cela. J'ai essayé des trucs fantastiques eval () mais apparemment Pyth ne peut pas évaluer les trucs avec *ou les zéros principaux. Cela est devenu beaucoup plus long que ce que j'espérais. Beaucoup d'octets sont dépensés pour ajouter un zéro de tête à la sortie. Au moins, je suis plus petit que bash. Ajoutera une explication si demandé.

Essaye ça!

solution alternative, 48 octets

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

Haskell, 98 127 86 octets

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

Essayez-le en ligne!

Mais je me demande s'il y a des fonctions de bibliothèque pour cela

EDIT: Suppression de l'importation, correction d'une erreur où il montrait m: s au lieu de m: ss

Aussi, version bien formatée:

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: Golfé (30?) Octets grâce à Laikoni! A également joué au golf quelques autres misc. octets.

Nom d'affichage générique
la source
1
Vous devez nous dire de quelle langue il s'agit et combien d'octets il utilise.
Josh
2
Ouais, je ne voulais pas appuyer sur le message (qui savait que l'onglet + entrer dans la zone de texte affiche votre réponse?)
Nom d'affichage générique
Même approche, 86 octets: essayez-le en ligne!
Laikoni
Je n'ai pas pensé à utiliser une liste de compréhension. Merci :)
Nom d'affichage générique
2

T-SQL, 238 octets

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

Usage:

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

En voyant l'exemple de PostGres plus tôt, je me suis rendu compte que je n'avais pas vu beaucoup de tentatives de golf en SQL, j'ai donc essayé de le faire en T-SQL. Maintenant, je sais pourquoi vous ne voyez pas beaucoup de golf en SQL: D

motosubatsu
la source
2

CJam , 34 33 25 octets

8 octets enregistrés grâce à Martin Ender!

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

Essayez-le en ligne!

Explication

{             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
Chat d'affaires
la source
2

T-SQL, 82 octets

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

Python, 160 octets

Je suis encore nouveau sur le golf de code, donc si quelqu'un a des suggestions, je l'apprécierais.

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))
JKonowitz
la source
1
Bonjour et bienvenue sur notre site. Il semble que vous preniez des données pour votre programme à partir de variables préinitialisées. Toutefois , ce n'est pas autorisée en vertu sur les valeurs par défaut pour IO . Je recommanderais pour ce cas spécifique de prendre une entrée via raw_input().
Wheat Wizard
1

REXX, 79 octets

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

Pyth, 28

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

Essayez-le .

Explication

                   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
Trauma numérique
la source
1

Java 7, 164 octets

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

Explication:

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

Code de test:

Essayez ici.

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

Sortie:

0:01
0:05
1:30
Kevin Cruijssen
la source
1

TXR Lisp, 101 octets

$ 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

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

Kaz
la source
Vous avez besoin d'un bytecount, et je ne pense pas que ce soit entièrement joué.
Rɪᴋᴇʀ
1

Rubis , 91 octets

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

Essayez-le en ligne!

Prend l'entrée des arguments de ligne de commande.

Invocation:

ruby outatime.rb $A $B

Exemple:

ruby outatime.rb 1:45 3:15

Sortie:

01h30

sfgeorge
la source
Bienvenue sur le site!
DJMcMayhem
1

PowerShell 47 octets

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

Calcul simple de temps et conversion en chaîne d'heures et de secondes.

Mat
la source
0

JavaScript, 88 octets

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}

Essayez-le en ligne!

Explication:

Divise les entrées sur les deux points

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

Convertit une chaîne en int

+c[0]

Obtient la valeur minute

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

Obtient la deuxième valeur

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

Renvoie la chaîne minutes: secondes

return +c[0]-d[0]-d[1]>c[1]?1:0+":"+(+c[1]+60-d[1])%60
fəˈnɛtɪk
la source