En yakın saat ibrelerini bulun


15

Meydan okuma

Gece yarısından birkaç saniye geçtikten sonra, mümkün olduğunca az bayt kullanarak saat yüzündeki iki el arasındaki en küçük açıyı alın.

Saniyelerin her zaman 86400'den az olduğunu varsayabilirsiniz. Açılar derece veya radyan olarak temsil edilebilir.

Bir referans çözüm: http://ideone.com/eVdgC0

Test Durumları (derece cinsinden sonuçlar)

0 -> 0
60 -> 0.5
600 -> 5
3600 -> 0
5400 -> 45
6930 -> 84.75
50000 -> 63.333

Clarificarions

  • Saatin 3 eli vardır: saat, dakika ve saniye.
  • Tüm eller sürekli hareket eder, böylece saat ve dakika ibreleri saat yüzündeki mezuniyetler arasında bulunabilir.

İlgili zorluk (yalnızca dakika ve saat ibreleri, derece olarak)
Sp3000

1
Muhtemelen saatin üzerinde ikinci bir el olduğunu belirtmelisiniz.
isaacg

Bazı test senaryoları ekleyebilir misiniz?
Beta Çürümesi

1
Bazı saatlerde, saniye ibresi tepeye ulaştığında dakika ibresi bir sonraki dakikaya atlar. Diğerlerinde sürekli hareket eder. Bunun sürekli hareket ettiği bir saat olduğunu mu sanıyorum? Ayrıca, dikkatlice okuduktan sonra açık olsa da, başlangıçta "ikinci el" belirsiz buldum, çünkü çoğu saatin zaten en az iki eli var, bu yüzden "ikinci el" i eklemek gerçekten üçüncü bir el ekliyor.
Reto Koradi

1
@BetaDecay Kesinlikle. "Saatlerin üç eli vardır: saat, dakika ve saniye."
Reto Koradi

Yanıtlar:


10

CJam, 36 35 34 32 30 bayt

riP*30/_60/_C/]2m*::-:mc:mC$3=

Çıktı radyan cinsindendir. 86400 olası girişin çözümlerini doğruladım.

CJam yorumlayıcısında çevrimiçi deneyin .

Fikir

Yana radyan saat tam bir tur, her dakika / saniye aralığı olduğu 2π / 60 = π / 30 geniş radyan.

Böylece, saniye sayısını π / 30'a bölmek ikinci elin konumunu verir.

Dakika ibresi, ikinci elin hızının altmışınında hareket eder, bu nedenle sonucun yukarıdan 60'a bölünmesi , dakika ibresi pozisyonunu verir.

Benzer şekilde, son sonucun 12'ye bölünmesi saat ibresinin pozisyonunu verir.

Yukarıdaki üç bölümümüzün mutlaka [0,2π) aralığında olmadığını unutmayın .

Ellerin açılarındaki dokuz olası farklılığın hepsini hesaplayarak, üç 0 '(bir el ile kendisi arasındaki açısal mesafe) ve farklı eller arasındaki altı mesafeyi elde ederiz .

En yakın eller 12 içermeyen bir yarıdaysa , yukarıdakilerden farklardan biri istenen çıkış olacaktır (mod ).

Bununla birlikte, en 01:55:30 (örneğin), saat ibresi 1.008 rad (57.75 °) ve den 5,812 rad (333.00 °) bir açı ile dakikalık elin bir açıdadır , 12 4,804 rad bir fark vererek (275.25 derece). Bu sonucu tam bir turdan çıkararak, "diğer yönde" ölçülen ve 1.479 rad'e (84.75 rad) eşit olan açıyı elde ederiz.

Şimdi, daha doğrusu her açı haritalama daha İçeride ISTV melerin RWMAIWi'nin içinde [0,2π) ve şartlı sonucunu çıkararak tt , biz sadece hesapla arccos (cos (θ)) beri, cos periyodik ve hatta hem de ve arccos hep bir değer verir [ 0, π) .

En küçük üç sonucu (tümü sıfır) atladığınızda, dördüncü en küçük sonuç istenen çıktı olur.

kod

ri                             e# Read an integer from STDIN.
  P*30/                        e# Multiply by π and divide by 30.
       _60/                    e# Divide a copy by 60.
           _C/                 e# Divide a copy by 12.
              ]2m*             e# Push the array of all pairs of quotients.
                  ::-          e# Replace each pair by its difference.
                     :mc       e# Apply cosine to each difference.
                        :mC    e# Apply arccosine to each cosine.
                           $3= e# Sort and select the fourth smallest element.

Alternatif sürüm (34 bayt)

rd6*_60/_C/]360f%2m*::m360X$f-+$6=

Çıktı derece cinsindendir ve trigonometrik fonksiyon kullanılmaz.

CJam yorumlayıcısında çevrimiçi deneyin .


9

Mathematica, 40 bayt

Min@Abs@Mod[#{11,708,719}/120,360,-180]&

Açıklama: tGece yarısından bu yana saniye sayısı olsun . Her elin konumu

hour: t/120 (mod 360)
min:  t/10 (mod 360)
sec:  6t (mod 360)

xDereceler ve ydereceler arasındaki mutlak açısal mesafeyi hesaplamak için y - x, aralıkta 360 ile mod değiştirebilir [-180, 180]ve daha sonra mutlak değeri alabiliriz. (Not hiçbir kısıtlama olduğunu xve ybu işlev sadece ikili farklılıkları hesaplar Yani.) t/10-t/120, 6t-t/10Ve 6t-t/120ve bunu yapmaz.


Üzgünüz, Mathematica'ya aşina değilim, ama bu gece yarısından bu yana geçen saniye sayısı için bir argümanı veya değişkeni kabul ediyor mu?
Winny

1
@Winny Evet, saf bir işlevdir (ile gösterilir &) ve geçtiği ilk argüman içeride olarak adlandırılır #.
jcai

7

Python, 65

lambda n,l={720,60,1}:6*min((n/x-n/y)%60for x in l for y in{x}^l)

Dairenin 1/60 birimlerinde saat, dakika ve saniye ibresi ile kat edilen mesafe h,m,s = n/720, n/60, n/1. Biz gelen daireyi konumlarını almak için bu mod 60 alabilir 0için 60.

Eğer fark mod 60'ı alırsak, birinin diğerinin önünde olduğu birim sayısını elde ederiz. Altı olası farkın hepsini alıyoruz, 6min'i buluyoruz, sonra 360derecelere yeniden ölçeklendirmek için çarpıyoruz .

İki kat listesi anlama birinci ile temsil edilen ilk elden seçer 720, 60veya 1, daha sonra resim XOR ile çıkarıldı ilk seçim ile bu set arasından diğer yandan seçer.

Bunu referans koduna karşı kapsamlı bir şekilde test ettim.


6

C #, 163152 bayt

Bu, etrafı saran her sayıyı iki kez yaratır, daha sonra her kombinasyondan geçer ve eller arasındaki minimum açıyı bulur. Hesaplamalar 60 bölümde yapılır, sonra derece elde etmek için 6 ile çarpılır.

Netlik için girintili:

float F(int s){
    float b=60,c;
    float[]a={c=s/b/b%12*5,c+b,c=s/b%b,c+b,s%=60,s+b};
    for(s=36;s-->0;)
        b=s%6!=s/6&(c=(c=a[s%6]-a[s/6])<0?-c:c)<b?c:b;
    return b*6;
}

Örnek çıktı:

    0 seconds, 00:00:00, smallest angle is 0°
43200 seconds, 12:00:00, smallest angle is 0°
86399 seconds, 23:59:59, smallest angle is 0.09164429°
 3330 seconds, 00:55:30, smallest angle is 54.75°
39930 seconds, 11:05:30, smallest angle is 60.25001°
21955 seconds, 06:05:55, smallest angle is 65.49998°
21305 seconds, 05:55:05, smallest angle is 59.50001°
 5455 seconds, 01:30:55, smallest angle is 75.45831°
41405 seconds, 11:30:05, smallest angle is 44.95834°

Etrafında sarılmak için güzel bir çözüm
toto

2

TI-BASIC, 17 bayt

min(cos⁻¹(cos(ΔList(Ans{6,.1,5!⁻¹,6

Dennis'leri arccos(cos(mesafeleri normalleştirmek için kullanır ; ancak, tüm çift mesafeleri hesaplamak yerine, yalnızca gereken üç mesafeyi hesaplar ΔList([seconds],[minutes],[hours],[seconds].

Bu program Degreemodu bekler ve cevabı derece olarak döndürür.

EDIT: 5!bir bayt daha kısadır 120.

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.