Wie viel Uhr ist es?

25

Ich mag es buchstäblich, Zeit zu sparen, indem ich drei Uhren an meinem Handgelenk trage ... Das Problem ist, dass sie jeweils eine andere Zeit angeben. Eine Uhr ist x Minuten hinter der tatsächlichen Zeit. Eine Uhr ist der tatsächlichen Zeit x Minuten voraus. Die letzte Uhr zeigt die aktuelle Uhrzeit.

Das Problem ist, ich kann nicht sagen, welche Uhr die richtige Zeit hat ...

Bestimmen Sie anhand der auf jeder Uhr angezeigten Uhrzeit die tatsächliche Uhrzeit. Wenn es nicht möglich ist, die Uhrzeit zu bestimmen, drucken Sie "Look at the sun".

Eingabe: Drei Messwerte, getrennt durch einzelne Leerzeichen: H1:M1 H2:M2 H3:M3 In jedem Messwert stehen H1, H2, H3 für die angezeigten Stunden (0 <H1, H2, H3 <13) und M1, M2, M3 für die angezeigten Minuten (0 <= M1) , M2, M3 <60). Wenn die Anzahl der Minuten kleiner als 10 ist, wird der Eingabe eine führende 0 vorangestellt. Ist die Stundenzahl gleichermaßen kleiner als 10, wird der Eingabe eine führende 0 vorangestellt.

Ausgabe: The correct time is HH:MM wobei HH: MM die richtige Zeit ist. Wenn keine korrekte Uhrzeit ermittelt werden kann, wird diese angezeigt Look at the sun.

Eingang 1: 05:00 12:00 10:00

Ausgang 1: The correct time is 05:00

Eingang 2: 11:59 12:30 01:01

Ausgang 2: The correct time is 12:30

Eingang 3: 12:00 04:00 08:00

Ausgang 3: Look at the sun

Kürzester Code gewinnt ... Es gelten keine besonderen Strafen. Denken Sie auch daran, dass es sich um eine 12-Stunden-Uhr handelt ... mir sind AM oder PM egal ... Stellen Sie sich vor, wir haben es mit analogen Uhren zu tun ...

WallyWest
quelle
Mit korrekter Zeit meinen Sie die aktuelle Ortszeit?
Optimierer
7
@sanchises Weil sie 4 Stunden voneinander entfernt sind. 12:00ist genau zwischen 8:00und 4:00zu, wissen Sie ...
Siguza
1
Sie sagen, die Ausgabe hat die Form The correct time is HH:MMohne Punkt, schließen jedoch in den ersten beiden Beispielen einen Punkt ein. Welche Version ist richtig?
Sp3000,
1
Darf man die Zeiten als Kommandozeilenargumente lesen?
Dennis
1
Wie in whattimeisit 07:21 08:39 08:00? Sicher!
WallyWest

Antworten:

10

CJam, 86 83 77 75 71 Bytes

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

Vielen Dank an @ jimmy23013 für das Abwerfen von 6 Bytes aus meinem Code.

Probieren Sie es online im CJam-Interpreter aus .

Testfälle

$ 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

Wie es funktioniert

"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
quelle
1
qS/_':f/60fb_f{f-:+720%!,}\"The correct time is "f\2/.e&$("Look at the sun"@?. bimpliziert :i.
Jimmy23013
3
"The correct time is "lS/_':f/60fb:T.{Tf-:+720%{}@?}{];"Look at the sun"}*.
Jimmy23013
Sie haben den Fall verpasst, als x = 0
Lakshay Garg
@ LakshayGarg: Die Frage besagt, dass sie jeweils eine andere Zeit geben . Das wäre falsch, wenn x = 0.
Dennis
@ Tennis Sie können es möglicherweise weiter reduzieren, der
Punkt
7

JavaScript ( ES6 ), 164 168 172

Berechnen Sie für jeden Messwert den Abstand zwischen den beiden anderen. Derjenige, der den gleichen Abstand hat, ist das, was Sie brauchen. Wenn es mehr als eine gibt, kann man das nicht sagen.

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
quelle
Sollte es nicht 3:00 für den Eingang geben 3:00 3:00 3:00. Wenn x = 0: P
Lakshay Garg
4
@ LakshayGarg Nr. Problem is they each give a different timealso kann x nicht 0 sein.
edc65
Mit jeder positiven Bewertung, die Sie erhalten, sollten Sie 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)

Verwendet

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

mit arithmetik ist minuten modulo 720.

Sp3000
quelle
Unter Verwendung eines ähnlichen Ansatzes (a + abc == 0) stellte ich fest, dass keine Sortierung erforderlich ist. Hast du versucht, es zu vermeiden?
edc65
@ edc65 Ich habe versucht, stattdessen eine Zählung durchzuführen, aber ich denke, es hat sich als länger herausgestellt. Anfangs hatte ich auch ein + abc, aber das ist eine Menge Anrufe f(und Pre-List-Comp ist lang)
Sp3000
2

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

Wahrscheinlich ein paar Möglichkeiten, dies zu verkürzen, gib mir etwas Zeit ..

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]

Dank Sp3000 kann ich das beheben.

Kade
quelle