Aptal Eski Çalar Saatimi Simüle Et


25

İki düğmeli salak bir eski alarm saatim var: hourve minute. hourDüğme kümesi alarm saati artırır ve minutebir dizi alarm dakikalık süresi artar. Ancak, bazı akıllı tasarımcılar aynı anda iki düğmeye de basmanın bir anlamı olması gerektiğinin farkına vardılar hourve minuteaynı anda ve aynı anda alarmın 12:00 am/ olarak ayarlanmasına neden olacağına karar verdiler 0:00. Görevin bu davranışı simüle etmektir.

Görev

Bir başlangıç ​​zamanı ve bir dizi düğme durumu göz önüne alındığında, bitiş zamanını hesaplayın.

Başlangıç zamanından başlayarak, her bir oluşum için, saat artırmak (1,0), her bir oluşum için, dakika artırmak (0,1)ve zamanı ayarlanmış 0:00her bir oluşum için (1,1). Devletler (0,0)göz ardı edilmemelidir, çünkü bu iki düğmeye de basılmaz.

Dakikalara ve saatlere eklerken, dakika / saat maksimumun üstüne çıkarsa, onu ayarlayın 0, yani dakika değerini artırmak, dakika değerini 59ayarlamak 0ve saat değerini artırmak için saat değerini artırmak 23gerekir 0. Sınırlarını yukarıda dakika / saat değerleri artırım yapılması dakikası artan örneğin başka bir değer etkilemeyen 10:59verimleri 10:00değil 11:00.

Örnek

Giriş zamanı 13:58ve adımları göz önüne alındığında [(0,1),(0,1),(0,1),(0,0),(1,1),(1,0)],

  1. (0,1). Bu minute, basılmaya karşılık gelir . Şimdi tam zamanı 13:59.
  2. (0,1). Bu minute, basılmaya karşılık gelir . Şimdi tam zamanı 13:00.
  3. (0,1). Bu minute, basılmaya karşılık gelir . Şimdi tam zamanı 13:01.
  4. (0,0). Bu, hiçbir düğmeye basılmamasına karşılık gelir. Etkilenmeyen zaman şimdi13:01
  5. (1,1). Bu, basılan her iki düğmeye karşılık gelir. Şimdi tam zamanı 0:00.
  6. (1,0)Bu hour, basılmaya karşılık gelir . Şimdi tam zamanı 1:00.

Sona çıktığımızdan beri 1:00çıktı.

I / O

Giriş, bir süre ve bir dizi düğme durumundan oluşacaktır. Çıktı tek bir zamandır.

Giriş zamanı ve çıkış zamanı olabilir.

  • bir 2-lü (hour, minute)veya (minute, hour)içinde 24gibi-saat (13, 30)( houraralıklar 0için 23ve minutearalıklar 0için 59)
  • Önceki olarak değil, aynı 12-saat ve bir Boolean am/ pmanahtar ( houraralıkları 0için 11ya da 12ve 1üzere 11birlikte minutegelen 0için 59).
  • 0:00810 gibi bir çok dakika (0 - 1439, dahil)
  • aynı bilgiyi kodlayan başka bir format

Düğme durumlarının sırası, örneğin Boolean 2-tuples listesinin bir temsilidir, örneğin:

  • tuples listesi: [(0,1),(1,0),(0,0),(1,1)]
  • boşlukla ayrılmış bir dize: "01 10 00 11"
  • dizi: "01100011"
  • Kuaterner'de: [1,2,0,3]
  • bir tam sayıya dönüştürülmüş: 99
  • aynı bilgiyi kodlayan başka bir format

Test Kılıfları

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



İki veri setinin giriş formatı bir liste olarak kabul edilebilir mi? Örneğin [[initialHour, initialMinute], [hourPressed1, minuitePressed1], [hourPressed2, minuitePressed2], ...]?
Jonathan Allan

@JonathanAllan Evet.
fireflame241 16:17

Normal dijital saatte 1200 am ne demektir?
Ferrybig

Yanıtlar:


8

Jöle , 13 bayt

_`+Ạ}?/%24,60

Çevrimiçi deneyin!


Not: OP, "Düğme durumlarının sırası bir listenin temsilidir" derken, sadece devam edip bu giriş biçimini kullanabileceğimizden emin değilim (bu yüzden sordum).
Jonathan Allan

@JonathanAllan öyleyse OP cevabım hakkında yorum yapacak, ancak yorumunuzda kullandığınız tam formatı kullanıyorum ... bazen OP, tembelleşiyor ya da mücadeleyi güncellemeyi unuttu
Ağustos

6

C, 89 87 bayt

@Jonathan Frech'e iki byte tasarruf ettiğin için teşekkürler!

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);}

Çevrimiçi deneyin!


6

Jöle ,  21  (17?) 19 bayt

17 bayt? - Girdi biçimi: [[initHour, initMinute], [a1, b1], [a2, b2], ...]kabul edilebilir ise, monadik bir bağlantımız olur ve W;ikinci satırın başından çıkartabiliriz .

Not: Bu şimdi Erik Outgolfers Jelly cevabına yaklaşıyor , bu yüzden golf oynamaktan daha fazla rahatsız etmeyeceğim (bunu görmedim) ...

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

[hour, minute]Soldaki tamsayılar (24-saat) olarak başlangıç ​​saatlerinin bir listesini [[hourPressed, minPressed], ...]ve sağdaki düğmelerin
bir listesini tekrarlayan bir dyadik bağlantı, sonuçların zamanının bir listesini tamsayılar olarak tekrar verir [hour, minute](24 saat).

Çevrimiçi deneyin! veya test odasına bakın

Nasıl?

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)

-1 bayt yerine ⁹Ạ¤ile Ạ}. İzin verilen bir biçimi kullanmak için başka -2 . Son olarak, başka -1 önce zincir çünkü µburada .. Bir ikilisinin olarak adlandırılır
Erik Outgolfer


5

Retina , 75 bayt

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

1>`:

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

Çevrimiçi deneyin! Link, test durumlarını içerir. Açıklama:

.*,1:1
:

Boş bir zamanla değiştirerek (son düğmeye basılması durumunda), son çift düğme basışına kadar olan her şeyi silin.

\d+
$*

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

O`\D1*

Dakikaları sonuna kadar sıralayın.

,

Birlikte saati ekleyin.

1>`:

Dakikaları bir araya getirin, fakat saatleri ayrı tutun.

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

Saat ve dakika modulo 24 veya 60'ı uygun şekilde azaltın.

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

Ondalık dönüştür.

\b\d\b
0$&

İki haneye biçimlendirin.


4

Python 3, 135 117 115 bayt

Jonathan Frech sayesinde -20 bayt

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

Çevrimiçi deneyin!

Zamanı formdaki bir liste olarak alır [hour, minute].


Sen yerine mümkün olabilir (m[0]+1)ile -~m[0]ve if m[0]<23 else 0ile *(m[0]<23).
Jonathan Frech

Ayrıca, her zaman olduğu gibi bve cher zaman boolean olanları b+c>1ile değiştirebilirsiniz b&c.
Jonathan Frech

76 bayt (TIO yorum kutusu için büyük olması nedeniyle kısaltılmış bağlantı)
Halvard Hummel 16:17


4

JavaScript (ES6), 55 bayt

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

Karıştırma sözdiziminde girdi, dizi biçimindeki başlangıç ​​zamanı [min, hour]ve Kuvaterner dizi olarak adımlar uygulanır. Çıkış zamanı, giriş zamanı ile aynı formatta.

Test Kılıfları


3

Perl 6 , 40 bayt

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

Çevrimiçi deneyin!

Düğmeye basıldığında başlangıç ​​zamanını içeren bir liste alır. Bitiş zamanını döndürür. Zamanlar ve düğmeler (hour, minute)çiftler. 24 saat


3

Perl 5 , 70 bayt

-nBayrak için 1 bayt kodu + 1

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

Çevrimiçi deneyin!

Giriş biçimi

hh:mm,abcdabcdabcdaddccbbaa

nerede:

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

Presler arasındaki boşluklar veya diğer ayırıcılar önemsizdir.

açıklama

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

3

Swift , 106 96 bayt

-10, Xcoder sayesinde

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)}

İdeone üzerinde deneyin!

fonksiyonu başlangıç ​​değerini ve tuples dizisini alır ve son zamanı döndürür.


96 bayt yerine STDOUT yazdırarak,: 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)}. Bu da kurtulur typealias.
Bay Xcoder,

1
Bu arada, PPCG'ye hoş geldiniz! Şaşırtıcı ilk cevap.
Bay Xcoder,

çok teşekkür ederim, aslında önce print () kullandım ... ama farklı uygulamalar arasında geçiş yaptıktan sonra unuttum. Yardımın için tekrar teşekkürler.
Naresh,

1

Terrapin Logosu, 304 bayt

Optimize edilmemiş; çok fazla alan var.

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

Bir listeyi ilk girişi, başlangıç ​​saati + dakikasını (ayrı girişleri) sırasıyla ikinci ve üçüncü olarak alır.

Terrapin Logo’dan deneme sürümü olarak kopyalayıp + yapıştır yapıyorum bu yüzden şöyle :(


1

R , 61 bayt

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

Alır Ibir uzunluk-2 vektörü gibi c(H,M)ve B, düğme için uzunluk-2 vektörlerinin bir listesi olarak c(H,M). Dolaşır Bayarlayarak, Ihiç c(0,0)toplamı ise 2. Sonra sonunda aşağı mods. Ayrıca, hepsini sınamak istiyorsanız, düğmenin basma düğmelerini doğru R biçimine çevirmek için başlıkta bir işlev vardır; diziyi [(H,M),...]bir dizge olarak alır .

Çevrimiçi deneyin!


1

C # (.NET Core) , 93 bayt

(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);}}}

Çevrimiçi deneyin!

0 == (1,0), 1 == (0,1), 2 == (1,1), ve 0 dizisinin dakika ve 1 dakika olduğu bir dizideki zamanla, triner gibi girdi alır. Yerdeki zaman dizisini değiştirir.



0

Mathematica, 54 bayt

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

Anonim işlev Giriş olarak 2 tuples listesini alır ve çıkış olarak 2 tuple döndürür.


0

Scala , 116 bayt

Bu yüzden sadece başlangıç ​​zamanımı fonksiyonumun ( hve m) ilk iki parametresi olarak alıyorum ve giriş sırasını Array [Tuple2] olarak alıyorum.

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)

Merak ediyorum ... bayt sayısında işlev bildirimini ( def time(h:Int,m:Int,a:Array[Tuple2[Int,Int]]):Tuple2[Int,Int]={artı bitişi }) saymalı mıyım?

Çevrimiçi deneyin!

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.