Saat kaç?


25

Tam anlamıyla zamandan tasarruf etmeyi seviyorum, bileğimde üç saat takarak ... Sorun, her birinin farklı bir zaman vermesi. Bir saat, gerçek zamanın x dakikası. Bir saat, gerçek zamanın x dakika ilerisinde. Son saat gerçek zamanı gösterir.

Sorun şu ki, hangi saatin doğru zamanı olduğunu söyleyemem ...

Her saatte görüntülenen saatten asıl saati belirleyin. Saati belirlemek mümkün değilse, "Güneşe bak" yazınız.

Giriş: Tek boşluk karakterleri ile ayrılmış üç okuma: H1:M1 H2:M2 H3:M3 Her okunuşta H1, H2, H3, gösterilen saatleri gösterir (0 <H1, H2, H3 <13) ve M1, M2, M3, gösterilen dakikaları (0 <= M1) temsil eder. , M2, M3 <60). Dakika sayısı 10'dan azsa, girişte baştaki 0 ​​değeri hazırlanır. Benzer şekilde, saat sayısı 10'dan az olduğunda, girişte bir öncü 0 hazırlanır.

Çıktı: The correct time is HH:MM burada HH: MM doğru zamandır. Doğru zaman belirlenemiyorsa, görüntülenir Look at the sun.

Giriş 1: 05:00 12:00 10:00

Çıkış 1: The correct time is 05:00

Giriş 2: 11:59 12:30 01:01

Çıkış 2: The correct time is 12:30

Giriş 3: 12:00 04:00 08:00

Çıkış 3: Look at the sun

En kısa kod kazanır ... Özel bir ceza uygulanmaz. Ayrıca, 12 saatlik bir saatle uğraştığımızı da aklınızda bulundurun ... AM veya PM ile ilgilenmiyorum ... Analog saatler ile uğraştığımızı hayal edin ...


Doğru zamanda, şu anki yerel saati mi kastediyorsunuz?
Doktor

7
@sanchises Çünkü onlar 4 saat ayrı. 12:00tam olarak 8:00ve aynı 4:00zamanda, biliyorsunuz ...
Siguza

1
Çıktının, The correct time is HH:MMtam bir duraklama olmadan formda olduğunu söylersiniz , ancak sonra ilk iki örnekte tam bir duraklamayı dahil etmeye devam edin. Hangi sürüm doğru?
Sp3000

1
Zamanları komut satırı argümanları olarak okuyabilir mi?
Dennis,

1
Gibi whattimeisit 07:21 08:39 08:00mi? Emin!
WallyWest

Yanıtlar:


10

CJam, 86 83 77 75 71 bayt

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

Benim kodundan 6 bayt golf oynamak için @ jimmy23013 için teşekkürler

CJam tercümanında çevrimiçi olarak deneyin .

Test durumları

$ 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

Nasıl çalışır

"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"@?. bima eder :i.
jimmy23013

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


@LakshayGarg: Soru, her birinin farklı zaman verdiklerini söylüyor . Eğer bu yanlış olurdu x = 0.
Dennis

@Dennis Daha da azaltabilirsiniz, sonunda tam
durmanız

7

JavaScript ( ES6 ), 164 168 172

Her okuma için, diğer ikisinden olan mesafeyi hesaplayın. Aynı mesafeye sahip olan, ihtiyacınız olan şeydir. Birden fazla varsa, söyleyemezsin.

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>


Girişte 3:00 3:00 3:00 vermemeli. X = 0 olduğunda: P
Lakshay Garg

4
@LakshayGarg no. Problem is they each give a different timebu yüzden x 0 olamaz
edc65

Her oyla, almalısın edc65++.
Alex A.

4

Python 3, 166 163 bayt

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)

Kullanımları

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

Aritmetik dakika modulo 720 olan.


Benzer bir yaklaşım kullanarak (a + abc == 0) Sıralamanın gerekli olmadığını gördüm. Bundan kaçınmaya çalıştınız mı?
edc65

@ edc65 Bunun yerine bir sayı tutmaya çalıştım ama sanırım daha uzun sürdü. Ayrıca başlangıçta bir + abc aldım ama bu bir çok çağrı f(ve ön-liste-comp uzun)
Sp3000

2

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

Muhtemelen bunu kısaltmanın birkaç yolu var, bana biraz zaman verin ..

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]

Bunu düzeltmeme yardımcı olan Sp3000 sayesinde.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.