アラームの最適化

私の目覚まし時計

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

時間がキャップ(12)を超えると、1にリセットされ、AM/PMライトがトグルされます。時間がキャップを超過すると(59)、時間に影響を与えずに0にリセットされます。

タスク

あなたの仕事は、開始時間と目標時間を与えられ、私のアラームを目標時間に設定するのに必要なボタンの数を最適に出力することです。

あなたはどんなフォーマットでもあなたに最も適した入力をすることができます。あなたのプログラムが必要とする唯一のデータは、両方の入力に対して時間と分です。つまり、エポック時代からミリ秒単位でデータを取得し、時間と分を抽出することができますが、年、月、秒などには何かをエンコードしないことがあります。たとえば、「軍事的な時間」(またはほとんどの世界では通常の時間)を使用して入力することができますが、それは私の時計の仕組みを変えるものではありません。

1:15 pm -> 2:30 am

両方のボタンを押し下げて午前12時にリセットしてから、午前2時30分に増やすことができます。これは 2 + 2 +
30 = 34
ボタンの押下です。また、 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
ベストアンサー

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

Uses 24 hour format. Takes input as 4 integers representing the
hours & minutes of each time.

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

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

セパレータを使用して、時間を24時間形式で入力します。

<div class=”snippet” data-lang=”js” data-hide=”false”
data-console=”true” data-babel=”false”> <div
class=”snippet-code”>

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;}
<input id=i type=time><input id=j type=time>

</div>
</div>




説明


(まもなく更新予定)
(g,l,h,m)=>

Anonymous function taking the integers as arguments via parameters g, l, h & m, where g & l are, respectively, the hours & minutes of the current time and h & m are the hours & minutes of the target time.
2+h+m

最初に、クロックをリセットするだけで何回ボタンを押す必要があるかを計算します。これはリセット(リセットの場合)と目標時間と目標分を足したものです。
h-g+24*(h

Next we calculate how many button presses are needed to reach the target hour. We do this by subtracting the current hour from target hour. However, if the current hour is less than the target, this will give us a negative number so we rectify that by adding 24 multiplied by checking if h (which returns a boolean but is implicitly cast to integer 1, if true, or 0 if false by the mathematical operations.

+m-l+60*(m

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

最後に、結果を与えるために2つの数値の最小値を取得します。

返信を残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です