Quelle heure est-il?

25

J'aime gagner du temps littéralement, en portant trois montres à mon poignet ... Le problème est qu'elles donnent chacune un temps différent. Une montre a x minutes de retard par rapport à l'heure réelle. Une montre a x minutes d'avance sur l'heure réelle. La dernière montre montre l'heure actuelle.

Le problème est que je ne peux pas dire quelle montre a l'heure exacte ...

À partir de l'heure affichée sur chaque montre, déterminez l'heure réelle. S'il n'est pas possible de déterminer l'heure, imprimez "Regardez le soleil".

Entrée: trois lectures, séparées par des caractères d'espacement simples: H1:M1 H2:M2 H3:M3 dans chaque lecture H1, H2, H3 représentent les heures affichées (0 <H1, H2, H3 <13) et M1, M2, M3 représentent les minutes affichées (0 <= M1 , M2, M3 <60). Si le nombre de minutes est inférieur à 10, un 0 de tête est ajouté en entrée. De même, si le nombre d'heures est inférieur à 10, un 0 en tête est ajouté en entrée.

Sortie: The correct time is HH:MM où HH: MM est l'heure correcte. Si aucune heure correcte ne peut être déterminée, elle s'affiche Look at the sun.

Entrée 1: 05:00 12:00 10:00

Sortie 1: The correct time is 05:00

Entrée 2: 11:59 12:30 01:01

Sortie 2: The correct time is 12:30

Entrée 3: 12:00 04:00 08:00

Sortie 3: Look at the sun

Le code le plus court gagne ... Aucune pénalité spéciale ne s'applique. Aussi, gardez à l'esprit que nous avons affaire à une horloge de 12 heures ... Je me fiche de AM ou PM ... Imaginez que nous ayons affaire à des montres analogiques ...

WallyWest
la source
Par heure correcte, vous voulez dire l'heure locale actuelle?
Optimizer
7
@sanchises Parce qu'ils sont à 4 heures d'intervalle. 12:00est exactement entre 8:00et 4:00aussi, vous savez ...
Siguza
1
Vous dites que la sortie est de la forme The correct time is HH:MM, sans point, mais continuez à inclure un point dans les deux premiers exemples. Quelle version est correcte?
Sp3000
1
Est-il autorisé à lire les heures comme des arguments de ligne de commande?
Dennis
1
Comme dans whattimeisit 07:21 08:39 08:00? Sûr!
WallyWest

Réponses:

10

CJam, 86 83 77 75 71 octets

"The correct time is "ea{aea+':f/60fb(f-:+720%!},{];"Look at the sun"}*

Merci à @ jimmy23013 d'avoir joué au golf à 6 octets de mon code.

Essayez-le en ligne dans l' interpréteur CJam .

Cas de test

$ cjam time.cjam 05:00 12:00 10:00; echo
The correct time is 05:00
$ cjam time.cjam 11:59 12:30 01:01; echo
The correct time is 12:30
$ cjam time.cjam 12:00 04:00 08:00; echo
Look at the sun

Comment ça marche

"The correct time is "
        e# Push that string.
ea      e# Push the array of command-line arguments.
{       e# Filter; for each time T:
  a     e#   Wrap T in an array.
  ea+   e#   Concatenate with the array of all times.
  ':f/  e#   Split each time at the colon.
  60fb  e#   Consider it a base 60 integer.
  (f-   e#   Shift out the converted T and subtract it from the remaining times.
  :+    e#   Add them.
  720%! e#   Push 1 is the sum is 0 modulo 720 and 0 if not.
},      e#   Keep the time iff a 1 has been pushed.

        e# The array on the stack now contains one or three times.

{       e# Reduce; for each time but the first:
  ];    e#   Discard the entire stack.
  "Look at the sun"
        e#   Push that string.
}*      e#
Dennis
la source
1
qS/_':f/60fb_f{f-:+720%!,}\"The correct time is "f\2/.e&$("Look at the sun"@?. bimplique :i.
jimmy23013
3
"The correct time is "lS/_':f/60fb:T.{Tf-:+720%{}@?}{];"Look at the sun"}*.
jimmy23013
Vous avez raté le cas lorsque x = 0
Lakshay Garg
@LakshayGarg: La question dit qu'ils donnent chacun un temps différent . Ce serait faux si x = 0.
Dennis
@Dennis Vous pourrez peut-être le réduire davantage, l'arrêt complet à la fin n'est pas nécessaire ...
WallyWest
7

JavaScript ( ES6 ), 164 168 172

Pour chaque lecture, calculez la distance des deux autres. Celui qui a la même distance est ce dont vous avez besoin. S'il y en a plus d'un, alors vous ne pouvez pas le dire.

F=s=>(s=s.split(' '))
  .map(x=>([h,m]=x.split(':'),+m+(h%12)*60))
  .map((v,i,z)=>(v+v-z[++i%3]-z[++i%3])%720||'The correct time is '+s[k+=i],k=-2)
[k]||'Look at the sun'


// TEST

out=x=>O.innerHTML += x+'\n';

['12:30 01:01 11:59', '11:50 11:55 12:00', '05:00 12:00 10:00', '12:10 04:10 08:10', '07:00 06:00 08:00']
.forEach(x => out(x + ' -> ' + F(x)))

go=_=>out(I.value + ' -> ' + F(I.value))
<pre id=O></pre>
<input id=I><button onclick="go()">Test</button>

edc65
la source
Si elle ne donne pas 3:00 pour l'entrée 3:00 3:00 3:00. Lorsque x = 0: P
Lakshay Garg
4
@LakshayGarg no. Problem is they each give a different timedonc x ne peut pas être 0.
edc65
Avec chaque vote positif que vous obtenez, vous devriez edc65++.
Alex A.
4

Python 3, 166 163 octets

L=input().split()
f=lambda x:int(x[:2])*60+int(x[3:])
s=""
for a in L:s=[s,s and"Look at the sun"or"The correct time is "+a][(sum(map(f,L))-3*f(a))%720<1]
print(s)

Les usages

      a-b == b-c
<==>  a+c-2*b == 0
<==>  (a+b+c)-3*b == 0

l'arithmétique étant les minutes modulo 720.

Sp3000
la source
En utilisant une approche similaire (a + abc == 0), j'ai trouvé que le tri n'était pas nécessaire. Avez-vous essayé de l'éviter?
edc65
@ edc65 J'ai essayé de tenir un compte à la place, mais je pense que cela s'est avéré plus long. J'ai également eu un + abc au début, mais cela fait beaucoup d'appels à f(et la pré-liste est longue)
Sp3000
2

Python 2, 254 ... 199 207 203 194 194 200 octets

Probablement quelques façons de raccourcir cela, donnez-moi un peu de temps ..

t=[x.split(':')for x in raw_input().split()]
a,b,c=[int(x[0])*60+int(x[1])for x in t]
print["The correct time is "+':'.join(t[[(c+a)%720%(b/2)<1,2][(a+b)%720%(c/2)<1]]),"Look at the sun"][(a-b)%240<1]

Merci à Sp3000 de m'aider à résoudre ce problème.

Kade
la source