เวลาเท่าไร


25

ฉันชอบที่จะประหยัดเวลาอย่างแท้จริงโดยการใส่นาฬิกาข้อมือสามข้อ ... ปัญหาคือพวกเขาแต่ละคนให้เวลาที่แตกต่างกัน หนึ่งนาฬิกาคือ x นาทีหลังเวลาจริง หนึ่งนาฬิกาคือ x นาทีก่อนเวลาจริง นาฬิกาสุดท้ายแสดงเวลาจริง

ปัญหาคือฉันไม่สามารถบอกได้ว่านาฬิกาเรือนไหนมีเวลาที่ถูกต้อง ...

จากเวลาที่แสดงในแต่ละนาฬิกาให้กำหนดเวลาจริง หากไม่สามารถระบุเวลาได้ให้พิมพ์ "Look the the sun"

อินพุต: การอ่านสามรายการคั่นด้วยอักขระช่องว่างเดียว: 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
อนุญาตให้อ่านเวลาเป็นอาร์กิวเมนต์บรรทัดคำสั่งได้หรือไม่
Dennis

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
Lakshay Garg

@LakshayGarg: คำถามที่บอกว่าพวกเขาแต่ละคนให้เวลาที่แตกต่างกัน x = 0ที่จะเป็นเท็จถ้า
Dennis

@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 เมื่อ x = 0: P
Lakshay Garg

4
@ LakshayGarg no. Problem is they each give a different timeดังนั้น x จึงไม่สามารถเป็น 0
edc65

กับแต่ละ upvote edc65++คุณจะได้รับคุณควร
Alex A.

4

Python 3, 166 163 bytes

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 ที่ช่วยฉันแก้ไขปัญหานี้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.