Mấy giờ rồi?


25

Tôi thích tiết kiệm thời gian theo đúng nghĩa đen, bằng cách đeo ba chiếc đồng hồ trên cổ tay ... Vấn đề là mỗi cái cho một thời gian khác nhau. Một chiếc đồng hồ là x phút sau thời gian thực tế. Một chiếc đồng hồ là x phút trước thời gian thực tế. Chiếc đồng hồ cuối cùng cho thấy thời gian thực tế.

Vấn đề là, tôi không thể biết chiếc đồng hồ nào có thời gian chính xác ...

Từ thời gian hiển thị trên mỗi chiếc đồng hồ, xác định thời gian thực tế. Nếu không thể xác định thời gian, hãy in "Nhìn mặt trời".

Đầu vào: Ba lần đọc, cách nhau bởi các ký tự khoảng trắng đơn: H1:M1 H2:M2 H3:M3 Trong mỗi lần đọc H1, H2, H3 biểu thị số giờ được hiển thị (0 <H1, H2, H3 <13) và M1, M2, M3 biểu thị số phút được hiển thị (0 <= M1 , M2, M3 <60). Nếu số phút ít hơn 10, số 0 đứng đầu được thêm vào đầu vào. Tương tự, là số giờ nhỏ hơn 10, số 0 đứng đầu được thêm vào trong đầu vào.

Đầu ra: The correct time is HH:MM trong đó HH: MM là thời gian chính xác. Nếu không có thời gian chính xác có thể được xác định, nó sẽ hiển thị Look at the sun.

Đầu vào 1: 05:00 12:00 10:00

Đầu ra 1: The correct time is 05:00

Đầu vào 2: 11:59 12:30 01:01

Đầu ra 2: The correct time is 12:30

Đầu vào 3: 12:00 04:00 08:00

Đầu ra 3: Look at the sun

Mã ngắn nhất thắng ... Không áp dụng hình phạt đặc biệt. Ngoài ra, hãy nhớ rằng chúng ta đang làm việc với đồng hồ 12 giờ ... Tôi không quan tâm đến AM hay PM ... Hãy tưởng tượng chúng ta đang làm việc với đồng hồ analog ...


Theo thời gian chính xác, bạn có nghĩa là giờ địa phương hiện tại?
Tối ưu hóa

7
@sanchises Vì cách nhau 4 giờ. 12:00chính xác là giữa 8:004:00quá, bạn biết đấy ...
Siguza

1
Bạn nói đầu ra có dạng The correct time is HH:MM, không có điểm dừng hoàn toàn, nhưng sau đó tiến hành bao gồm dừng hoàn toàn trong hai ví dụ đầu tiên. Phiên bản nào đúng?
Sp3000

1
Được phép đọc thời gian dưới dạng đối số dòng lệnh?
Dennis

1
Như trong whattimeisit 07:21 08:39 08:00? Chắc chắn rồi!
WallyWest

Câu trả lời:


10

CJam, 86 83 77 75 71 byte

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

Cảm ơn @ jimmy23013 vì đã loại bỏ 6 byte từ mã của tôi.

Hãy thử trực tuyến trong trình thông dịch CJam .

Các trường hợp thử nghiệm

$ 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

Làm thế nào nó hoạt động

"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"@?. bngụ ý :i.
jimmy23013

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

Bạn đã bỏ lỡ trường hợp khi x = 0
Lakshay Garg

@LakshayGarg: Câu hỏi nói rằng mỗi người đưa ra một thời gian khác nhau . Điều đó sẽ sai nếu x = 0.
Dennis

@Dennis Bạn có thể giảm thêm nữa, việc dừng hoàn toàn ở cuối không bắt buộc ...
WallyWest

7

JavaScript ( ES6 ), 164 168 172

Đối với mỗi lần đọc, calc khoảng cách từ hai người kia. Người có cùng khoảng cách là thứ bạn cần. Nếu có nhiều hơn một, thì bạn không thể nói.

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>


Nếu nó không cung cấp 3:00 cho đầu vào 3:00 3:00 3:00. Khi x = 0: P
Lakshay Garg

4
@LakshayGarg không. Problem is they each give a different timevì vậy x không thể là 0.
edc65

Với mỗi upvote bạn nhận được, bạn nên edc65++.
Alex A.

4

Python 3, 166 163 byte

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)

Công dụng

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

với số học là phút modulo 720.


Sử dụng một cách tiếp cận tương tự (a + abc == 0) Tôi thấy rằng việc sắp xếp là không cần thiết. Bạn đã cố gắng để tránh nó?
edc65

@ edc65 Tôi đã cố gắng để giữ một số đếm thay thế nhưng tôi nghĩ rằng nó bật ra lâu hơn. Tôi cũng đã có + abc ban đầu nhưng đó là rất nhiều cuộc gọi đến f(và trước khi liệt kê danh sách dài)
Sp3000

2

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

Có lẽ một vài cách để rút ngắn điều này, cho tôi một chút thời gian ..

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]

Nhờ Sp3000 giúp tôi khắc phục điều này.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.