私の愚かな古い目覚まし時計をシミュレート


25

私は2つのボタンを持つ愚かな古い目覚まし時計を持っています:hourminute。このhourボタンは、設定されたアラームの時間を増やし、設定されたアラームminuteの分の時間を増やします。ただし、一部のスマートデザイナーは、両方のボタンを同時に押すことには意味があることに気付き、and hourminute同時に押すとアラームが12:00 am/ に設定されると判断しました0:00。あなたの仕事は、この動作をシミュレートすることです。

仕事

開始時間と一連のボタン状態が与えられたら、終了時間を把握します。

開始時刻から開始して、の各出現ごとに時間を(1,0)増やし、の各出現ごとに分を増やし、の各出現ごとに(0,1)時間を設定します。どちらのボタンも押されていないことに対応するため、状態は無視する必要があります。0:00(1,1)(0,0)

分と時間に追加するときに、分/時間が最大値を超える場合、に設定し0ます。つまり、分の値を増やすと分値が59設定され、0時間の値を増やすと時間値が23設定され0ます。制限を超える分/時間値の増分は、他の値に影響しません。たとえば、10:59yields の分では10:00なく、yieldsの増分11:00です。

入力時間13:58とステップを考えると[(0,1),(0,1),(0,1),(0,0),(1,1),(1,0)]

  1. (0,1)。これはminute押されることに対応します。今が時です13:59
  2. (0,1)。これはminute押されることに対応します。今が時です13:00
  3. (0,1)。これはminute押されることに対応します。今が時です13:01
  4. (0,0)。これは、どちらのボタンも押されていないことに対応します。影響を受けない時間は今13:01
  5. (1,1)。これは、両方のボタンが押されていることに対応します。今が時です0:00
  6. (1,0)これはhour押されることに対応します。今が時です1:00

で終わるので1:00、それが出力です。

I / O

入力は、時間と一連のボタン状態で構成されます。出力は1回です。

入力時間と出力時間は

  • 2組(hour, minute)または(minute, hour)24など-hour時間(13, 30)hourの範囲023minute範囲から059
  • 前しかしと同じ12-hour時間とブールam/ pmスイッチ(hourの範囲011、または12111有するminuteから059)。
  • 0:00810などの分数(0から1439まで)
  • 同じ情報をエンコードするその他の形式

ボタンの状態のシーケンスは、ブール2タプルのリストの表現です。次に例を示します。

  • タプルのリスト: [(0,1),(1,0),(0,0),(1,1)]
  • スペース区切りの文字列: "01 10 00 11"
  • 文字列: "01100011"
  • 第四紀に: [1,2,0,3]
  • 整数に変換: 99
  • 同じ情報をエンコードするその他の形式

テストケース

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



2つのデータセットを1つのリストとして入力する形式は受け入れられますか?例えば[[initialHour, initialMinute], [hourPressed1, minuitePressed1], [hourPressed2, minuitePressed2], ...]
ジョナサンアラン

@JonathanAllanはい。
fireflame241

通常のデジタル時間で1200amとはどういう意味ですか?
フェリービッグ

回答:


8

OPが「ボタンの状態のシーケンスはリストの表現である」と述べているため、先に進んでその入力形式を使用できるかどうかはわかりません(したがって、私は尋ねました)。
ジョナサンアラン

@JonathanAllanそうならば、それはOPが怠惰であるかの挑戦を更新するのを忘れていることを時々だ... OPは私の答えにコメントしますが、私はあなたのコメントで使用される正確な形式を使用しています
エリックOutgolfer


6

ゼリー 21 (17?)19 バイト

17バイト?-入力形式:[[initHour, initMinute], [a1, b1], [a2, b2], ...]が受け入れられる場合、モナドリンクがW;あり、2行目の先頭から削除される場合があります。

注:これは現在、Erik the Outgolfers Jellyの回答に向かって収束しているので、私はもっとゴルフを気にしません(私はそれを見ていませんでした)...

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

[hour, minute]左側の整数(24時間)として初期時間のリストを取得[[hourPressed, minPressed], ...]し、右側のボタン状態のリストを取得するダイアディックリンク
は、最終結果時間のリストを再び整数[hour, minute](24時間)として返します。

オンラインでお試しください!またはテストスイートを見る

どうやって?

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バイト置き換えることによって⁹Ạ¤Ạ}。許可された形式を使用するための別の-2最後に、別の-1の前に連鎖のでµ、ここで...ダイアドと呼ばれている
エリックOutgolfer

6

パイソン284の 75バイト

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

オンラインでお試しください!

タプル(時間、分)として時間がかかる関数。同じ方法で出力します。


-3バイトを使用するall(b)代わりに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)
エリックアウトゴルファー


lambda(h,m),(d,e):このパターンマッチングはPythonで!?
Quelklef

5

網膜、75バイト

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

1>`:

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

オンラインでお試しください!リンクにはテストケースが含まれます。説明:

.*,1:1
:

最後のダブルボタンを含むすべてを削除し、空の時間に置き換えます(最後のボタンを押す場合)。

\d+
$*

単項に変換します。

O`\D1*

議事録を最後まで並べ替えます。

,

時間を一緒に追加します。

1>`:

分を合計しますが、時間は分けてください。

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

必要に応じて24または60を法として時間と分を減らします。

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

10進数に変換します。

\b\d\b
0$&

2桁にフォーマットします。


4

Python 3、135 117 115バイト

ジョナサンフレッシュのおかげで-20バイト

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

オンラインでお試しください!

フォームのリストとして時間を取ります[hour, minute]


あなたは交換することができるかもしれない(m[0]+1)-~m[0]してif m[0]<23 else 0*(m[0]<23)
ジョナサンフレッチ

また、bcは常にブール値であるためb+c>1、に置き換えることができますb&c
ジョナサンフレッチ

76バイト(リンクが短く、TIOがコメントボックスに対して大きくなるため)
Halvard Hummel


4

JavaScript(ES6)、55バイト

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

配列形式の開始時間[min, hour]とクォータナリ配列としてのステップを使用して、カリー化構文で入力を受け取ります。出力時間は入力時間と同じ形式です。

テストケース



3

Perl 5、70バイト

69バイトのコード+ -nフラグ用の1

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

オンラインでお試しください!

入力フォーマット

hh:mm,abcdabcdabcdaddccbbaa

ここで:

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

プレス間のスペースまたはその他の区切り記号は重要ではありません。

説明

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

Swift106 96バイト

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

ideoneで試してみてください!

関数は初期値とタプルの配列を取り、最終時間を返します。


96バイトの代わりにSTDOUTに印刷することによって、: 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)}。これも取り除きtypealiasます。
ミスターXcoder

1
ところで、PPCGへようこそ!驚くべき最初の答え。
ミスターXcoder

本当にありがとう、実際に最初にprint()を使用しました...しかし、異なる実装を切り替えた後忘れました。ご協力ありがとうございます。
ナレシュ

1

Terrapinロゴ、304バイト

最適化されていません。たくさんのスペース。

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

リストを最初の入力として、開始時+分(別々の入力)をそれぞれ2番目と3番目として入力します。

Terrapinロゴは試用版なのでコピーして貼り付けることはできません。


1

R、61バイト

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

かかるI長さ2のベクトルとして、c(H,M)及びB、ボタンの長さ2のベクトルのリストとしてc(H,M)。繰り返し、合計がであるかどうかをB設定Iします。その後、最後にmodsがダウンします。ボタンをすべてテストする場合は、ボタンの押下を正しいR形式に変換する機能もヘッダーにあります。配列を文字列として受け取ります。c(0,0)2[(H,M),...]

オンラインでお試しください!


1

C#(.NET Core)、93バイト

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

オンラインでお試しください!

0 ==(1,0)、1 ==(0,1)、2 ==(1,1)、およびインデックス0が時間、1が分である配列内の時刻を使用して、3進形式で入力を受け取ります。時間配列を所定の場所に変更します。



0

Mathematica、54バイト

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

匿名関数。2タプルのリストを入力として受け取り、2タプルを出力として返します。


0

Scala、116バイト

したがって、開始時間をfunc(hおよびm)の2つの最初のパラメーターとして取得し、入力シーケンスをArray [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)

バイトカウントでfunc宣言(def time(h:Int,m:Int,a:Array[Tuple2[Int,Int]]):Tuple2[Int,Int]={および終了})をカウントする必要がありますか?

オンラインでお試しください!

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.