Котра година?


25

Мені подобається економити час буквально, носячи три годинники на зап'ясті ... Проблема полягає в тому, що кожен з них приділяє інший час. Один годинник на x хвилин відстає від фактичного часу. Один годинник на x хвилини випереджає фактичний час. Останній годинник показує фактичний час.

Проблема в тому, що я не можу сказати, який годинник має правильний час ...

З часу, відображеного на кожному годиннику, визначте фактичний час. Якщо визначити час неможливо, надрукуйте «Поглянь на сонце».

Введення: Три читання, розділені символами пробілу: H1:M1 H2:M2 H3:M3 У кожному читанні H1, H2, H3 представляють відображені години (0 <H1, H2, H3 <13), а M1, M2, M3 являють відображені хвилини (0 <= M1 , M2, M3 <60). Якщо кількість хвилин менше 10, на вході є попередній 0. Аналогічно, якщо кількість годин менше 10, на вході передбачено попереднє 0.

Вихід: The correct time is HH:MM де 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занадто, ви знаєте ...
Siguza

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

Ви пропустили випадок, коли x = 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: Р
Лакшай Гарг

4
@LakshayGarg ні. Problem is they each give a different timeтому x не може бути 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(і попередній список-comp довгий)
Sp3000

2

Пітон 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.