Que horas são?

25

Eu gosto de economizar tempo literalmente, usando três relógios no meu pulso ... O problema é que cada um deles dá um tempo diferente. Um relógio está x minutos atrás do tempo real. Um relógio está x minutos à frente do tempo real. O último relógio mostra a hora real.

O problema é que não sei dizer qual relógio tem a hora correta ...

A partir da hora exibida em cada relógio, determine a hora real. Se não for possível determinar a hora, imprima "Olhe para o sol".

Entrada: Três leituras, separadas por caracteres de espaço único: H1:M1 H2:M2 H3:M3 em cada leitura H1, H2, H3 representam as horas exibidas (0 <H1, H2, H3 <13) e M1, M2, M3 representam os minutos exibidos (0 <= M1 M2, M3 <60). Se o número de minutos for menor que 10, um 0 inicial é acrescentado na entrada. Da mesma forma, se o número de horas for menor que 10, um 0 inicial é acrescentado na entrada.

Saída: The correct time is HH:MM onde HH: MM é a hora correta. Se não for possível determinar a hora correta, ela será exibida Look at the sun.

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

Saída 1: The correct time is 05:00

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

Saída 2: The correct time is 12:30

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

Saída 3: Look at the sun

O código mais curto vence ... Nenhuma penalidade especial se aplica. Além disso, lembre-se de que estamos lidando com um relógio de 12 horas ... Eu não ligo para AM ou PM ... Imagine que estamos lidando com relógios analógicos ...

WallyWest
fonte
Na hora correta, você quer dizer a hora local atual?
Optimizer
7
@sanchises Porque eles têm 4 horas de intervalo. 12:00é exatamente entre 8:00e 4:00também, você sabe ...
Siguza
1
Você diz que a saída é do formato The correct time is HH:MM, sem um ponto final, mas depois inclui um ponto final nos dois primeiros exemplos. Qual versão está correta?
Sp3000 3/15
1
É permitido ler os horários como argumentos de linha de comando?
Dennis
1
Como em whattimeisit 07:21 08:39 08:00? Certo!
Wally West

Respostas:

10

CJam, 86 83 77 75 71 bytes

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

Graças a @ jimmy23013 por jogar fora 6 bytes do meu código.

Experimente on-line no intérprete CJam .

Casos de teste

$ 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

Como 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
fonte
1
qS/_':f/60fb_f{f-:+720%!,}\"The correct time is "f\2/.e&$("Look at the sun"@?. bimplica :i.
precisa saber é o seguinte
3
"The correct time is "lS/_':f/60fb:T.{Tf-:+720%{}@?}{];"Look at the sun"}*.
precisa saber é o seguinte
Você perdeu o caso quando x = 0
Lakshay Garg 3/15
@LakshayGarg: A pergunta diz que cada um dá um tempo diferente . Isso seria falso se x = 0.
Dennis
@ Dennis Pode ser capaz de reduzi-lo ainda mais, o ponto final no fim não é necessária ...
Wally West
7

JavaScript ( ES6 ), 164 168 172

Para cada leitura, calcule a distância das outras duas. O que tem a mesma distância é o que você precisa. Se houver mais de um, não será possível 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
fonte
Se não der 3:00 para a entrada 3:00 3:00 3:00. Quando x = 0: P
Lakshay Garg
4
@LakshayGarg no. Problem is they each give a different timeentão x não pode ser 0.
edc65
Com cada voto positivo que você recebe, você deveria 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

sendo aritmética minutos módulo 720.

Sp3000
fonte
Usando uma abordagem semelhante (a + abc == 0), descobri que a classificação não é necessária. Você tentou evitá-lo?
edc65
@ edc65 Tentei manter uma contagem, mas acho que ficou mais tempo. Eu também tive a + abc inicialmente, mas isso é um monte de chamadas para f(e pré-lista-comp é longa)
SP3000
2

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

Provavelmente, algumas maneiras de encurtar isso, me dê um tempo ..

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]

Graças ao Sp3000, me ajudando a corrigir isso.

Kade
fonte