¿Que hora es?

25

Literalmente, me gusta ahorrar tiempo, usando tres relojes en mi muñeca ... El problema es que cada uno da un tiempo diferente. Un reloj está x minutos por detrás del tiempo real. Un reloj se adelanta x minutos al tiempo real. El último reloj muestra la hora real.

El problema es que no puedo decir qué reloj tiene la hora correcta ...

A partir de la hora que se muestra en cada reloj, determine la hora real. Si no es posible determinar la hora, imprima "Mira el sol".

Entrada: Tres lecturas, separadas por caracteres de espacio simple: H1:M1 H2:M2 H3:M3 en cada lectura H1, H2, H3 representan las horas mostradas (0 <H1, H2, H3 <13), y M1, M2, M3 representan los minutos mostrados (0 <= M1 , M2, M3 <60). Si el número de minutos es inferior a 10, se antepone un 0 inicial en la entrada. Del mismo modo, si el número de horas es inferior a 10, se antepone un 0 inicial en la entrada.

Salida: The correct time is HH:MM donde HH: MM es la hora correcta. Si no se puede determinar la hora correcta, se muestra Look at the sun.

Entrada 1: 05:00 12:00 10:00

Salida 1: The correct time is 05:00

Entrada 2: 11:59 12:30 01:01

Salida 2: The correct time is 12:30

Entrada 3: 12:00 04:00 08:00

Salida 3: Look at the sun

El código más corto gana ... No se aplican sanciones especiales. Además, tenga en cuenta que estamos tratando con un reloj de 12 horas ... No me importa AM o PM ... Imagine que estamos tratando con relojes analógicos ...

WallyWest
fuente
Por hora correcta, ¿se refiere a la hora local actual?
Optimizador
77
@sanchises Porque tienen 4 horas de diferencia. 12:00es exactamente entre 8:00y 4:00también, ya sabes ...
Siguza
1
Usted dice que la salida es de la forma The correct time is HH:MM, sin un punto final, pero luego procede a incluir un punto completo en los primeros dos ejemplos. ¿Qué versión es la correcta?
Sp3000
1
¿Está permitido leer los tiempos como argumentos de línea de comando?
Dennis
1
Al igual que en whattimeisit 07:21 08:39 08:00? ¡Seguro!
WallyWest

Respuestas:

10

CJam, 86 83 77 75 71 bytes

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

Gracias a @ jimmy23013 por jugar golf a 6 bytes de mi código.

Pruébelo en línea en el intérprete de CJam .

Casos de prueba

$ 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

Cómo funciona

"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
fuente
1
qS/_':f/60fb_f{f-:+720%!,}\"The correct time is "f\2/.e&$("Look at the sun"@?. bimplica :i.
jimmy23013
3
"The correct time is "lS/_':f/60fb:T.{Tf-:+720%{}@?}{];"Look at the sun"}*.
jimmy23013
Te perdiste el caso cuando x = 0
Lakshay Garg
@LakshayGarg: La pregunta dice que cada uno da un momento diferente . Eso sería falso si x = 0.
Dennis
@Dennis Es posible que pueda reducirlo aún más, no se requiere el punto final al final ...
WallyWest
7

JavaScript ( ES6 ), 164168172

Para cada lectura, calcule la distancia de las otras dos. El que tiene la misma distancia es lo que necesita. Si hay más de uno, entonces no se puede saber.

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
fuente
Si no da 3:00 para la entrada 3:00 3:00 3:00. Cuando x = 0: P
Lakshay Garg
44
@LakshayGarg no. Problem is they each give a different timeentonces x no puede ser 0.
edc65
Con cada voto positivo que obtengas, deberías edc65++.
Alex A.
4

Python 3, 166 163 bytes

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)

Usos

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

con aritmética siendo minutos módulo 720.

Sp3000
fuente
Usando un enfoque similar (a + abc == 0) descubrí que no es necesario ordenar. ¿Intentaste evitarlo?
edc65
@ edc65 Intenté mantener un conteo, pero creo que resultó más largo. También tuve un + abc inicialmente pero son muchas llamadas a f(y pre-list-comp es largo)
Sp3000
2

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

Probablemente algunas formas de acortar esto, deme un poco de tiempo.

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]

Gracias a Sp3000 que me ayudó a solucionar esto.

Kade
fuente