コードブック#5キーボードを押す


マイコード

function solution(numbers, hand) {
  let answer = "";
  keypad = {
    1: [0, 0],
    2: [0, 1],
    3: [0, 2],
    4: [1, 0],
    5: [1, 1],
    6: [1, 2],
    7: [2, 0],
    8: [2, 1],
    9: [2, 2],
    "*": [3, 0],
    0: [3, 1],
    "#": [3, 2],
  };
  let num = 0;
  let leftPosition = keypad["*"];
  let rightPosition = keypad["#"];
  let distance_left = 0;
  let distance_right = 0;

  for (let i = 0; i < numbers.length; i++) {
    num = keypad[numbers[i]];
    if (num[1] == 0) {
      answer += "L";
      leftPosition = num;
    } else if (num[1] == 2) {
      answer += "R";
      rightPosition = num;
    } else if (num[1] == 1) {
      distance_left =
        Math.abs(num[0] - leftPosition[0]) + Math.abs(num[1] - leftPosition[1]);
      distance_right =
        Math.abs(num[0] - rightPosition[0]) +
        Math.abs(num[1] - rightPosition[1]);

      if (distance_left < distance_right) {
        answer += "L";
        leftPosition = num;
      } else if (distance_left > distance_right) {
        answer += "R";
        rightPosition = num;
      } else if (distance_left == distance_right) {
        if (hand == "left") {
          answer += "L";
          leftPosition = num;
        } else if (hand == "right") {
          answer += "R";
          rightPosition = num;
        }
      }
    }
  }

  return answer;
}

さいてきコード

function solution(numbers, hand) {
  hand = hand[0] === "r" ? "R" : "L"
  let position = [1, 4, 4, 4, 3, 3, 3, 2, 2, 2]
  let h = { L: [1, 1], R: [1, 1] }
  return numbers.map(x => {
    if (/[147]/.test(x)) {
      h.L = [position[x], 1]
      return "L"
    }
    if (/[369]/.test(x)) {
      h.R = [position[x], 1]
      return "R"
    }
    let distL = Math.abs(position[x] - h.L[0]) + h.L[1]
    let distR = Math.abs(position[x] - h.R[0]) + h.R[1]
    if (distL === distR) {
      h[hand] = [position[x], 0]
      return hand
    }
    if (distL < distR) {
      h.L = [position[x], 0]
      return "L"
    }
    h.R = [position[x], 0]
    return "R"
  }).join("")
}

に感銘を与える


高校以降に描かれたことのない二次関数を用いて,キーボードをイメージ化し,キーボード変数を作成し,それを用いて解く.最適なコードは、アレイ内の各要素に対して関数を実行し、結果をアレイのmap関数と正規表現に返します.そして生まれて初めて見た3つの条件演算子などを用いた.変数ポーズとhはまだ理解できません.これはこれまでの5つの問題の中で最も困難な1つである.