Mój budzik
Jestem Amerykaninem, podobnie jak mój (cyfrowy) budzik. Aby ustawić alarm, rozpoczyna się w momencie, w którym był wcześniej. Naciśnięcie przycisku godziny powoduje przesunięcie go o jedną godzinę w górę, a naciśnięcie przycisku minuty powoduje przesunięcie go o jedną minutę w górę. Wciśnięcie obu przycisków jednocześnie resetuje je do północy (12:00) i liczy się jako naciśnięcie dwóch przycisków.
Gdy godziny przekroczą limit (12), resetuje się do 1 i przełącza lampkę AM / PM. Gdy minuty przekroczą limit (59), resetują się do 0, bez wpływu na godziny.
Zadanie
Twoim zadaniem jest, biorąc pod uwagę czas rozpoczęcia i czas docelowy, wygenerowanie optymalnej liczby naciśnięć przycisków potrzebnych do ustawienia mojego alarmu na czas docelowy.
Możesz wprowadzać dane w dowolnym formacie, który najbardziej Ci odpowiada. Jedyne dane, których Twój program powinien potrzebować, to godziny i minuty dla obu danych wejściowych. Oznacza to, że na przykład możesz brać dane jako milisekundy od epoki i wyodrębniać godziny i minuty, ale nie możesz niczego zakodować w roku, miesiącu, drugim itd. Pamiętaj, że chociaż możesz na przykład wprowadzać dane za pomocą „czas wojskowy” (lub zwykły czas dla większości świata), ale to nie zmienia sposobu działania mojego zegara.
Przykłady
1:15 pm -> 2:30 am
Możesz nacisnąć oba przyciski, aby zresetować do godziny 12:00, a następnie zwiększyć ją do 2:30, co byłoby 2+2+30 = 34
naciśnięciem przycisku. Możesz także zwiększyć czas do 2:30, co byłoby 13+15 = 28
naciśnięciem przycisku. Dlatego twój wynik to 28
.
3:58 am -> 4:02 am
Możesz zresetować i zwiększyć, co byłoby 2+4+2 = 8
naciśnięciem przycisku. Możesz także zwiększać, czyli naciskać 1+4 = 5
przyciski. Dlatego twój wynik to 5
.
10:55 pm -> 1:00 am
Możesz zresetować i zwiększyć, co byłoby 2+1 = 3
naciśnięciem przycisku. Możesz także zwiększać, czyli naciskać 3+5=8
przyciski. Dlatego twój wynik to 3
.
1:00 am -> 1:59 pm
Możesz resetować i zwiększać, ale byłoby to o trzy kolejne naciśnięcia więcej niż zwiększanie. Dlatego twój wynik to 12+59 =
71
.
Przypadki testowe
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
źródło
Odpowiedzi:
Łuska , 16 bajtów
Wypróbuj online!
Traktuje argumenty jako dwie listy [godziny, minuty] dla godziny rozpoczęcia i zakończenia w formacie 24-godzinnym.
Bardzo się cieszę z tego, jak bardzo mogłem zagrać w golfa. Ciekawe jest, w jaki sposób argumenty są zarządzane w tym składzie funkcji.
Funkcja, która oblicza, ile naciśnięć klawiszy potrzebujemy, jeśli resetowanie nie jest dozwolone, jest następująca:
Interesujące jest to, że ponieważ reszta tego rozwiązania może działać tylko z jedną listą jako argumentem, ta część zostaje częściowo zastosowana do pierwszego argumentu całego programu, „jedząc” go i pozostawiając tylko drugi argument widoczny zarówno dla siebie, jak i reszta programu.
Następnie obliczamy, ile naciśnięć klawiszy potrzebujemy, jeśli zresetujemy czas do 0:00
Jak powiedziano wcześniej, działa to tylko na podstawie drugiego argumentu (czasu ostatecznego) i oblicza
hours+minutes+2
, po prostu w golfistyczny sposób.Wreszcie
§▼
jest część, która przekazuje drugi argument do obu funkcji i zwraca mniejszy z dwóch wyników.źródło
JavaScript (ES6),
7356545250 bajtówUżywa formatu 24-godzinnego. Pobiera dane wejściowe jako 4 liczby całkowite reprezentujące godziny i minuty za każdym razem.
Spróbuj
Wprowadź godziny w formacie 24-godzinnym, używając
:
separatora.Wyjaśnienie
(Wkrótce zostanie zaktualizowany.)
Funkcja anonimowość przy liczby całkowite jako argumenty za pomocą parametrów
g
,l
,h
im
, w którymg
il
są odpowiednio godziny i minuty aktualnego czasu ih
im
są godziny i minut czasu docelowego.Najpierw obliczamy, ile naciśnięć przycisków jest potrzebnych, jeśli po prostu zresetujemy zegar, który jest po prostu 2 (dla resetu) plus docelowa godzina i docelowa minuta.
Następnie obliczamy, ile naciśnięć przycisków potrzeba, aby osiągnąć docelową godzinę. Robimy to, odejmując bieżącą godzinę od godziny docelowej. Jeśli jednak bieżąca godzina jest mniejsza niż docelowa, da nam to liczbę ujemną, więc korygujemy to, dodając 24 pomnożone przez sprawdzenie, czy
h<g
(co zwraca wartość logiczną, ale jest domyślnie rzutowane na liczbę całkowitą1
, jeśli jest prawdą lub0
jeśli jest fałszem przez operacje matematyczne.Używamy podobnej formuły, aby obliczyć liczbę naciśnięć, aby przejść od bieżącej minuty do minuty docelowej i dodać ją do naciśnięć godzinowych.
Wreszcie otrzymujemy minimum 2 liczby, które dają nam nasz wynik.
źródło
(h-g+24)%24+(m-l+60)%60
?Pyth , 29 bajtów
To wyzwanie oczywiście nie jest korzystne dla języków golfowych, dlatego jest tak długie. Z drugiej strony poprawia to fakt, że Pyth jest oparty na Pythonie, więc możemy nadużywać jego ujemnego modułu.
Pakiet testowy. Liczby w Pyth nie obsługują zer wiodących.
źródło
Galaretka , 19 bajtów
Wypróbuj online!
Wprowadź 4 liczby całkowite (godzina końcowa, minuta końcowa, godzina początkowa, minuta początkowa)
źródło
C # (.NET Core) , 56 bajtów
Wypróbuj online!
Bardzo podobny do odpowiedzi Javascript. Bools w C # nie przekształcają się łatwo w liczby, więc zamiast tego
[diff]+24*(H<h)
zrobiłem to,([diff]+24)%24
co robi to samo.źródło
2+h+m
-2 bajtów.(H,M,h,m)=>Math.Min((h+24-H)%24+(m+60-M%60),2+h+m)
System.Math.Min
?Haskell, 41 bajtów
Całkiem proste. Pobiera dane wejściowe jako cztery argumenty przy użyciu 24-godzinnego czasu: godzina zakończenia, minuta zakończenia, godzina rozpoczęcia, minuta rozpoczęcia.
źródło
Python 3 , 43 bajty
Wypróbuj online!
Wprowadź 4 liczby całkowite (godzina początkowa, minuta początkowa, godzina końcowa, minuta końcowa)
źródło
2 01 11 00
? W swojej odpowiedzi, jak określić, czy jest czasAM
lubPM
, jeśli nie ma to jak wejście?13
to wejście za pomocą TIO, co jest poprawne (reset + 11 <9 + 59).%
zawsze zwraca liczbę dodatnią w Pythonie?%
.1%24
=1
,1%-24
=-23
. Jest to bardzo pomocne w przypadku tego pytania.Java 8,
5450 bajtówPort odpowiedzi C # @KamilDrakari (po tym, jak grałem w golfa
26 bajtów).Wyjaśnienie:
Wypróbuj tutaj.
źródło
Perl 5 , 71 +2 (-ap) = 73 bajty
Wypróbuj online!
Pobiera dane w formacie 24-godzinnym (czas wojskowy), oddzielone spacjami, czas rozpoczęcia pierwszy, czas zakończenia drugi: GG MM GG mm
źródło
Siatkówka , 106 bajtów
Wypróbuj online! Link zawiera przypadki testowe. Pobiera dane wejściowe jako bieżące i pożądane czasy w regularnym czasie 24-godzinnym z odstępem oddzielającym dwa razy. Wyjaśnienie:
Konwertuj na unary.
To robi dwie rzeczy; dodaje 24 godziny i 60 minut do pożądanych godzin i minut, a także dodaje 2 do sumy oryginalnych pożądanych godzin i minut, tj. liczby naciśnięć przycisków, które należy ustawić za pomocą resetu.
Odejmij bieżące godziny od żądanych godzin i odejmij 24, które dodaliśmy, jeśli możemy.
Podobnie dla minut. To dodaje również dwa wyniki razem.
Jeśli liczba naciśnięć, które należy ustawić przy użyciu bieżącego czasu, jest większa niż liczba naciśnięć, które należy ustawić za pomocą resetu, usuń go.
Przekształć pierwszą pozostałą liczbę z powrotem na dziesiętną.
źródło