Jam berapa

25

Saya suka menghemat waktu secara harfiah, dengan mengenakan tiga jam tangan di pergelangan tangan saya ... Masalahnya adalah masing-masing memberikan waktu yang berbeda. Satu jam tangan adalah x menit di belakang waktu yang sebenarnya. Satu jam adalah x menit lebih awal dari waktu yang sebenarnya. Jam tangan terakhir menunjukkan waktu aktual.

Masalahnya, saya tidak tahu jam mana yang memiliki waktu yang tepat ...

Dari waktu yang ditampilkan pada setiap jam, tentukan waktu yang sebenarnya. Jika tidak mungkin menentukan waktunya, cetak "Lihat matahari".

Input: Tiga bacaan, dipisahkan oleh karakter spasi tunggal: H1:M1 H2:M2 H3:M3 Dalam setiap pembacaan H1, H2, H3 mewakili jam yang ditampilkan (0 <H1, H2, H3 <13), dan M1, M2, M3 mewakili menit yang ditampilkan (0 <= M1 , M2, M3 <60). Jika jumlah menit kurang dari 10, angka 0 di depan ditambahkan dalam input. Demikian pula, adalah jumlah jam kurang dari 10, 0 terkemuka didahulukan dalam input.

Output: di The correct time is HH:MM mana HH: MM adalah waktu yang tepat. Jika tidak ada waktu yang tepat dapat ditentukan, ini akan ditampilkan Look at the sun.

Input 1: 05:00 12:00 10:00

Output 1: The correct time is 05:00

Input 2: 11:59 12:30 01:01

Output 2: The correct time is 12:30

Input 3: 12:00 04:00 08:00

Output 3: Look at the sun

Kode terpendek menang ... Tidak ada penalti khusus yang berlaku. Juga, ingatlah bahwa kita sedang berurusan dengan jam 12-jam ... Saya tidak peduli tentang AM atau PM ... Bayangkan kita sedang berurusan dengan jam tangan analog ...

WallyWest
sumber
Dengan waktu yang tepat, maksud Anda waktu setempat saat ini?
Pengoptimal
7
@sanchises Karena mereka terpisah 4 jam. 12:00persis antara 8:00dan 4:00juga, Anda tahu ...
Siguza
1
Anda mengatakan output berupa The correct time is HH:MM, tanpa berhenti penuh, tetapi kemudian lanjutkan untuk memasukkan berhenti penuh dalam dua contoh pertama. Versi mana yang benar?
Sp3000
1
Apakah diizinkan membaca waktu sebagai argumen baris perintah?
Dennis
1
Seperti di dalam whattimeisit 07:21 08:39 08:00? Yakin!
WallyWest

Jawaban:

10

CJam, 86 83 77 75 71 byte

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

Terima kasih kepada @ jimmy23013 untuk bermain golf 6 byte dari kode saya.

Cobalah online di juru bahasa CJam .

Uji kasus

$ 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

Bagaimana itu bekerja

"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
sumber
1
qS/_':f/60fb_f{f-:+720%!,}\"The correct time is "f\2/.e&$("Look at the sun"@?. btersirat :i.
jimmy23013
3
"The correct time is "lS/_':f/60fb:T.{Tf-:+720%{}@?}{];"Look at the sun"}*.
jimmy23013
Anda melewatkan case ketika x = 0
Lakshay Garg
@LakshayGarg: Pertanyaannya mengatakan bahwa mereka masing-masing memberikan waktu yang berbeda . Itu akan salah jika x = 0.
Dennis
@ Dennis Anda mungkin dapat menguranginya lebih jauh, pemberhentian penuh pada akhirnya tidak diperlukan ...
WallyWest
7

JavaScript ( ES6 ), 164 168 172

Untuk setiap bacaan, hitung jarak dari dua lainnya. Yang memiliki jarak yang sama adalah yang Anda butuhkan. Jika ada lebih dari satu, maka Anda tidak tahu.

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
sumber
Seharusnya tidak memberi 3:00 untuk input 3:00 3:00 3:00. Ketika x = 0: P
Lakshay Garg
4
@LakshayGarg no. Problem is they each give a different timejadi x tidak boleh 0.
edc65
Dengan setiap upvote yang Anda dapatkan, Anda harus melakukannya 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)

Penggunaan

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

dengan aritmatika menit modulo 720.

Sp3000
sumber
Menggunakan pendekatan yang serupa (a + abc == 0) Saya menemukan bahwa penyortiran tidak diperlukan. Apakah Anda mencoba menghindarinya?
edc65
@ edc65 Saya mencoba menghitung tetapi saya pikir ternyata lebih lama. Saya juga punya + abc awalnya tapi itu banyak panggilan ke f(dan pra-daftar-panjang)
Sp3000
2

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

Mungkin beberapa cara untuk mempersingkat ini, beri saya waktu ..

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]

Berkat Sp3000 membantu saya memperbaiki ini.

Kade
sumber