アラームの最適化


28

私の目覚まし時計

私はアメリカ人です。私の(デジタル)目覚まし時計もそうです。アラームを設定するには、以前の時刻に開始します。時ボタンを押すと1時間上に移動し、分ボタンを押すと1分上に移動します。両方のボタンを同時に押すと、真夜中(午前12:00)にリセットされ、ボタンを2回押すとカウントされます。

時間が上限(12)を超えると、1にリセットされ、AM / PMライトが切り替わります。分が上限(59)を超えると、時間に影響を与えずに0にリセットされます。

タスク

タスクには、開始時間と目標時間を指定して、アラームを目標時間に設定するために必要なボタンの最適な押し回数を出力します。

最適な形式で入力できます。プログラムが必要とする唯一のデータは、両方の入力に対して時間と分です。これは、たとえば、エポックからミリ秒としてデータを取得し、時間と分を抽出できることを意味しますが、年、月、秒などに何もエンコードすることはできません。 「軍事時間」(または世界のほとんどの場合は通常の時間)が、それは私の時計の動作を変更しません。

1:15 pm -> 2:30 am

両方のボタンを押し下げて午前12:00にリセットし、次に2+2+30 = 34ボタンを押すと午前2:30に増分できます。13+15 = 28ボタンを押すと、午前2時30分まで増分することもできます。したがって、出力は28です。

3:58 am -> 4:02 am

2+4+2 = 8ボタンを押すと、リセットして増分できます。1+4 = 5ボタンを押すと、増分することもできます。したがって、出力は5です。

10:55 pm -> 1:00 am

2+1 = 3ボタンを押すと、リセットして増分できます。3+5=8ボタンを押すと、増分することもできます。したがって、出力は3です。

1:00 am -> 1:59 pm

リセットして増分することもできますが、それは単に増分するよりもさらに3回押すことです。したがって、出力は12+59 = 71です。

テストケース

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
なんてこった!2つのボタンを押すと、(ヨーロッパの)目覚まし時計も0:00にリセットされます...これらすべての年は、ボタンを何度も押すことに費やしていました... O_o
Arnauld

8
「軍事時間(または世界の大部分の通常時間)」...あなたが探している用語は「24時間」です。
ヤコブ

12
@Jakobいいえ、彼が探している用語は「通常の時間」です。アメリカ人は不規則な時間、不規則な日付、不規則な単位などを使用します
ニール

1
@StepHen私は英国にいて、ヤコブがそれを説明するまで、あなたが「軍事時間」とはどういう意味だったのか分かりませんでした。24時間の時間は私にとって完全に理にかなっています
ダレンH

回答:


5

、16バイト

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

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

引数を24時間形式の開始時刻と終了時刻の2つのリスト[時間、分]として受け取ります。

私はこれをどれだけゴルフできたかについて非常に満足しています。この関数の構成で議論がどのように管理されているか興味深いです。

リセットが許可されていない場合に必要なキーの押下回数を計算する関数は次のとおりです。

Σ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

興味深い点は、このソリューションの残りの部分は引数として単一のリストでのみ機能するため、このリストはプログラム全体の最初の引数に部分的に適用され、それを「食べて」、2番目の引数のみが表示され、プログラムの残りの部分。

次に、時間を0:00にリセットする場合に必要なキーの押下回数を計算します

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

前に述べたように、これは2番目の引数(最後の時間)でのみ動作hours+minutes+2し、ゴルファーのようにを計算します。

最後に、§▼2番目の引数を両方の関数に渡し、2つの結果のうち小さい方を返す部分です。


8

JavaScript(ES6)、73 56 54 52 50バイト

24時間形式を使用します。各時間の時間と分を表す4つの整数として入力を受け取ります。

(g,l,h,m)=>Math.min(2+h+m,(h-g+24)%24+(m-l+60)%60)
  • Arnauldのおかげで2バイト節約されました。

それを試してみてください

:区切り文字を使用して、24時間形式で時刻を入力します。

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>


説明

(近日更新予定)

(g,l,h,m)=>

匿名関数は、パラメータを経由して、引数として整数を取りglhm、どこglあり、それぞれ、現在の時刻の時間&分とhm目標時間の時間&分です。

2+h+m

最初に、時計をリセットするだけで必要なボタンを押す回数を計算します。これは、単純に2(リセット用)に目標時間と目標分を加えたものです。

h-g+24*(h<g)

次に、目標時間に到達するために必要なボタンの押下回数を計算します。これを行うには、ターゲット時間から現在の時間を減算します。ただし、現在の時間がターゲットよりも小さい場合、負の数値が得られるため、24をチェックすることで乗算しh<gます(ブール値を返しますが、1trueの場合はinteger に暗黙的にキャストされ、trueの0場合はfalseになります)数学演算。

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

同様の式を使用して、現在の分から目標分までのプレス数を計算し、それを時間プレスに追加します。

Math.min()

最後に、2つの数値の最小値を取得して結果を出します。


1
できますか(h-g+24)%24+(m-l+60)%60
アーナルド

7

Pyth、29バイト

この挑戦は明らかにゴルフ言語に有利ではありません、それはそれがとても長い理由です。一方、これはPythがPythonベースであるという事実によって改善されているため、その負のモジュラスを悪用できます。

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

テストスイート。 Pythの数字は、先行ゼロをサポートしていません。



3

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

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

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

Javascriptの答えに非常に似ています。C#でのBoolsはそうする代わりに、番号に簡単に変換できません。[diff]+24*(H<h)私は([diff]+24)%24効果的に同じことをしています。


2+h+m-2バイトの括弧を削除できます。
ケビンCruijssen

私はあなたの答えのポートをJava 8で作成しました。さらに括弧を削除することでさらに4バイトをゴルフできることに気付きました。これで終わる(H,M,h,m)=>Math.Min((h+24-H)%24+(m+60-M%60),2+h+m)
ケビンCruijssen

1
あなたはそれを作る必要はありませんSystem.Math.Minか?
-LiefdeWen

3

Haskell、41バイト

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

とても簡単です。24時間の時間を使用して4つの引数として入力を受け取ります:終了時間、終了分、開始時間、開始分。


2

Python 3、43バイト

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

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

4つの整数(開始時間、開始分、終了時間、終了分)として入力


@StepHenおっと。簡単な修正。
ハイパーニュートリノ

失敗するのは2 01 11 00?あなたの答えでは、どのように時間があるかどうかを判断しますAMPMあなたは入力としてそれを取ることはありません場合は、?
氏Xcoder

@ Mr.Xcoder; 13正しい(リセット+11 <9 + 59)TIOを使用してその入力を取得します。
シャギー

2
%常にPythonで正の数を返しますか?
シャギー

4
@Shaggyは常にの右側の符号を返します%1%24= 11%-24= -23。この質問には非常に役立ちます。
スティーブン

2

Java 8、54 50バイト

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

@KamilDrakariのC#回答のポート(2 6バイトをゴルフした後)。

説明:

ここで試してみてください。

(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 5、71 +2(-ap)= 73バイト

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

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

入力をスペースで区切って24時間形式(軍事時間)で開始し、最初に開始時刻、2番目に終了時刻:HH MM hh mm


1

網膜、106バイト

\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

オンラインでお試しください!リンクにはテストケースが含まれます。2つの時間を区切るスペースを使用して、通常の24時間で現在および希望の時間として入力を受け取ります。説明:

\d+
$*

単項に変換します。

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

これは2つのことを行います。希望の時間と分に24時間と60分を追加し、元の希望の時間と分の合計に2を追加します。つまり、リセットを使用して設定するためにボタンを押す回数です。

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

希望の時間から現在の時間を減算し、可能であれば追加した24を減算します。

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

同様に数分。これにより、2つの結果も一緒に追加されます。

(1+)#(?!\1)

現在の時間を使用して設定するプレスの数がリセットを使用して設定するプレスの数よりも多い場合は、それを削除します。

\G1

最初の残りの数値を10進数に戻します。

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