Alarm Optimizasyonu


28

Alarm Saatim

Ben Amerikalıyım ve (dijital) alarm saatim de öyle. Alarmı kurmak için önceden olduğu zaman başlar. Saat düğmesine basmak bir saat yukarı, dakika düğmesine basmak bir dakika yukarı hareket ettirir. Her iki düğmeye aynı anda basmak, gece yarısına (12:00 am) sıfırlar ve iki düğmeye basıldığında sayılır.

Saatler kapağını (12) aştığında, 1'e sıfırlanır ve AM / PM ışığını değiştirir. Dakikalar kendi sınırlarını (59) aştığında, saatleri etkilemeden 0'a sıfırlar.

Görev

Göreviniz, bir başlangıç ​​zamanı ve bir hedef zaman verildiğinde, alarmımı hedef zamana ayarlamak için gereken en uygun sayıda düğmeye basmaktır.

Size en uygun formatta girdi alabilirsiniz. Her iki giriş için programınızın ihtiyaç duyduğu tek veri saat ve dakikadır. Bu, örneğin, çağdan beri milisaniye olarak veri alabileceğiniz ve saat ve dakikaları ayıklayabileceğiniz, ancak yıl, ay, saniye vb. Hiçbir şeyi kodlayamayacağınız anlamına gelir . “askeri zaman” (ya da dünyanın çoğu için normal zaman), ancak bu saatimin çalışma şeklini değiştirmiyor.

Örnekler

1:15 pm -> 2:30 am

Her iki düğmeyi de saat 12: 00'ye sıfırlamak için aşağı bastırabilir, ardından saat 2: 30'a yükseltebilirsiniz, bu 2+2+30 = 34düğme düğmesine basılır. Ayrıca 2: 30'a kadar yükseltebilirsiniz, bu 13+15 = 28düğme basar. Bu nedenle çıktınız 28.

3:58 am -> 4:02 am

2+4+2 = 8Düğmeye basacak olan sıfırlama ve artırma işlemlerini yapabilirsiniz . Ayrıca, 1+4 = 5düğmesine basacak olan artışı da artırabilirsiniz. Bu nedenle çıktınız 5.

10:55 pm -> 1:00 am

2+1 = 3Düğmeye basacak olan sıfırlama ve artırma işlemlerini yapabilirsiniz . Ayrıca, 3+5=8düğmesine basacak olan artışı da artırabilirsiniz. Bu nedenle çıktınız 3.

1:00 am -> 1:59 pm

Sıfırlayabilir ve artırabilirsiniz, ancak bu sadece artıştan ziyade üç baskı olacaktır. Bu nedenle çıktınız 12+59 = 71.

Test Kılıfları

Current  Target   = Output
1:15pm   2:30am   = 28
3:58am   4:02am   = 5
10:55pm  1:00am   = 3
1:00am   1:59pm   = 71
12:00am  12:00am  = 0
6:51pm   12:00am  = 2
2:01pm   11:00pm  = 25
2:01pm   11:01pm  = 9
12:59am  12:01am  = 2
11:50am  12:00pm  = 11


13
Kutsal bok! İki düğmeye basmak (Avrupa) alarm saatimi 0:00 'a da ayarlıyor ... Tüm bu yıllar düğmelere çok fazla basmakla geçti ... O_o
Arnauld

8
"askeri zaman (veya dünyanın çoğu için normal zaman)" ... ... aradığınız terim "24 saat".
Jakob

12
@ Jakob Hayır, aradığı terim "normal süre" dir. Amerikalılar düzensiz zamanlar, düzensiz tarihler, düzensiz birimler vb.
Neil

1
@StepHen İngiltere'deyim ve Jakob bunu söyleyene kadar "askeri zaman" derken neyi kastettiğinizi bilmiyordum. 24 saat benim için mükemmel bir anlam ifade ediyor
Darren H

Yanıtlar:


5

Kabuğu , 16 bayt

§▼ṁ→(Σz%e24 60z-

Çevrimiçi deneyin!

Argümanları 24h formatında, başlangıç ​​ve bitiş zamanı için iki liste [saat, dakika] olarak alır.

Bunun ne kadarını golf oynadığıma çok sevindim, bu fonksiyonların bileşiminde argümanların nasıl yönetildiğini ilginç buluyorum.

Sıfırlama işlemine izin verilmemesi durumunda ne kadar tuşa basacağımızı hesaplayan işlev aşağıdaki gibidir:

Σz%e24 60z-
         z-    elementwise subtract the two times
 z%e24 60      take the hours difference modulo 24 and the minutes difference modulo 60
Σ              sum the two resulting numbers

İşin ilginç yanı, bu çözümün geri kalanının sadece argüman olarak tek bir liste ile çalışabilmesi nedeniyle, bu uygulamanın tüm programın ilk argümanına kısmen uygulandığı, “yediği” ve sadece ikinci argümanı hem kendisi hem de görünür hale getirdiğidir. programın geri kalanı.

Sonra, saati 0: 00'a sıfırlarsak kaç tuşa ihtiyacımız olduğunu hesaplıyoruz.

ṁ→    take the sum of each element of the list increased by 1

Daha önce de belirtildiği gibi, bu sadece ikinci argümanla (son kez) çalışır ve hours+minutes+2sadece golfçü bir şekilde hesaplanır.

Son olarak, §▼ikinci argümanı her iki fonksiyona da ileten ve iki sonucun daha azını veren kısımdır.


8

JavaScript (ES6), 73 56 54 52 50 bayt

24 saat formatını kullanır. Her zamanın saat ve dakikalarını gösteren 4 tamsayı olarak girdi alır.

(g,l,h,m)=>Math.min(2+h+m,(h-g+24)%24+(m-l+60)%60)
  • Arnauld sayesinde 2 bayt kaydedildi .

Dene

:Ayırıcı ile süreleri 24 saatlik biçimde girin .

o.innerText=(f=

(g,l,h,m)=>Math.min(2+h+m,(h-g+24)%24+(m-l+60)%60)

)(+(x=(i.value="01:00").split`:`)[0],+x[1],+(y=(j.value="13:59").split`:`)[0],+y[1]);oninput=_=>o.innerText=f(+(x=i.value.split`:`)[0],+x[1],+(y=j.value.split`:`)[0],+y[1])
label,input{font-family:sans-serif;font-size:14px;height:20px;line-height:20px;vertical-align:middle}input{margin:0 5px 0 0;width:100px;}
<label for=i>Current: </label><input id=i type=time><label for=j>Target: </label><input id=j type=time><pre id=o>


açıklama

(Kısa süre içinde güncellenecek.)

(g,l,h,m)=>

Parametreleri ile argümanlar olarak tamsayılar alarak Anonim fonksiyonu g, l, h& m, nerede gve l, sırası ile, saat ve şimdiki zamanın dakikalar ve h& msaat & Hedef zamanın dakika uzaklıktadır.

2+h+m

Öncelikle, saati yalnızca sıfırlarsak (sıfırlama için) artı hedef saati ve hedef dakikayı sadece sıfırladığımızda kaç düğmeye basılması gerektiğini hesaplıyoruz.

h-g+24*(h<g)

Daha sonra, hedef saate ulaşmak için kaç düğmeye basılması gerektiğini hesaplıyoruz. Bunu mevcut saati hedef saatten çıkararak yapıyoruz. Bununla birlikte, eğer mevcut saat hedefin altındaysa, bu bize negatif bir sayı verir, bu yüzden eğer h<g(bir boolean döndürür, ancak tamsayıya 1, doğru ise ya 0da yanlışsa tamsayıya dolaylı olarak aktarılır) kontrol ederek 24 çarparak düzeltmeyi düzeltiriz. matematiksel işlemler.

+m-l+60*(m<l)

Şu anki dakikadan hedef dakikaya kadar alınacak pres sayısını hesaplamak için benzer bir formül kullanıyoruz ve bunu saat preslerine ekliyoruz.

Math.min()

Sonunda, bize sonucumuzu vermek için en az 2 rakamı alıyoruz.


1
Yapabileceğin (h-g+24)%24+(m-l+60)%60?
Arnauld,

7

Pyth , 29 bayt

Bu meydan okuma elbette golf dillerini kullanmıyor, bu yüzden bu kadar uzun. Öte yandan, Pyth Python tabanlı olduğu için bu durum iyileştirilir, bu yüzden negatif modülünü kötüye kullanabiliriz.

hS,+%-eQ@Q1 60%-@Q2hQ24+2s>Q2

Test odası. Pyth içindeki sayılar, baştaki sıfırları desteklemez.



3

C # (.NET Core) , 56 bayt

(H,M,h,m)=>Math.Min(((h+24-H)%24)+((m+60-M)%60),(2+h+m))

Çevrimiçi deneyin!

Javascript cevabına çok benzer. C # 'daki Bools kolayca sayılara dönüşmez, bu yüzden [diff]+24*(H<h)ben de ([diff]+24)%24aynı şeyi yapan şeyi yaptım.


Parantezin etrafını 2+h+m-2 baytlık kaldırabilirsiniz
Kevin Cruijssen

Cevabınızın Java 8’inde bir bağlantı noktası oluşturdum ve daha fazla parantezi kaldırarak ek bir dört baytlık golf oynayabileceğinizi fark ettim(H,M,h,m)=>Math.Min((h+24-H)%24+(m+60-M%60),2+h+m)
bununla

1
Bunu yapmak zorunda değil misin System.Math.Min?
LiefdeWen

3

Haskell, 41 bayt

(a#b)c d=min(a+b+2)$mod(a-c)24+mod(b-d)60

Oldukça basit. 24 saatlik süreyi kullanarak girişi dört argüman olarak alır: bitiş saati, bitiş dakikası, başlangıç ​​saati, başlangıç ​​dakikası.


2

Python 3 , 43 bayt

lambda a,b,c,d:min((c-a)%24+(d-b)%60,2+c+d)

Çevrimiçi deneyin!

4 tam sayı olarak giriş yapın (başlangıç ​​saati, başlangıç ​​dakika, bitiş saati, bitiş dakika)


@StepHen Whoops. Kolay tamir
HyperNeutrino,

Başarısız2 01 11 00 mı? Cevabınıza göre, zamanın AMPM, yoksa giriş olarak mı almadığınızı nasıl belirlersiniz ?
Bay Xcoder

@ Mr.Xcoder; 13Bu girişi, doğru olan TIO kullanarak alıyorum (sıfırlama + 11 <9 + 59).
Shaggy

2
Does %hep Python pozitif sayı döndürür?
Shaggy

4
@Shaggy her zaman sağ tarafının işaretini döndürür %. 1%24= 1, 1%-24= -23. Bu soru için çok faydalı.
Stephen

2

Java 8, 54 50 bayt

(h,m,H,M)->Math.min((H-h+24)%24+(M-m+60)%60,H+M+2)

Port @KamilDrakari 'ın C # cevap (ı golfed sonra 2 6 bayt).

Açıklama:

Burada dene.

(h,m,H,M)->       // Method with four integer parameter and integer return-type
  Math.min(       //  Return the lowest of the following two:
                  //   The hours:
   (H-h           //    Second hours - first hours inputs
       +24)       //    +24 so we won't have negative numbers
           %24    //    mod-24 to get the hours
   +              //   And add the minutes:
    (M-m          //    Second minutes - first minutes inputs
         +60)     //    +60 so we won't have negative numbers
             %60  //    mod-60 to get the minutes
    ,H+M          //  And compare it to the second hours + second minutes inputs
        +2)       //   +2 for the added +24 and +60 to get the positive modulo arguments

1

Perl 5 , 71 + 2 (-ap) = 73 bayt

($w,$x,$y,$z)=@F;$_=($r=2+$y+$z)>($c=($y-$w+24)%24+($z-$x+60)%60)?$c:$r

Çevrimiçi deneyin!

24 saatlik formatta (askeri saat) girdi alır, boşlukla ayrılır, ilk önce başlangıç ​​zamanı, ikinci bitiş zamanı: HH MM ss mm


1

Retina , 106 bayt

\d+
$*
 (1*):(1*)
 24$*1$1:60$*1$2#11$1$2
(1*):(1* )\1(1{24})?
$2
(1*) (1*):\1(1{60})?
$2
(1+)#(?!\1)

\G1

Çevrimiçi deneyin! Link, test durumlarını içerir. İki saati ayıran bir boşlukla normal 24 saatlik sürede girişi geçerli ve istenen zamanlar olarak alır. Açıklama:

\d+
$*

Birliğe dönüştür.

 (1*):(1*)
 24$*1$1:60$*1$2#11$1$2

Bu iki şey yapar; istenen saat ve dakikalara 24 saat ve 60 dakika ekler ve ayrıca istenen orijinal saat ve dakikaların toplamına 2 ekler, yani bir sıfırlama kullanarak ayarlamak için düğmeye basma sayısı.

(1*):(1* )\1(1{24})?
$2

Mevcut saatleri istenen saatlerden çıkarın ve eğer ekleyebildiğimiz 24'ü de çıkar.

(1*) (1*):\1(1{60})?
$2

Aynı şekilde dakikalarca. Bu aynı zamanda iki sonucu bir araya getirir.

(1+)#(?!\1)

Geçerli saati kullanarak ayarlanacak pres sayısı, sıfırlama kullanılarak ayarlanacak pres sayısından fazlaysa, silin.

\G1

Kalan ilk sayıyı tekrar ondalık sayıya dönüştürün.

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.