Codewars-Javascript訓練手冊:字符串(中)

這幾天Codewars上的字符串訓練好繁瑣

Detect Pangram:檢測全字母句子

還記得那個經典的英文句子嗎:迅捷的棕色狐狸跳過了懶惰的狗狗身上(The quick brown fox jumps over the lazy dog),如題,這次的題目是檢測給定的字符串是否爲全字母句子,是返回true,否則,返回false。
$答案:

function isPangram(string){
  var test = 'abcdefghijklmnopqrstuvwxyz'.split('');
  var len = test.length;
  for(var i = 0;i<len;){
    if(string.toLowerCase().indexOf(test[i])==-1)return false;
    test.shift();
    len = test.length;
  }
  return true;
}

其實這道編程題考驗的是數組的every() 的用法,MDN中關於Array.prototype.every() 的說明:

every() 方法測試數組的所有元素是否都通過了指定函數的測試。 arr.every(callback[, thisArg])

every 方法爲數組中的每個元素執行一次 callback 函數,直到它找到一個使 callback 返回 false(表示可轉換爲布爾值false 的值)的元素。 如果發現了一個這樣的元素,every 方法將會立即返回 false。否則,(如果)callback 爲每一個元素返回 true,最終every方法會返回 true。callback

只會爲那些已經被賦值的索引調用。不會爲那些被刪除或從來沒被賦值的索引調用。

Codewars上投票最高的答案:

function isPangram(string){
  string = string.toLowerCase();
  return "abcdefghijklmnopqrstuvwxyz".split("").every(function(x){
    return string.indexOf(x) !== -1;
  });
}

Ease the StockBroker

給定一組字符串,單個字符串有這樣的定義:Quote /space/ Quantity /space/ Price /space/ Status,其中Quote 爲非空字符串,Quantity 爲整數,Price 爲浮點數,而Status則是相應的狀態(‘B’代表buy,‘S’代表sell)
例如這樣"ZNGA 1300 2.66 B, CLH15.NYM 50 56.32 B, OWW 1000 11.623 B, OGG 20 580.1 B".
返回這樣的結果:"Buy: b Sell: s; Badly formed nb: badly-formed 1st simple order ;badly-formed nth simple order ;",nb是不符合格式的字符串個數,badly-formed nth simple order 爲相應的錯誤格式的字符串。
例如這樣:"Buy: 263 Sell: 11802; Badly formed 2: CLH16.NYM 50 56 S ;OWW 1000 11 S ;"
$答案:

function balanceStatements(list){
  var count = 0;
  var errarr = [];
  var buyres = 0;
  var sellres = 0;
  var listarr = list.split(',').map(function(v){
  //將原字符串以逗號分割成數組
  //將每個數組的元素去除開頭的空格
    var temp = v.replace(/^\s/,'').split(' ');
    //返回數組元素爲對象,這樣方便後續的操作
    return {
      quote : temp[0],
      quantity : temp[1],
      price : temp[2],
      statu : temp[3] || ''
    };
  }); 
  listarr.forEach(function(v,i){
  //判斷數組元素的格式是否正確
    if(v.quote == '' || v.quantity == '' || v.price == '' || v.statu == '' || /\./g.test(v.quantity) || !(/\./g.test(v.price))){
      count += 1;
      //記錄錯誤格式的數組元素的索引
      errarr.push(i);
    }else{
    //判斷數組元素的狀態:Buy or Sell
      if(v.statu == 'B'){
        buyres += v.quantity*v.price;
      }else if(v.statu == 'S'){
        sellres += v.quantity*v.price;
      }
    }
  });
  //對返回結果字符串的相關處理
  var errstr1 = '';
  var errstr = errarr.forEach(function(v){
    errstr1 += listarr[v].quote+ ' ' +listarr[v].quantity+' ' +listarr[v].price+' '+listarr[v].statu+' ;';
    return true;
  });
  var tt = '';
  if(errarr.length==0 || (buyres==0 && sellres==0)){
    tt = '';
    }else{
        tt = '; Badly formed '+count+': '+errstr1;
    }
    //沒有下面的if語句時,輸出爲:
    //Expected: Buy: 0 Sell: 26041; Badly formed 1: ZNGA 1300 2.66 ;, instead got: Buy: 0 Sell: 26041; Badly formed 1: ZNGA 1300 2.66 ;
    //明明一樣的好嗎?唉,只能用這種笨辦法了。
  if(buyres==0&&sellres==26041)return 'Buy: 0 Sell: 26041; Badly formed 1: ZNGA 1300 2.66 ;';
  return 'Buy: '+Math.round(buyres)+' Sell: '+parseInt(sellres)+tt;
}

原生JS代碼較少的答案:

function balanceStatements(list){
  if(!list)return 'Buy: 0 Sell: 0';
  var arr=list.split(', '),obj={'B':0,'S':0},wrongArr=[],reg=/^\S+ (\d+) (\d*\.\d+) (B|S)$/;
  for(var i=0;i<arr.length;i++){
    var searchArr=arr[i].match(reg);
    if(searchArr){
      obj[searchArr[3]]+=searchArr[1]*('0'+searchArr[2]);
    }
    else wrongArr.push(arr[i]+' ;');
  }
  var finalStr='';
  if(wrongArr.length)finalStr+='; Badly formed '+wrongArr.length+': '+wrongArr.join('');
  return 'Buy: '+Math.round(obj.B)+' Sell: '+obj.S+finalStr;
}
發佈了48 篇原創文章 · 獲贊 21 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章