Analog, Geniş!


23

Analog bir saatin iki eli vardır *: Saat ve dakika.
Bu eller zaman geçtikçe saatin yüzünü çevreler. Dakika elinin her tam dönüşü, saat elinin dönüşünün 1 / 12'si ile sonuçlanır. Saatin 2 tam dönüşü, tam bir günü ifade eder.

Bu eller aynı merkezi noktaya sabitlendiğinden ve bu nokta etrafında döndüğünden, eller arasındaki açıyı her zaman hesaplayabilirsiniz. Aslında, herhangi bir zamanda 2 açı vardır; Daha büyüğü ve daha küçüğü (bazen ikisi de 180'e eşit olacak, ancak bu önemli değil)

* Hipotetik saatlerimizde ikinci el yok

Görev

24 saatlik formatta bir süre göz önüne alındığında, eller arasında daha küçük açıyı derece cinsinden verin. Eller doğrudan birbirinin karşısındaysa (örneğin 6:00, 18:00vb.) Çıktı 180

kurallar

Bir ayırıcı dize ayrıldı: - gibi giriş alınabilir 6:32, 14.26 - 2 ayrı değerler, ipler ya da int'leri: 6, 32, 14, 26 - 2 değerleri, ip ya da ints dizisi: [6, 32],[14, 26]

Ayrıca isteğe bağlı olarak (eğer dizeleri almak varsayarak) cevap girişleri 2 basamak yastıklı olması gerektirdiğini belirtebilir, yani: 06:32, 06, 32,[06, 32]

Ayrıca isteğe bağlı olarak, saat sonra dakika alarak, girişlerin sırasını tersine çevirebilir, yani: 32:6, 32, 6,[26, 14]

Saat 0ve 23(dahil) arasında bir tamsayı değeri olacaktır. Dakika 0ve 59(dahil) arasında bir tamsayı değeri olacaktır.

Dakika elinin yüz boyunca 6 derecelik artışlarla tutturulduğunu varsayabilirsiniz (her dakika değeri için eşit aralıklarla konumlandırılmış bir konum)
Saat elinin yüz boyunca 0,5 derecelik artışlarla tutturulduğu varsayılabilir ( saat başına her dakika değeri

Çıktı radyan değil derece cinsinden verilmelidir. .0Tam sayılar için bir iz ekleyebilirsiniz

puanlama

Bu yani her dilde en az bayt kazanıyor!

testcases

Input: 06:32
Output: 4

Input: 06:30
Output: 15

Input: 18:32
Output: 4

Input: 06:01
Output: 174.5

Input: 00:00
Output: 0

Input: 00:01
Output: 5.5

Input: 12:30
Output: 165

Input: 6:00
Output: 180

Input: 23:59
Output: 5.5


2
@FryAmTheEggman "Çıktı radyan değil derece cinsinden verilmelidir", bu yüzden tahmin etmem
Theo

1
5
59'da

4
Önerilen test durumu: 00:59 -> 35.5( büyük m değeri olan küçük bir değerinin bazı uygulamaların başarısız olmasına neden olması muhtemeldir). hm
Arnauld

1
Teşekkürler, @Arnauld, bana sadece bir bayta mal oldun! : p
Shaggy

Yanıtlar:


14

JavaScript (ES6),  41 40  39 bayt

Girişleri olarak alır (h)(m).

h=>m=>((x=4+h/3-m*.55/9)&2?12-x:x)%4*90

Çevrimiçi deneyin!

Nasıl?

Doğrudan [0..360] aralığında çalışmak yerine, [ 0..4 ] aralığında geçici bir x değişkeni tanımlarız :[0..4]

x=|4h12+4m60×124m60|mod4
x=|4h1244m60×12|mod4
x=|h311m180|mod4

Derece cinsinden açı:

min(4x,x)×90

Bununla birlikte, formül, JS ve kodunda biraz farklı bir şekilde uygulanır, çünkü kesinlikle uzun Math.abs()ve kullanmaktan kaçınmak isteriz Math.min().

Mutlak değeri hesaplamak yerine, pozitif bir değeri hesaplayarak :[0..12]

x=4+h311m180

Ve minimum hesaplama yerine, hangi durumda sadece bitsel olarak VE ile yaptığımızı belirliyoruz ve bu yüzden ilk önce gücüyle sınırlandırılmış bir aralık seçtik .22


5

Jöle , 14 12 bayt

ד<¿‘Iæ%Ø°AH

Çevrimiçi deneyin!

Saati, iki tamsayının listesi olarak alan monadik bir bağlantı: saat, dakika.

2 byte tasarruf için @JonathanAllan teşekkürler!

açıklama

ד<¿‘        | Multiply hour by by 60 and minute by 11
     I       | Find difference
      æ%Ø°   | Symmetric mod 360 [equivalent to (x + 360) mod 720 - 360]
          A  | Absolute
           H | Half

Simetrik mod? Bu nasıl çalışıyor?
Shaggy,

@Shaggy Çok rahat, değeri (-180, 180]eşdeğer aralıklarla döndürür (mod 360). Bu yerleşikler ...
Neil,

1
Ø°For 360ve “<¿‘for kullanımıyla yarım derece çalışarak iki bayttan tasarruf edin 60,11. ד<¿‘Iæ%Ø°AH Beğenildiği
Jonathan Allan

12 karakter söyleyecektim , ama Windows-1252'nin (ve birkaç diğer kodlamanın) bunu gerçekten 12 baytta kodlayabildiği ortaya çıktı. Çeşitli ASCII olmayan karakterler arasında Unicode olmayan tek bir kodlamanın hepsini kapsayacağını düşünmemiştim, ama görünüşe göre orada çok hatalıyım.
Thanatos

@Thanatos Kod-golf konusunda uzmanlaşmış bazı diller, her biri 1 baytta kodladıkları 256 karakter için kendi kod sayfalarına sahiptir. Jelly, bu özel kod sayfasıyla , onlardan biri . 05AB1E, Charcoal, MathGolf, Stax, vb. Özel kod sayfalarına sahip diğer dillerdir. Gerçekte çoğu Windows-1252'ye dayanıyor. :)
Kevin Cruijssen

4

MATL, 18 bayt

30*i5.5*-t360-|hX<

İki saat girişini ve ardından dakikayı kabul eder. Bu cevapla aynı yöntemi kullanır.

MATL Online'da deneyin

açıklama

      % Implicitly grab first input (hours)
30*   % Multiply by 30
i     % Explicitly grab second input (minutes)
5.5*  % Multiply by 5.5
-     % Take the difference
t     % Duplicate the result
360-  % Subtract 360
|     % Take the absolute value
h     % Horizontally concatenate
X<    % Determine the minimum value
      % Implicitly display the result

Bu, gece yarısı 180yerine başarısızlıkla sonuçlanmayacak 0mıydı?
Shaggy,

4

Wolfram Dili (Mathematica) , 30 29 28 bayt

5Abs@Mod[#.{6,-1.1},72,-36]&

Çevrimiçi deneyin!

ungolfed versiyonu:

Abs[Mod[#.{30,-5.5}, 360, -180]] &

İşlevin argümanı # = {h,m}saati ve dakikayı içerir. Bu uzunluk, iki liste, bir vektör ile nokta ürün olarak yorumlanır {30,-5.5}hesaplanır: #.{30,-5.5} = 30*h-5.5*m. Sonra, 360'ın simetrik modülünü Mod[#.{30,-5.5}, 360, -180]-180 .. + 180 aralığında bir açı vererek hesaplıyoruz . Absmutlak değerini alır.

İlgili tüm operatörler doğrusal olduğu için, görünen sayıları çoğaltabilir ve bölebiliriz, ancak en uygun olanı. İfadeden bir faktörü çekerek 5ve ifadedeki tüm sayıları 5'e bölerek, bayt sayısı en aza indirilir.


3

Simyacı , 134 bayt

_->In_h+In_m+720d+360a+f
h->60d
m+11d->
0m+d+a+0r->b
0a+0x->r
d+b+r->r+a
r+0b->
b+0d+0h+0y->5y
b+0d+5y->x
0b+0d+f->Out_x+Out_"."+Out_y

Çevrimiçi deneyin!

açıklama

_->In_h+In_m+720d+360a+f

İlk kurulum. Saati ve dakikayı girer hve mgeçerli açıyı d360 dereceye (720 yarım derece) ayarlar a, ana açıyı hesaplamak için ayarlar ve çıktı bayrağını ayarlar.

h->60d
m+11d->

Her saat 30 derece ekler ve her dakika 5.5 derece çıkarır.

0m+d+a+0r->b
0a+0x->r

Birlikte r(ters) bayrağı ayarlanmazsa, her datomu bir hareket gerekir aiçin atomu b. Bu, "yarış durumu" ndan kaçınmak için dakikalar tükendiğinde ortaya çıkar. aKalan atom yoksa, rbu akışı tersine çevirmek için ayarlayın .

Bu ikinci kuralın birden çok kez tetikleyebileceğini ve hatta ilk kurulum kuralından önce tetikleyebileceğini unutmayın. Bu hiçbir şeye zarar vermez, bu yüzden bunu önlemeye gerek yoktur. 0xGiriş 6:00, hiçbir vardır: durumu bir kenar durum işleme azaman atomuna programı sonlandırıldığında, ama orada xnihai sonucu, en az 1 derece ise atomu.

d+b+r->r+a
r+0b->

Tersi: İmzalı açı 180 dereceden büyük olduğunda, çıktısını azaltmak için batomları hareket ettirin a. Açı "360" değerine ulaştığında geri gitmeyi bırakın.

b+0d+0h+0y->5y
b+0d+5y->x

Dereceli atomların tamamı kullanıldığında, çıktısını almak için 2'ye bölün.

0b+0d+f->Out_x+Out_"."+Out_y

Bu yapıldıktan sonra f, ilk kurulumdaki bayrağı kullanarak tam olarak bir kez çıktı alın.


3

Python 3.8 (yayın öncesi) , 45 43 bayt

Erik sayesinde -2 bayt .

lambda h,m:min(x:=abs(h%12*30-m*5.5),360-x)

Çevrimiçi deneyin!

h%12- 12 saatlik formatta
h%12*30saat
m/2- tam saatte saat elinin açısı - saat elinin mdakika olarak hareket
h%12*30+m/2ettiği açı
m*6- saat elinin açı olarak mevcut konumu - dakika elinin açısı ( 360°/60 = 6°)




2

Kömür , 22 bayt

I↔⁻¹⁸⁰﹪⁻׳⁰⁺⁶N×⁵·⁵N³⁶⁰

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı bir versiyonudur. Girişi iki tamsayı olarak alır. Açıklama:

             N          First input
           ⁺⁶           Plus literal 6
        ׳⁰             Multiplied by literal 30
       ⁻                Minus
                  N     Second input
              ×⁵·⁵      Multiplied by literal 5.5
      ﹪            ³⁶⁰  Modulo literal 360
  ⁻¹⁸⁰                  Subtracted from literal 180
 ↔                      Absolute value
I                       Cast to string
                        Implicitly print

2

Perl 6 , 28 bayt

((*/3-*/9*.55+2)%4-2).abs*90

Çevrimiçi deneyin!

Diğer cevaplardan çalınan birkaç numara kullanır ve hesaplar

r = abs((h/3 - m/9*0.55 + 2) % 4 - 2) * 90
  = abs((h*30 - m*5.5 + 180) % 360 - 180)

2

Python 3 , 40 bayt

lambda h,m:180-abs(180-(h*30-m*5.5)%360)

Çevrimiçi deneyin!

h*30- öğlen ve hdakika olduğu saat arasındaki açı 0; saat 12 eşit veya daha büyük ise, bu açı eşit ya da 360 ° 'den büyük olabilir
m*6öğle ve dakika el arasındaki açı -
m*.5- açı saat ibresi sonra tam saat öne doğru hareket m(dakika, örneğin: Bu 4:24 ise, saat ibresi, saat 4 konumunda olduğu konumdan 12 derece ileri hareket etti.)
h*30-m*5.5- saat ibresi ve dakika ibresi arasındaki iki açıdan biri; katsayı mIS 5.5, çünkü m*6-m*.5=m*5.5; bu hala cevap değil çünkü 360 ° 'den büyük (örneğin: if h,m=13,0) veya 0 °' den küçük (örneğin: if h,m=12,30) olabilir
(h*30-m*5.5)%360- bu modülo, yukarıda hesaplanan değerin 0 ile 360 ​​° arasında olmadığı durumları dikkate alır; bu hala cevap değil, çünkü en darı istediğimizde, iki açının amperi olabilir
180-abs(180-(h*30-m*5.5)%360)- bu nihai sonuç; Genel kural, buna x-abs(x-y)eşdeğerdir ve min(y,x-y)bu da doğru sonucu verir.



1

Python 3, 58 57 Bayt

-1 / -2 @Shaggy sayesinde

h,m=eval(input())
x=(30*h-5.5*m)
print(abs(min(x,360-x)))

Naive uygulaması, şeklinde girdi alır [6,32]. Bazı baytlar özellikle son satırdan tıraş edilebilir.

Python 2, 52 50 Bayt

h,m=input()
x=(30*h-5.5*m)
print abs(min(x,360-x))

30*h-5.5*msana bir kaç bayt kurtarmalıyım.
Shaggy,

1
Bir defstil işlevi de bazı baytları kurtarmalıdır.
negatif yedi

meydan okuma ifadelerinden @negativeseven, stdin / stdout kullanıyormuş gibi görünüyordu
Theo

Parantezleri 2. satıra bırakabilirsiniz.
Shaggy,

Çözümlerin doğru çalışması için aslında birkaç değişikliğe (Python 2) ihtiyaç var. Sonuç 180'den küçük veya ona eşit ve 0'dan büyük veya 0'a eşit olmalıdır.
Outgolfer Erik,

1

Perl 5 -MList::Util=min -p , 37 bayt

$_=abs<>*5.5-$_%12*30;$_=min$_,360-$_

Çevrimiçi deneyin!

Birkaç byte kaydettiği için girişi saatlerce ve ardından dakikaları ayrı bir satırda alır.


TAMAM. Bunu düzeltdim.
Xcali


1

Japt , 16 bayt

*FÑ aV*5½
mUa360

Dene

*FÑ aV*5½     :Implicit input of integers U=h and V=m
*F            :Multiply U by 15
  Ñ           :Multiply by 2
    a         :Absolute difference with
     V*5½     :V multiplied by 5.5
mUa360        :Reassign to U
m             :Minimum of U and
 Ua360        :Absolute difference of U and 360

0

> <> , 17 bayt

b*$6a**-:0)12,-*n

Çevrimiçi deneyin! (6:32) Çünkü

Girdiyi istif üzerinde h, m olarak alır.

açıklama

b*$6a**-:0)12,-*n
b*                Multiplies m by 11
  $               Swaps m & h
   6a**           Multiplies h by 60
       -          Subtracts m & h (v)
        :0)       Checks if v > 0 (b=0/1)
           12,-   Subtracts .5 from b (-.5/.5)
               *  Multiplies v by b (halve & abs)
                n Outputs result
b*                Errors

0

05AB1E , 16 bayt

60*+5.5*D(‚360%ß

İlk giriş olarak saat, ikinci olarak dakika sürer.

Çevrimiçi deneyin veya tüm test durumlarını doğrulayın .

Açıklama:

Temel olarak aşağıdaki formülü uygular:

t=(60h+m)×5.5
r=min(tmod360,tmod360)

60*               # Multiply the (implicit) hours-input by 60
   +              # Add it to the (implicit) minutes-input
    5.5*          # Multiply it by 5.5
        D(‚       # Pair it with it's negative
           360%   # Take modulo-360 on both
               ß  # And then pop and push the minimum of the two
                  # (which is output implicitly as result)

0

Pyret, 59 bayt

{(h,m):x=(30 * h) - (m * 5.5)
num-abs(num-min(x,360 - x))}
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.