Freecodecamp高度なアルゴリズムの問題

11084 ワード

Freecodecamp高度なアルゴリズムの問題


1. Validate US Telephone Numbers


入力文字列が有効なアメリカの電話番号である場合、trueを返します.
ユーザは、フォームに任意の有効な米国電話番号を記入することができる.次に、有効な番号の例を示します(次のテストで使用する変形の書き方もあります).
555-555-5555 (555)555-5555 (555) 555-5555 555 555 5555 5555555555 1 555 555 5555
function telephoneCheck(str) {
  //^1? 1 ,1 0 1 
  //\(\d{3}\) ( 0-9 , \
  // \d{3} 0-9 
  //\s? 0 1 
  //[\s\-]? - 0 1 
  //\d{4}$ 4 ($)
  var regex = /^(1?\s?)?(\(\d{3}\)|\d{3})[\s\-]?(\d{3})[\s\-]?(\d{4})$/g;
  return regex.test(str);
}

telephoneCheck("1 555 555 5555");

2. Symmetric Difference


2つ以上の配列を受け入れる関数を作成し、与えられた配列の対等差分(symmetric difference)(△or
2つの集合(例えば集合A={1,2,3}と集合B={2,3,4})を与えるが、数学用語「対等差分」の集合は、2つの集合のうちの1つのみの要素からなるすべての集合(A△B=C={1,4})を指す.D={2,3}のような追加の集合については、前の原則をインストールして、前の2つの集合の結果と新しい集合の対等差分集合(C△D={1,4}△{2,3}={1,2,3,4})を求めるべきである.参照リンク方法1:
function getSym(arr1, arr2) {
    //  , 
    var result = arr1.filter(function(e) {
        return arr2.indexOf(e) === -1;
    });

    //  , 
    result.concat(arr2.filter(function(e) {
        return arr1.indexOf(e) === -1;
    }))
    
    //  
    return result.filter(function(e, i) {
        return result.indexOf(e) === i;
    })
}

方法2:
/*jshint esversion: 6 */
function sym(args) {
 var arr = Array.from(arguments); 
  return arr.reduce((arr1,arr2)=>{
   return arr1.concat(arr2).filter(val=>{
     return arr1.indexOf(val) == -1 || arr2.indexOf(val) ==-1; 
   }).filter((val, index, arr) => {
      return arr.indexOf(val) === index;
    });
  });
}

sym([1, 2, 3], [5, 2, 1, 4]);

2. Exact Change


購入価格(price)を第1のパラメータとし、支払金額(cash)を第2のパラメータとし、レジの小銭(cid)を第3のパラメータとするレジプログラムcheckCashRegister()を設計する.
cidは2次元配列であり、現在利用可能なお釣りが保存されている.
レジのお金が足りない場合は文字列「Insufficient Funds」を返します.文字列"Closed"を返します.
そうでなければ、回収すべき小銭のリストが戻る、2次元配列に大きいから小さいまで存在する.
function checkCashRegister(price, cash, cid) {
  var denom = [
  { name: 'ONE HUNDRED', val: 100.00},
  { name: 'TWENTY', val: 20.00},
  { name: 'TEN', val: 10.00},
  { name: 'FIVE', val: 5.00},
  { name: 'ONE', val: 1.00},
  { name: 'QUARTER', val: 0.25},
  { name: 'DIME', val: 0.10},
  { name: 'NICKEL', val: 0.05},
  { name: 'PENNY', val: 0.01}
];
  var change = cash - price;
  var totalCid = cid.reduce(function(acc,curr){
    acc.total += curr[1];
    acc[curr[0]] = curr[1];
    return acc;
  },{total:0});
  
  if (totalCid.total === change) {
    return 'Closed';
  }

  if (totalCid.total < change) {
    return 'Insufficient Funds';
  }  
  
  var change_arr = denom.reduce(function(acc,curr){
    var value=0;
    while(totalCid[curr.name]>0 && change>=curr.val){
      change-=curr.val;
      totalCid[curr.name]-=curr.val;
      value += curr.val;
      change = Math.round(change * 100) / 100;
    }
    if(value>0){
      acc.push([ curr.name, value ]);
    }
    return acc;
  },[]);
  
  if (change_arr.length < 1 || change > 0) {
    return "Insufficient Funds";
  }
  return change_arr;
}

// Example cash-in-drawer array:
// [["PENNY", 1.01],
// ["NICKEL", 2.05],
// ["DIME", 3.10],
// ["QUARTER", 4.25],
// ["ONE", 90.00],
// ["FIVE", 55.00],
// ["TEN", 20.00],
// ["TWENTY", 60.00],
// ["ONE HUNDRED", 100.00]]

checkCashRegister(19.50, 20.00, [["PENNY", 1.01], ["NICKEL", 2.05], ["DIME", 3.10], ["QUARTER", 4.25], ["ONE", 90.00], ["FIVE", 55.00], ["TEN", 20.00], ["TWENTY", 60.00], ["ONE HUNDRED", 100.00]]);

3. Inventory Update


新規の荷物が格納2次元配列に従って、既存の在庫(arr 1)が格納2次元配列を更新する.貨物が既に存在する場合、更新数量.対応する貨物がない場合はそれを配列に加える、最新の数量を更新する.現在の在庫配列を返し、貨物名のアルファベット順に並べます.
function updateInventory(arr1, arr2) {
  for(var i=0;i

4. No repeats please


1つの文字列の中の文字を並べ替える新しい文字列を生成し、新しく生成された文字列の中で連続的に重複する文字がない文字列の個数を返す.連続繰り返しは1文字のみ
例えば、aabは、合計6に配列する(aab,aab,aba,aba,baa,baa)ため、2を返すべきであるが、連続的に繰り返される文字(本例ではa)は2つしかない.
function permAlone(str) {
  var arr = str.split('');
  var result = 0;
  
  function swap(a,b){
    var tmp = arr[a];
    arr[a] = arr[b];
    arr[b] = tmp;
  }
  
  
  function generate(n){
    var regex = /([a-z])\1+/;
    
    if(n===1 && !regex.test(arr.join(''))){
      result++;
    }else{
      for(var i=0;i!==n;i++){
        generate(n-1);
        swap(n%2 ? 0:i,n-1);
      }
    }
  }
  
  generate(arr.length);
  return result;
  
  
}

permAlone('aab');

5. Friendly Date Ranges


日付区間をもっとフレンドリーに!
一般的な日付フォーマット、例えばYYYY-MM-DDをより読みやすいフォーマットに変換します.
読みやすいフォーマットは月の名前で月の数字に代わるべきで、数字の代わりに序数語で日を表す(1 stは1に代わる).
推測できる情報を表示しないでください.日付区間の終了日と開始日の差が1年未満の場合、終了日に年を書く必要はありません.この場合、月の開始日と終了日が同じ月であれば、終了日の月も書く必要はありません.
また、開始日の年が現在の年であり、終了日と開始日が1年未満の場合は、開始日の年も書かなくてもよい.
例:
現在の年と同じ月を含む場合、makeFriendly Dates(「2017-01-02」,「2017-01-05」)は[「January 2 nd」,「5 th」)を返すべきである.
現在の年は含まれておらず、makeFriendlyDates(["2003-08-15","2009-09-21"])は[[August 15 th,2003],[September 21 st,2009]]を返すべきである.
転送される日付区間を含め、発生する可能性のあるすべての状況を考慮してください.不合理な日付区間についてはundefinedに直接戻ればよい
let makeFriendlyDates = arr => {  
  const months = {"01" : "January","02" : "February","03" : "March", "04" : "April","05" : "May", "06" : "June", "07" : "July","08" : "August", "09" : "September","10" : "October", "11" : "November","12" : "December"  };  
  let date1 = arr[0].split("-"); 
  let date2 = arr[1].split("-");
  let date = new Date();  
  let dateChange = day => {  
    if(day[0] === "0"){  
      day = day.substr(1);  
      if(day === "1") return day + "st";  //01->1st
      if(day === "2") return day + "nd";  //02->2nd
      if(day === "3") return day + "rd";  //03->3rd
      else return day + "th";  
    }  
    else{  
      if(day.substr(1,1) === "1" && day.substr(0,1) === "2") return day + "st";  //21->21st
      if(day.substr(1,1) === "1" && day.substr(0,1) === "3") return day + "st";  //31->31st
      if(day.substr(1,1) === "2" && day.substr(0,1) === "2") return day + "nd";  //22->22nd
      if(day.substr(1,1) === "3" && day.substr(0,1) === "2") return day + "rd";  //23->23rd
      else return day + "th";   
    }    
  };  
  let sameYear = (d1, d2) => {  
    if(d2[0] - d1[0] > 1) return false;  
    else{  
      if(d1[0] === d2[0]) return true;   
      else{  // 1 
        if(d2[1] > d1[1]) return false;  
        if(d2[1] < d1[1]) return true; // true
        else return d2[2] < d1[2] ? true : false; // 
      }  
    }  
  };  
  if (sameYear(date1, date2)) { 
    if(date1[0] === date2[0]){  
      if(date1[1] === date2[1]){  //  
        if(date1[2] === date2[2]){  // 
          let dateArr = [];  
          dateArr.push(months[date1[1]] + " " + dateChange(date1[2]) + ", " + date1[0]);  
          return dateArr;  
        }else{  
          let dateArr = [];  
          dateArr.push(months[date1[1]] + " " + dateChange(date1[2]));  
          dateArr.push(dateChange(date2[2]));  
          return dateArr;  
        }  
      }
      else{  // 
        let dateArr = [];  
        dateArr.push(months[date1[1]] + " " + dateChange(date1[2]));  
        dateArr.push(months[date2[1]] + " " + dateChange(date2[2]));  
        return dateArr;  
      }  
    }  
    if(date1[0] == date.getFullYear() - 2){  //  
      let dateArr = [];  
      dateArr.push(months[date1[1]] + " " + dateChange(date1[2]));  
      dateArr.push(months[date2[1]] + " " + dateChange(date2[2]));  
      return dateArr;  
    }  
    else{  
      let dateArr = [];  
      dateArr.push(months[date1[1]] + " " + dateChange(date1[2]) + ", " + date1[0]);  
      dateArr.push(months[date2[1]] + " " + dateChange(date2[2]));  
      return dateArr;  
    }  
  }    
  if (date2[0] > date1[0]){  // d2 d1 
    let dateArr = [];  
    dateArr.push(months[date1[1]] + " " + dateChange(date1[2]) + ", " + date1[0]);  
    dateArr.push(months[date2[1]] + " " + dateChange(date2[2]) + ", " + date2[0]);  
    return dateArr;  
  }  
};  
makeFriendlyDates(["2017-07-12", "2018-06-13"]);

6. Make a Person


以下に示す方法でオブジェクトを構築する.
方法はgetFirstName(),getLastName(),getFullName(),setFirstName(first),setLastName(last),and setFullName(firstAndLast).
パラメータを持つすべての方法は1つの文字列パラメータのみを受け入れる.
すべてのメソッドはエンティティオブジェクトとのみインタラクティブです.
var Person = function(firstAndLast) {
  var fullName = firstAndLast;
  
  
  this.getFirstName=function(){
    return fullName.split(' ')[0];
  };
  
  this.getLastName=function(){
    return fullName.split(' ')[1];
  };
  
  this.getFullName=function(){
    return fullName;
  };
  
  this.setFirstName=function(first){
    fullName =  first+' '+ fullName.split(' ')[1];
  };
  
  this.setLastName=function(last){
    fullName =  fullName.split(' ')[0]+' '+ last;
  };
  this.setFullName=function(firstAndLast){
    fullName = firstAndLast;
  };
    return fullName;
};

var bob = new Person('Bob Ross');
bob.getFullName();

7. Map the Debris


元の配列の対応する要素の平均海抜を対応する軌道周期に変換する配列を返す.
元の配列にはフォーマットされたオブジェクトの内容が含まれ、このように{name:'name',avgAlt:avgAlt}.
function orbitalPeriod(arr) {
  var GM = 398600.4418;
  var earthRadius = 6367.4447;
  
  arr.forEach(function(item){
    item.orbitalPeriod=Math.round(2*Math.PI*Math.sqrt(Math.pow(earthRadius+item.avgAlt,3)/GM));
    delete item.avgAlt;
  });
  return arr;
}

orbitalPeriod([{name : "sputnik", avgAlt : 35873.5553}]);

9. Pairwise


能力配列[7,9,11,13,15]があり、最適な組合せ値20で計算すると、7+13と9+11の2つの組合せしかありません.一方,7は配列のインデックスが0,13は配列のインデックスが3,9は配列のインデックスが1,11は配列のインデックスが2である.したがって,関数:pairwise([7,9,11,13,15%,20)の戻り値は0+3+1+2の和,すなわち6であるべきである.
function pairwise(arr, arg) {
  var sum=0;
  var pairArr = arr.slice();
  for(var i=0;i