Code Wars Kata "Replace With Alphabet Position"



Image source: https://www.klipfolio.com/blog/algorithm-in-six-steps

質問する


指定した文字列のすべての文字をalphattet順序で置き換えます.text内、非文字は無視してください.返事しないでください.
例)"a" = 1, "b" = 2, etc.

// Example

alphabetPosition("The sunset sets at twelve o' clock.")
Should return "20 8 5 19 21 14 19 5 20 19 5 20 19 1 20 20 23 5 12 22 5 15 3 12 15 3 11" (as a string)

私の答え

function alphabetPosition(text) {
  let newText = '';
  
  for(let letter of text) {
    newText += letter.toUpperCase();
  }
  
  let result = "";
  
  for(let i = 0; i < newText.length; i++) {
    let asciiCode = newText.charCodeAt(i);
    
    if(asciiCode >= 65 && asciiCode <= 90) {
       result = result + " " + (asciiCode - 64);
    }
  }
  return result.substring(1, result.length);
}
以前コッドステツコプリット問題でアルファベットに関する問題がありましたが、当時はアルファベットを一列に並べてインデックスを選択して書いていましたが、今日は別の方法で解きたいのでアスキーコードで解きます.まず前回の方法より少し良いので嬉しくなりたいのですが、他の人の答えを見て驚きました.

Best Solution #1


正規表現/[a-z]/でアルファベットmatchのみを使用し、giでcaseを作成するのは敏感ではなく、map()でAskyコードをマッチングします...ただ….気が狂ったようだ.
function alphabetPosition(text) {
  return text
    .toUpperCase()
    .match(/[a-z]/gi)
    .map( (c) => c.charCodeAt() - 64)
    .join(' ');
}

Best Solution #2

function alphabetPosition(text) {
  var result = "";
  for (var i = 0; i < text.length; i++){
    var code = text.toUpperCase().charCodeAt(i)
    if (code > 64 && code < 91) result += (code - 64) + " ";
  }

  return result.slice(0, result.length-1);
}

もし私の論理と比較したら?


2つ目の論理を見て、私が書いた答えは論理と何の違いもありません.しかし、私の答えは出てきましたが、パッチがあり、toUpperCase()メソッドの機能を正しく把握していません.この方法はtext.toUpperCase()を1回書くだけでいいです.私はこれを繰り返し文に書きます.😫
この点、時間の複雑さが2倍に増えているので、方法の機能を正しく身につけるべきだと思います.
最初の再論理は、正規表現(regex)を使って新しい視点を与えてくれたようだ.この論理で正規表現を.match(/[A-Z]/g)(いっそ最初から大文字でマッチング)と書くことができるのは、最初の論理のおかげだと後で知った.ハハハ
おもしろい!
2020.11.27に追加:if文をcharcodeat()で区別するのは、正規表現(regex)よりもパフォーマンスの面で有利であることが後で分かった事実です.正規表現は約50%遅いという.
質問元:www.codewars.com