Который час?


25

Мне нравится буквально экономить время, надевая на запястье три часа ... Проблема в том, что каждый из них дает разное время. Один час отстает от реального времени на х минут. Один час на х минут опережает фактическое время. Последние часы показывают реальное время.

Проблема в том, что я не могу сказать, какие часы имеют правильное время ...

По времени, отображаемому на каждых часах, определите фактическое время. Если невозможно определить время, выведите «Look on the sun».

Входные данные: три показания, разделенные пробелами: H1:M1 H2:M2 H3:M3 в каждом чтении H1, H2, H3 представляют отображаемые часы (0 <H1, H2, H3 <13), а M1, M2, M3 представляют отображаемые минуты (0 <= M1 М2, М3 <60). Если количество минут меньше 10, перед входом добавляется начальный 0. Точно так же, если количество часов меньше 10, перед входом добавляется начальный 0.

Вывод: The correct time is HH:MM где ЧЧ: ММ - правильное время. Если точное время не может быть определено, оно отображается Look at the sun.

Вход 1: 05:00 12:00 10:00

Выход 1: The correct time is 05:00

Вход 2: 11:59 12:30 01:01

Выход 2: The correct time is 12:30

Вход 3: 12:00 04:00 08:00

Выход 3: Look at the sun

Самый короткий код выигрывает ... Никаких специальных штрафов не применяется. Кроме того, имейте в виду, что мы имеем дело с 12-часовыми часами ... Меня не волнуют AM или PM ... Представьте, что мы имеем дело с аналоговыми часами ...


Под правильным временем вы подразумеваете текущее местное время?
Оптимизатор

7
@sanchises, потому что они 4 часа друг от друга. 12:00точно между 8:00и 4:00тоже, вы знаете ...
Сигуза

1
Вы говорите, что вывод имеет форму The correct time is HH:MM, без полной остановки, но затем продолжаете включать полную остановку в первых двух примерах. Какая версия верна?
Sp3000

1
Разрешено ли читать время как аргументы командной строки?
Деннис

1
Как в whattimeisit 07:21 08:39 08:00? Конечно!
WallyWest

Ответы:


10

CJam, 86 83 77 75 71 байт

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

Спасибо @ jimmy23013 за удаление 6 байтов из моего кода.

Попробуйте онлайн в интерпретаторе CJam .

Контрольные примеры

$ 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

Как это работает

"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#

1
qS/_':f/60fb_f{f-:+720%!,}\"The correct time is "f\2/.e&$("Look at the sun"@?, bподразумевает :i.
jimmy23013

3
"The correct time is "lS/_':f/60fb:T.{Tf-:+720%{}@?}{];"Look at the sun"}*,
jimmy23013

Вы пропустили случай, когда х = 0
Лакшай Гарг

@LakshayGarg: Вопрос говорит, что каждый из них дает разное время . Это было бы неверно, если x = 0.
Деннис

@Dennis Вы можете уменьшить его дальше, полная остановка в конце не требуется ...
WallyWest

7

JavaScript ( ES6 ), 164 168 172

Для каждого чтения вычислите расстояние от двух других. Тот, у кого одинаковое расстояние - это то, что вам нужно. Если их больше одного, вы не можете сказать.

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>


Если это не дать 3:00 для ввода 3:00 3:00 3:00. Когда х = 0: P
Лакшай Гарг

4
@LakshayGarg нет. Problem is they each give a different timeпоэтому х не может быть 0.
edc65

С каждым полученным ответом вы должны edc65++.
Алекс А.

4

Python 3, 166 163 байта

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)

Пользы

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

с арифметическими минутами по модулю 720.


Используя аналогичный подход (a + abc == 0), я обнаружил, что сортировка не нужна. Вы пытались избежать этого?
edc65

@ edc65 Я старался вместо этого вести подсчет, но, думаю, получилось дольше. У меня тоже был + abc изначально, но это много звонков f(а pre-list-comp длинный)
Sp3000

2

Python 2, 254 ... 199 207 203 194 200 байт

Вероятно, несколько способов сократить это, дайте мне немного времени ..

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]

Благодаря Sp3000 помог мне исправить это.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.