JavaScript HackerRankのStrange Counter - 問題解析


問題の概要: Strange Counterは、カウントダウンが特定のパターンで進行するタイマーを表現します。最初の値は3で始まり、1ずつ減少していきます。ただし、特定の時点で値が2倍になり、再び減少し始めます。このパターンは無限に続きます。

例えば、最初の3秒間は3, 2, 1とカウントダウンし、次の1秒間は6となり、その後は5, 4, 3, 2, 1と再びカウントダウンします。このパターンが無限に続くため、与えられた時間が何秒目の値かを求める必要があります。

方法1: ループを使用したシミュレーション この方法では、時間を1秒ずつ進めながら、カウントダウンのパターンをシミュレートします。最初の値が与えられるので、その値を超えるまでループを続け、該当する値を見つけるまでカウントダウンを繰り返します。

以下に、JavaScriptでのループを使用したシミュレーションの例を示します。

function strangeCounter(t) {
  let value = 3;
  let time = 1;
  while (time < t) {
    value *= 2;
    time += value;
  }
  return value - (time - t);
}
const time = 10; // 調べたい時間
console.log(strangeCounter(time)); // 出力: 1

方法2: 数学的なアプローチ Strange Counterのパターンには数学的な法則があります。最初の値から次の値に移るまでの時間間隔は、現在の値に依存しています。最初の値をx、最初の時間間隔をyとすると、各タイミングでの値は以下のように表されます。

  • 1回目の値: x
  • 2回目の値: x - y
  • 3回目の値: x - 2y
  • ...
  • n回目の値: x - (n-1)y

このパターンを利用して、与えられた時間が何秒目の値かを計算することができます。

以下に、数学的なアプローチを使用した解法の例を示します。

function strangeCounter(t) {
  let value = 3;
  let time = 1;
  while (time <= t) {
    time += value;
    value *= 2;
  }
  return time - t;
}
const time = 10; // 調べたい時間
console.log(strangeCounter(time)); // 出力: 1