Symuluj mój głupi stary budzik

25

Mam głupi stary budzik z dwoma przyciskami: houri minute. ThehourPrzycisku zwiększa godzinę zestawu alarmu, a minuteprzyrosty czasu minutowego zestawu alarmu. Jednak niektóre inteligentne projektanci sobie sprawę, że naciśnięcie obu przycisków jednocześnie powinno mieć znaczenia, i zdecydował, że naciśnięcie houri minutejednocześnie spowodowałoby alarm ma być ustawiony na 12:00 am/ 0:00. Twoim zadaniem jest symulacja tego zachowania.

Zadanie

Biorąc pod uwagę czas rozpoczęcia i sekwencję stanów przycisków, określ czas zakończenia.

Począwszy od godziny rozpoczęcia, zwiększ godzinę dla każdego wystąpienia (1,0), zwiększ minutę dla każdego wystąpienia (0,1)i ustaw czas na0:00 dla każdego wystąpienia (1,1). Stany (0,0)należy zignorować, ponieważ odpowiadają one naciśnięciu żadnego przycisku.

Przy dodawaniu do minut i godzin, jeśli minuta / godzina przekracza maksimum, ustaw ją na 0, tzn. Zwiększając wartość minuty, 59należy ustawić wartość minuty na, 0a zwiększając wartość godziny, 23należy ustawić wartość godziny na 0. Zwiększanie wartości minut / godzina powyżej ich granic nie mają wpływu na inne wartości, na przykład zwiększając minutę 10:59wydajności 10:00nie 11:00.

Przykład

Biorąc pod uwagę czas 13:58i kroki wejściowe [(0,1),(0,1),(0,1),(0,0),(1,1),(1,0)],

  1. (0,1). To odpowiada minutenaciśnięciu. Czas jest teraz 13:59.
  2. (0,1). To odpowiada minutenaciśnięciu. Czas jest teraz 13:00.
  3. (0,1). To odpowiada minutenaciśnięciu. Czas jest teraz 13:01.
  4. (0,0). Odpowiada to naciśnięciu żadnego przycisku. Czas, bez zmian, jest teraz13:01
  5. (1,1). Odpowiada to naciśnięciu obu przycisków. Czas jest teraz 0:00.
  6. (1,0)To odpowiada hournaciśnięciu. Czas jest teraz 1:00.

Ponieważ kończymy 1:00, jest to wynik.

I / O

Dane wejściowe będą składały się z czasu i sekwencji stanów przycisków. Wyjście jest jednorazowe.

Czas wejściowy i czas wyjściowy mogą być

  • 2-krotnym (hour, minute)lub (minute, hour)w 24godzinny czas, takich jak (13, 30)( hourwaha się od 0celu 23i minutewaha się od 0się 59)
  • taki sam jak poprzedni, lecz w 12godzinny czas i logiczna am/ pmwyłącznik ( hourw zakresie od 0do 11lub 12i 1do 11z minutez 0z 59).
  • liczba minut od 0:00takich jak 810 (od 0 do 1439 włącznie)
  • każdy inny format, który koduje te same informacje

Sekwencja stanów przycisków jest reprezentacją listy logicznych 2-krotek, na przykład:

  • lista krotek: [(0,1),(1,0),(0,0),(1,1)]
  • ciąg rozdzielany spacjami: "01 10 00 11"
  • ciąg: "01100011"
  • w czwartorzędu: [1,2,0,3]
  • przekonwertowane na liczbę całkowitą: 99
  • każdy inny format, który koduje te same informacje

Przypadki testowe

time,steps -> output
06:49,[(0, 1)] -> 06:50
12:23,[(1, 0)] -> 13:23
02:23,[(0, 1), (1, 0)] -> 03:24
21:40,[(0, 1), (0, 1), (0, 1), (0, 1)] -> 21:44
13:10,[(0, 1), (0, 1), (0, 1), (0, 1), (1, 0), (1, 1), (0, 1), (0, 1)] -> 00:02
21:33,[(1, 0), (0, 1), (1, 0), (0, 1)] -> 23:35
14:21,[(0, 1), (0, 1), (0, 1)] -> 14:24
02:39,[(0, 0), (0, 1)] -> 02:40
16:07,[(0, 1), (0, 1), (0, 1), (0, 1), (1, 0), (1, 0), (0, 1), (0, 1), (1, 0), (0, 1), (0, 1), (0, 1)] -> 19:16
17:55,[(0, 1), (1, 0), (0, 1)] -> 18:57
15:55,[(1, 0), (1, 0), (1, 0), (0, 1), (0, 1), (0, 1), (1, 0), (1, 0), (0, 1), (1, 0), (1, 0), (0, 1), (1, 0)] -> 23:00
22:11,[(0, 1), (1, 0), (0, 1), (0, 1), (0, 1), (0, 1), (0, 1), (1, 0), (0, 1), (0, 1)] -> 00:19
03:58,[(1, 0), (0, 0), (0, 0), (0, 1), (0, 1), (1, 0), (1, 0), (0, 1), (0, 1), (1, 0), (0, 1)] -> 07:03
13:02,[(0, 1), (1, 0), (0, 1), (1, 0), (0, 1), (0, 1), (1, 0)] -> 16:06
04:37,[(1, 0), (0, 1), (0, 1), (0, 1), (0, 1), (0, 1), (0, 1), (0, 1), (0, 1), (1, 0), (0, 1), (1, 0), (0, 1), (1, 0)] -> 08:47
00:01,[(0, 1), (1, 0), (1, 0), (0, 1), (0, 1), (0, 1), (1, 0), (0, 1), (0, 1), (0, 1)] -> 03:08
02:58,[(1, 0), (1, 0), (0, 1)] -> 04:59
01:43,[(0, 1), (0, 1), (1, 0), (0, 1), (0, 1), (0, 1), (0, 1), (0, 1), (1, 0), (0, 1), (1, 0), (0, 1)] -> 04:52
07:54,[(1, 0), (0, 1), (1, 0), (1, 0), (1, 1)] -> 00:00
09:33,[(0, 1), (0, 1), (0, 1), (1, 0), (0, 1), (0, 1)] -> 10:38
09:01,[(0, 1), (0, 1)] -> 09:03
19:04,[(0, 1), (1, 0), (0, 1), (1, 0)] -> 21:06
11:17,[(0, 1), (1, 0), (0, 1), (0, 1), (1, 0), (0, 1), (0, 1), (1, 1), (0, 1), (0, 1)] -> 00:02
19:32,[(0, 1), (1, 0), (0, 1), (1, 0), (1, 0), (1, 0)] -> 23:34
17:31,[(0, 1), (0, 1), (0, 1), (1, 0), (0, 1), (1, 0), (0, 1), (0, 0), (1, 1), (0, 1)] -> 00:01
06:46,[(0, 1), (0, 1), (0, 1), (0, 1), (1, 0), (0, 1), (0, 1), (0, 1), (0, 1), (0, 1), (0, 1), (1, 0), (0, 1), (0, 1), (1, 0), (1, 0), (0, 1), (0, 1), (0, 1), (1, 0), (1, 0), (0, 1), (0, 1), (0, 1), (1, 0), (0, 1), (1, 0), (0, 1), (0, 1), (1, 0), (0, 1), (0, 1), (0, 1), (1, 0), (1, 0), (0, 1), (1, 0), (0, 1), (0, 1), (0, 1), (0, 1), (0, 1)] -> 18:16
fireflame241
źródło
4
Mocno spokrewnione
Stephen
Czy dopuszczalny jest format wejściowy dwóch zestawów danych jako jednej listy? Na przykład [[initialHour, initialMinute], [hourPressed1, minuitePressed1], [hourPressed2, minuitePressed2], ...]?
Jonathan Allan
@JathanathanAllan Tak.
fireflame241
Co 1200am oznacza w normalnym czasie cyfrowym?
Ferrybig

Odpowiedzi:

8

Galaretka , 13 bajtów

_`+Ạ}?/%24,60

Wypróbuj online!

Erik the Outgolfer
źródło
Uwaga, nie jestem pewien, czy możemy po prostu skorzystać z tego formatu wejściowego (zapytałem), ponieważ OP stwierdza „Sekwencja stanów przycisków jest reprezentacją listy”.
Jonathan Allan
@JonathanAllan, jeśli tak, to OP skomentuje moją odpowiedź, ale używam dokładnie formatu użytego w komentarzu ... czasami OP jest leniwy lub zapomniał zaktualizować wyzwanie
Erik Outgolfer
6

C, 89 87 bajtów

Dzięki @Jonathan Frech za uratowanie dwóch bajtów!

f(h,m,s)char*s;{for(;*s;++s)*s++&1?*s&1?h=m=0:++h:*s&1&&++m;printf("%d %d",h%24,m%60);}

Wypróbuj online!

Steadybox
źródło
6

Galaretka ,  21 lat  (17?) 19 bajtów

17 bajtów? - Jeśli format wejściowy:[[initHour, initMinute], [a1, b1], [a2, b2], ...] jest akceptowalny, mamy link monadyczny i możemy go usunąćW; z początku drugiej linii.

Uwaga: To jest teraz zbieżne w kierunku odpowiedzi Galaretki Outgolfersów , więc nie będę więcej zawracał sobie głowy golfem (nie widziałem tego) ...

N⁹⁹Ạ¤?+⁸
W;ç/%24,60

Dynamiczny link przyjmujący listę czasu początkowego jako liczby całkowite [hour, minute](24-godzinne) po lewej stronie oraz listę stanów przycisków [[hourPressed, minPressed], ...]po prawej stronie,
która zwraca listę czasu wyniku końcowego jako liczby całkowite, ponownie[hour, minute] (24-godzinne).

Wypróbuj online! lub zobacz zestaw testowy

W jaki sposób?

N⁹⁹Ạ¤?+⁸ - Link 1, nextState: list, currentState [cH, cM]; list, presses [pH, pM]
     ?   - if:
    ¤    - ...condition: nilad followed by link(s) as a nilad:
  ⁹      -   chain's right argument, presses
   Ạ     -   all truthy? (1 for [1,1] 0 otherwise)
N        - ...then: negate (the left argument, currentState, i.e. [-cH, -cM])
 ⁹       - ...else: chain's right argument, presses
       ⁸ - chain's left argument, currentState
      +  - add
           i.e.: if presses was [1,1] then [cH+-cH,cM+-cM]=[0,0]
                 otherwise [cH+pH,cM+cM]

W;ç/%24,60
     24,60 - literal list of integers [24,60]
    %      - modulo by (vectorises)
Jonathan Allan
źródło
-1 bajt , zastępując ⁹Ạ¤w Ạ}. Kolejne -2 za użycie dozwolonego formatu. Wreszcie kolejny -1, ponieważ łańcuch przed µtutaj nazywa się diadem.
Erik Outgolfer
6

Python 2 , 84 75 bajtów

lambda c,a:reduce(lambda(h,m),(d,e):(d&e)and(0,0)or((h+d)%24,(m+e)%60),a,c)

Wypróbuj online!

Funkcja, która zajmuje czas jako krotkę (godzina, minuta); wyjścia w ten sam sposób.

Chas Brown
źródło
-3 bajty przy użyciu all(b)zamiast b[0]&b[1]:lambda c,a:reduce(lambda t,b:all(b)and((t[0]+b[0])%24,(t[1]+b[1])%60)or(0,0),a,c)
Erik Outgolfer
73 bajty
Halvard Hummel
lambda(h,m),(d,e):czy ten wzór pasuje do Pythona !?
Quelklef
5

Siatkówka , 75 bajtów

.*,1:1
:
\d+
$*
O`\D1*
,

1>`:

+`1{24}:|:1{60}
:
(?<=^|:)1*
$.&
\b\d\b
0$&

Wypróbuj online! Link zawiera przypadki testowe. Wyjaśnienie:

.*,1:1
:

Usuń wszystko aż do ostatniego podwójnego naciśnięcia przycisku, zastępując go pustym czasem (w przypadku, gdy jest to ostatnie naciśnięcie przycisku).

\d+
$*

Konwertuj na unary.

O`\D1*

Posortuj minuty do końca.

,

Dodaj godziny razem.

1>`:

Dodaj minuty do siebie, ale oddziel godziny.

+`1{24}:|:1{60}
:

Zmniejsz odpowiednio godziny i minuty modulo 24 lub 60.

(?<=^|:)1*
$.&

Konwertuj na dziesiętny.

\b\d\b
0$&

Sformatuj do dwóch cyfr.

Neil
źródło
4

Python 3, 135 117 115 bajtów

-20 bajtów dzięki Jonathanowi Frechowi

def a(m,f):
 for b,c in f:
  if b&c:m=[0,0]
  elif b:m[0]=-~m[0]*(m[0]<23)
  elif c:m[1]=-~m[1]*(m[1]<59)
 return m

Wypróbuj online!

Poświęca czas jako listę w formularzu [hour, minute].

LyricLy
źródło
Możesz być w stanie wymienić (m[0]+1)z -~m[0]i if m[0]<23 else 0z *(m[0]<23).
Jonathan Frech,
Również, jak bi czawsze są wartości logiczne, można zastąpić b+c>1z b&c.
Jonathan Frech,
76 bajtów (Skrócony link, ponieważ TIO jest zbyt duży dla pola komentarza)
Halvard Hummel
4

Haskell , 58 bajtów

foldl(#)
_#(1,1)=(0,0)
(h,m)#(x,y)=(mod(h+x)24,mod(m+y)60)

Wypróbuj online! Przykładowe zastosowania: foldl(#) (23,58) [(0,1),(1,0),(0,0),(0,1),(0,1)].

Laikoni
źródło
4

JavaScript (ES6), 55 bajtów

t=>a=>a.map(x=>x>2?t=[0,0]:t[x-1]++)&&[t[0]%60,t[1]%24]

Pobiera dane wejściowe w składni curry, z czasem rozpoczęcia w postaci tablicy [min, hour] a kroki jako tablicą czwartorzędową. Czas wyjściowy ma taki sam format jak czas wejściowy.

Przypadki testowe

Justin Mariner
źródło
3

Perl 6 , 40 bajtów

{.reduce({(@^a Z+@^b)X*!@b.min})Z%24,60}

Wypróbuj online!

Pobiera listę zawierającą czas rozpoczęcia, a następnie naciśnięcia przycisków. Zwraca czas zakończenia. Czasy i przyciski są (hour, minute)parami. 24 godziny.

nwellnhof
źródło
3

Perl 5 , 70 bajtów

69 bajtów kodu + 1 dla -nflagi

s/.*d/0:0/;/(.*):(\d+)/;printf"%02d:%02d",($1+y/c//)%24,($2+y/b//)%60

Wypróbuj online!

Format wejściowy

hh:mm,abcdabcdabcdaddccbbaa

gdzie:

hh=start hour
mm=start minute
 a = (0, 0) = no buttons pressed
 b = (0, 1) = minute button pressed
 c = (1, 0) = hour button pressed
 d = (1, 1) = both buttons pressed

Odstępy lub inne separatory między prasami są nieznaczne.

Wyjaśnienie

s/.*d/0:0/;    # If both buttons were ever pressed, previous presses
               # don't matter.  Get rid of them and set start time to midnight.
/(.*):(\d+)/;  # Extract start hour and minute
printf"%02d:%02d",            # Output numbers with leading 0
($1+y/c//)%24,                # Take starting hour, add number of presses, remainder 24
($2+y/b//)%60                 # Take starting minute, add number of presses, remainder 24
Xcali
źródło
3

Szybki , 106 96 bajtów

-10, dzięki Xcoder

func x(m:(Int,Int),n:[(Int,Int)]){let i=n.reduce(m){($0.0+$1.0,$0.1+$1.1)};print(i.0%24,i.1%60)}

Wypróbuj na ideone!

funkcja pobierze wartość początkową i tablicę krotek i zwróci czas końcowy.

Naresh
źródło
96 bajtów , drukując na standardowe wyjście Zamiast: func x(m:(Int,Int),n:[(Int,Int)]){let i=n.reduce(m){($0.0+$1.0,$0.1+$1.1)};print(i.0%24,i.1%60)}. To się też pozbywa typealias.
Pan Xcoder,
1
Przy okazji, witamy w PPCG! Niesamowita pierwsza odpowiedź.
Pan Xcoder,
dziękuję bardzo, właściwie najpierw użyłem print () ... ale zapomniałem po przełączeniu między różnymi implementacjami. Jeszcze raz dziękuję za pomoc.
Naresh,
1

Logo Terrapin, 304 bajty

Niezoptymalizowany; dużo przestrzeni.

MAKE "M :B MAKE "H :A LABEL "L IF EMPTY? :I OP LIST :H :M MAKE "C FIRST :I IF AND ((ITEM 2 :C)=1) ((ITEM 1 :C) = 0) MAKE "M :M+1 IF :M=60 MAKE "M 0 IF AND ((ITEM 1 :C) = 1) ((ITEM 2 :C)=1 MAKE "M 0 MAKE "H 0 IF AND ((ITEM 1 :C)-1) ((ITEM 2 :C) = 0) MAKE "H :H + 1 IF :H = 23 MAKE "H 0 MAKE "I BF :I GO "L

Pobiera listę jako swoje pierwsze wejście, a godzinę początkową + minuty (osobne dane wejściowe) odpowiednio jako drugie i trzecie.

Nie mogę skopiować + wkleić z Terrapin Logo, ponieważ jest to wersja próbna, więc to :(

Adrian Zhang
źródło
1

R , 61 bajtów

function(I,B){for(b in B)I=I+"if"(sum(b)>1,-I,b)
I%%c(24,60)}

Staje się Ijako długości 2 wektor c(H,M)i Bjako lista długości 2 wektorów dla przycisków c(H,M). Iteracji B, ustawianie Isię c(0,0), jeśli suma jest2 . Następnie na końcu zmniejsza się. W nagłówku znajduje się również funkcja, która tłumaczy naciśnięcia przycisków na właściwy format R, jeśli chcesz je wszystkie przetestować; przyjmuje tablicę [(H,M),...]jako ciąg.

Wypróbuj online!

Giuseppe
źródło
1

C # (.NET Core) , 93 bajty

(n,l)=>{for(int i=0,x;i<n.Length;){x=n[i++];if(x>1)l[0]=l[1]=0;else{l[x]=++l[x]%(24+36*x);}}}

Wypróbuj online!

Pobiera dane wejściowe jak w trybie trójkowym, gdzie 0 == (1,0), 1 == (0,1), 2 == (1,1), a czas w tablicy o indeksie 0 oznacza godziny, a 1 oznacza minuty. Zmienia tablicę czasu na miejscu.

jkelm
źródło
0

Mathematica, 54 bajty

Switch[#2,a={0,0},#,a+1,a,_,Mod[+##,{24,60}]]&~Fold~#&

Funkcja anonimowa. Pobiera listę 2-krotek jako dane wejściowe i zwraca 2-krotkę jako dane wyjściowe.

LegionMammal978
źródło
0

Scala , 116 bajtów

Tak więc traktuję czas rozpoczęcia jako dwa pierwsze parametry mojego func ( hi m), a sekwencję wejściową traktuję jako macierz [Tuple2].

var x=h
var y=m
for(u<-a)u match{case (0,1)=>y=(y+1)%60
case (1,0)=>x=(x+1)%24
case (1,1)=>{x=0;y=0}
case _=>}
(x,y)

Zastanawiam się ... czy powinienem policzyć deklarację func ( def time(h:Int,m:Int,a:Array[Tuple2[Int,Int]]):Tuple2[Int,Int]={plus końcówkę }) w liczbie bajtów?

Wypróbuj online!

V. Courtois
źródło