Która godzina?

25

Lubię dosłownie oszczędzać czas, nosząc trzy zegarki na moim nadgarstku ... Problem w tym, że każdy z nich daje inny czas. Jeden zegarek jest x minut od rzeczywistego czasu. Jeden zegarek to x minut przed faktycznym czasem. Ostatni zegarek pokazuje aktualny czas.

Problem w tym, że nie mogę powiedzieć, który zegarek ma właściwy czas ...

Na podstawie czasu wyświetlanego na każdym zegarku określ rzeczywisty czas. Jeśli nie można ustalić godziny, wydrukuj „Spójrz na słońce”.

Wprowadzanie: Trzy odczyty, oddzielone pojedynczymi znakami spacji: H1:M1 H2:M2 H3:M3 W każdym odczycie H1, H2, H3 reprezentują wyświetlane godziny (0 <H1, H2, H3 <13), a M1, M2, M3 reprezentują wyświetlane minuty (0 <= M1 , M2, M3 <60). Jeśli liczba minut jest mniejsza niż 10, na wejściu jest wstawiane początkowe zero. Podobnie, jeśli liczba godzin jest mniejsza niż 10, na wejściu jest wstawiane początkowe 0.

Dane wyjściowe: The correct time is HH:MM gdzie GG: MM to właściwy czas. Jeśli nie można ustalić prawidłowego czasu, wyświetla się Look at the sun.

Wejście 1: 05:00 12:00 10:00

Wyjście 1: The correct time is 05:00

Wejście 2: 11:59 12:30 01:01

Wyjście 2: The correct time is 12:30

Wejście 3: 12:00 04:00 08:00

Wyjście 3: Look at the sun

Najkrótszy kod wygrywa ... Nie obowiązują specjalne kary. Pamiętaj też, że mamy do czynienia z 12-godzinnym zegarem ... Nie dbam o AM ani PM ... Wyobraź sobie, że mamy do czynienia z analogowymi zegarkami ...

WallyWest
źródło
Przez prawidłowy czas rozumiesz bieżący czas lokalny?
Optymalizator
7
@sanchises Ponieważ dzieli je 4 godziny. 12:00jest dokładnie pomiędzy, 8:00a 4:00także, wiesz ...
Siguza,
1
Mówisz, że wynik ma postać The correct time is HH:MM, bez kropki, ale następnie włącz kropkę w dwóch pierwszych przykładach. Która wersja jest poprawna?
Sp3000,
1
Czy wolno odczytywać czasy jako argumenty wiersza poleceń?
Dennis
1
Jak w whattimeisit 07:21 08:39 08:00? Pewnie!
WallyWest,

Odpowiedzi:

10

CJam, 86 83 77 75 71 bajtów

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

Dzięki @ jimmy23013 za odgranie 6 bajtów od mojego kodu.

Wypróbuj online w interpretatorze CJam .

Przypadki testowe

$ 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

Jak to działa

"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
źródło
1
qS/_':f/60fb_f{f-:+720%!,}\"The correct time is "f\2/.e&$("Look at the sun"@?. bimplikuje :i.
jimmy23013
3
"The correct time is "lS/_':f/60fb:T.{Tf-:+720%{}@?}{];"Look at the sun"}*.
jimmy23013
Przegapiłeś przypadek, gdy x = 0
Lakshay Garg
@LakshayGarg: Pytanie mówi, że każdy z nich daje inny czas . To byłoby fałszywe, gdyby x = 0.
Dennis
@Dennis Być może uda Ci się go jeszcze zmniejszyć, kropka na końcu nie jest wymagana ...
WallyWest
7

JavaScript ( ES6 ), 164 168 172

Dla każdego odczytu oblicz odległość od pozostałych dwóch. Ten, który ma taką samą odległość, jest tym, czego potrzebujesz. Jeśli jest więcej niż jeden, nie możesz powiedzieć.

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
źródło
Jeśli nie powinien dać 3:00 dla wejścia 3:00 3:00 3:00. Gdy x = 0: P
Lakshay Garg
4
@LakshayGarg no. Problem is they each give a different timewięc x nie może być 0.
edc65
Z każdą otrzymaną oceną powinieneś edc65++.
Alex A.
4

Python 3, 166 163 bajtów

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)

Używa

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

przy czym arytmetyka to minuty modulo 720.

Sp3000
źródło
Stosując podobne podejście (a + abc == 0) stwierdziłem, że sortowanie nie jest potrzebne. Próbowałeś tego uniknąć?
edc65
@ edc65 Starałem się zamiast tego liczyć, ale myślę, że okazało się to dłużej. Początkowo miałem również abc, ale to dużo połączeń z f(i
kompilacja
2

Python 2, 254 ... 199 207 203 194 200 bajtów

Prawdopodobnie kilka sposobów na skrócenie tego, daj mi trochę czasu ...

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]

Dzięki Sp3000 pomaga mi to naprawić.

Kade
źródło