codewarsテーマ記録

37350 ワード

1、問題の説明:二次元配列に入ってきました.「乗車人数、降車人数」、乗車人数が変動した後、車に残された総人数を計算します.
//    
var number = function(busStops){
     
  // Good Luck!
  var len = busStops.length;
  var num = 0;
  for(var i = 0; i < len; i++){
     
    num = num + busStops[i][0] - busStops[i][1];
  }
  return num;
}

//       
const number = (busStops) => busStops.reduce((rem, [on, off]) => rem + on - off, 0);
注意点:1)第一のコードは最も考えやすく、最も一般的なコードですが、第二のフレキシブルな配列の反復方法Aray.reduce(Function)、reduce()方法は、配列の各要素に対して関数を実行し、値を返します.2)矢印関数(匿名関数):
x => x * x
//   
function (x) {
     
    return x * x;
}
矢印関数には二つの書式があります.一つは上のように、一つの表現だけが含まれています.もう一つは複数の語句が含まれていますが、この場合は「…」と「return」を省略してはいけません.パラメータが一つ以上の場合は、括弧で囲みます.オブジェクトを返すには、単一表現であればエラーが発生します.
// SyntaxError:
x => {
      foo: x }
関数の「...」と文法的に衝突していますので、次のように変更します.
// ok:
x => ({
      foo: x })
矢印関数と匿名関数には明確な違いがあります.矢印関数内部のthisは語法作用領域であり、コンテキストによって決定され、カルル()またはappy()で矢印関数を呼び出した場合、thisをバインドできません.すなわち、着信する最初のパラメータは無視されます.
2、問題の説明:1つの配列の0を配列の末尾に移動し、他の要素は順序を保持します.
//    
var moveZeros = function (arr) {
     
  var len = arr.length;
  for (var i = 0; i < len; i++) {
     
    if (arr[i] === 0) {
     
       arr.splice(len, 0, arr[i]);
       arr.splice(i, 1);
       i--;
       len--;
    }
  }
  return arr;
}

//       
var moveZeros = function (arr) {
     
  return arr.filter(function(x) {
     return x !== 0}).concat(arr.filter(function(x) {
     return x === 0;}));
}
注意点:1)一つ目のコードは間違いやすいところがあります.よくlenを忘れます.このステップはコードが後ろに無限ループが発生する場合、ブラウザが崩壊します.二つ目のコードは巧みに配列の中を0としない部分を分割して、配列を結合します.2)Aray.filter()は、配列中の条件に合致する要素を絞り出し、配列を接続することができる.
3、問題の説明:名前配列によって、対応する配列長の文字列を返します.
//    
function likes(names) {
     
  // TODO
  var len = names.length;
  var piece = " likes this";
  var Piece = " like this";
  var noone,First,Second,Third,num;
  switch(len){
     
      case 0:
        noone = "no one";
        noone += piece;
        return noone;
      case 1:
        First = names[0];
        First += piece;
        return First;
      case 2:
        First = names[0];
        Second = names[1];
        First += " and " + Second + Piece;
        return First;
      case 3:
        First = names[0];
        Second = names[1];
        Third = names[2];
        First += ", " + Second + " and " + Third + Piece;
        return First;
      default:
        First = names[0];
        Second = names[1];
        num = len - 2;
        First += ", " + Second + " and " +  num + " others" + Piece;
        return First;   
    }
}

//       
function likes(names) {
     
  names = names || [];
  switch(names.length){
     
    case 0: return 'no one likes this'; break;
    case 1: return names[0] + ' likes this'; break;
    case 2: return names[0] + ' and ' + names[1] + ' like this'; break;
    case 3: return names[0] + ', ' + names[1] + ' and ' + names[2] + ' like this'; break;
    default: return names[0] + ', ' + names[1] + ' and ' + (names.length - 2) + ' others like this';
  }
}

//     
function likes (names) {
     
  var templates = [
    'no one likes this',
    '{name} likes this',
    '{name} and {name} like this',
    '{name}, {name} and {name} like this',
    '{name}, {name} and {n} others like this'
  ];
  var idx = Math.min(names.length, 4);
  return templates[idx].replace(/{name}|{n}/g, function (val) {
     
    return val === '{name}' ? names.shift() : names.length;
  });
}
注意点:1)第一のコードは、多すぎる変数を宣言しています.コードが煩雑すぎるように見えます.直接に宣言の変数を加算すると、第二のコードとなります.第三のコードはテンプレート文字列を採用しています.テンプレート文字列の中の「name」と「{n}にマッチします.もし{name}であれば、文字列配列の最初の要素を除去して返します.{n}残りの要素の個数を返します.
4、問題の説明:1つの配列を与え、数値は0または1であり、それを結合したバイナリを10進数に変換する.
//    
const binaryArrayToNumber = arr => {
     
  // your code
  var len = arr.length;
  var num = 0;
  for(var i = 0; i < len; i++){
     
    num += arr[i] * Math.pow(2,len-1-i);
  }
  return num;
};

//       
const binaryArrayToNumber = arr => parseInt(arr.join(''),2);
注意点:1)第一のコード思想は、それぞれ2の対応する二乗演算を行い、結果を加算します.第二のコードは配列を文字列に変換し、方法を使ってバイナリを10進数に変換します.
5、問題の説明:テンプレートに従って数値配列を文字列にします.
//    
function createPhoneNumber(numbers){
     
  return "(" + numbers[0] + numbers[1] + numbers[2] + ")" + " " + numbers[3] + numbers[4] + numbers[5] + "-" + numbers[6] + numbers[7] + numbers[8] + numbers[9];                         
}

//       
function createPhoneNumber(numbers){
     
  numbers = numbers.join('');
  return '(' + numbers.substring(0, 3) + ') ' 
      + numbers.substring(3, 6) 
      + '-' 
      + numbers.substring(6);
}

//     
function createPhoneNumber(numbers){
     
  var format = "(xxx) xxx-xxxx";
  
  for(var i = 0; i < numbers.length; i++)
  {
     
    format = format.replace('x', numbers[i]);
  }
  
  return format;
}

//     
function createPhoneNumber(numbers){
     
  return numbers.join(‘‘).replace(/(...)(...)(.*)/, ($1) $2-$3);
}
第一のコードは簡潔明瞭であるが、配列要素が多いと、特に面倒で効率が悪い.第二のコードは配列を文字列に変換し、str.substring()を通じて文字列の中の文字を抽出し、第三のコードは文字列フォーマットを定義してから行を一つずつ置き換える.文字列の最初の3文字にそれぞれ対応して、中間の3文字と最後のすべての文字を置き換えます.
6、問題の説明:文字列の文字をそれぞれ対応する数字で代用し、大文字と小文字を区別せず、文字列のアルファベットでない部分を無視する
//    
function alphabetPosition(text) {
     
  var t = text.split("");
  for (var i = 0; i < t.length; i++) {
     
      var x = t[i].charCodeAt();
      if ((x >= 65 && x <= 90) || (x >= 97 && x <= 122)) {
     
          t[i] = (x >= 97 ? x - 96 : x - 64).toString();
      } else {
     
          t.splice(i--, 1);
      }
  }
  text = t.join(" ");
  return text;
}

//       
function alphabetPosition(text) {
     
  return text
    .toUpperCase()
    .match(/[a-z]/gi)
    .map( (c) => c.charCodeAt() - 64)
    .join(' ');
}
注意点:1)第一の方法は従来の解法で、第二の方法は文字列をすべて大文字に変換し、アルファベットを対応数値に変換して文字列にし、配列と文字列の変換と対応方法によって解いています.
まとめ:1)多くの場合、配列の反復方法で目的を達成できます.コードをより簡単で綺麗にします.すべてforサイクルではなく、必要な時に変数を宣言しますが、変数を多すぎないようにしてください.コードが煩雑になります.3)コードを書く過程で各変数の値に対して心の中で数え切ればいいです.変数の値が変わる時、私達は気づかなかったです.結果は予想と違っています.4)行列と文字列の様々な方法と両者の切り替えを熟練に把握する.