freeCodeCamp 고급 자바스크립트 알고리즘 체험

13853 단어
참고 블로그: 포도미주 야광배
1. 미국 유효 번호 확인(Validate US Telephone Numbers)
만약 입력 문자열이 유효한 미국 전화번호라면true로 돌아갑니다.사용자는 표에 임의로 유효한 미국 전화번호를 기입할 수 있다.다음은 몇 가지 유효한 번호의 예(그리고 아래 테스트에 사용된 변체 문법): 555-55555(555)555(555)55555555555555555555555555555555555551555555555555555555 이 절에서 800-692-7753 or8oo-six4276을 볼 수 있다.laskdjf 같은 문자열입니다.너의 임무는 앞에서 제시한 문자열이 유효한 미국 전화번호인지 검증하는 것이다.지역 번호는 반드시 있어야 한다.만약 문자열에 국가 코드가 제시된다면, 너는 반드시 그것이 1이라는 것을 검증해야 한다.번호가 유효하면true로 돌아가기;그렇지 않으면 false를 반환합니다.도움말 자료: RegExp 정규 표현식
//  :   ,         。
/* var re1=/^[1-9]\d{9}$/g;
  var re2=/^[1-9]\d{2}-[0-9]\d{2}-[0-9]\d{3}$/g;
  var re3=/^\([1-9]\d{2}\)[0-9]\d{2}-[0-9]\d{3}$/g;
  var re4=/^\([1-9]\d{2}\)\s[0-9]\d{2}-[0-9]\d{3}$/g;
  var re5=/^[1-9]\d{2}\s[0-9]\d{2}\s[0-9]\d{3}$/g;
  var re6=/^[1]\s[0-9]\d{2}\s[0-9]\d{2}\s[0-9]\d{3}$/g;
  var re7=/^[1]\s[0-9]\d{2}-[0-9]\d{2}-[0-9]\d{3}$/;
  var re8=/^[1]\s\([0-9]\d{2}\)\s[0-9]\d{2}-[0-9]\d{3}$/;
  var re9=/^[1]\([0-9]\d{2}\)[0-9]\d{2}-[0-9]\d{3}$/;
  //telephoneCheck("5554555555");
  //telephoneCheck("555-555-5555");
  //telephoneCheck("(555)555-5555");
  //telephoneCheck("(555) 555-5555")
  //telephoneCheck("555 555 5555")
  //telephoneCheck("1 555 555 5555")
  //telephoneCheck("1 555-555-5555")
  //telephoneCheck("1 (555) 555-5555")
  //telephoneCheck("1(555)555-5555") */

function telephoneCheck(str) {
  var re=/^[1-9]\d{9}$|^[1-9]\d{2}-[0-9]\d{2}-[0-9]\d{3}$|^\([1-9]\d{2}\)[0-9]\d{2}-[0-9]\d{3}$|^\([1-9]\d{2}\)\s[0-9]\d{2}-[0-9]\d{3}$|^[1-9]\d{2}\s[0-9]\d{2}\s[0-9]\d{3}$|^[1]\s[0-9]\d{2}\s[0-9]\d{2}\s[0-9]\d{3}$|^[1]\s[0-9]\d{2}-[0-9]\d{2}-[0-9]\d{3}$|^[1]\s\([0-9]\d{2}\)\s[0-9]\d{2}-[0-9]\d{3}$|^[1]\([0-9]\d{2}\)[0-9]\d{2}-[0-9]\d{3}$/g;
  console.log(str.match(re));  
  if(str.match(re)){
    console.log('true');
    return true;
  }else{
    console.log('false');
    return false;
  }
}
telephoneCheck("555-555-5555");

2. 등차(symmetric difference)
함수를 만들어 둘 이상의 배열을 수락하고 주어진 배열의 대등차분(symmetric difference) (△ or ⊕) 배열을 반환합니다.두 개의 집합(예를 들어 집합 A={1,2,3}과 집합 B={2,3,4})을 제시하고, 수학 용어인'대등차분'의 집합은 두 개의 집합 중 하나만 있는 모든 원소로 구성된 집합(A△B=C={1,4})을 말한다.전송된 추가 집합 (예: D = {2, 3}) 은 앞의 원칙에 따라 앞의 두 집합의 결과와 새 집합의 대등차분 집합 (C △ D = {1, 4} △ {2, 3} = {1, 2, 3, 4}) 을 구해야 한다.당신에게 도움이 될 자원: Array.reduce()
function sym(args) {
   var arr=[].slice.call(arguments);//       ;
  console.log(arr);
  var temp=arr.reduce(function(prev,cur,index,array){
    var a=prev.filter(function(item){
      return cur.indexOf(item)==-1;
    });//        ,             (  )
    var b=cur.filter(function(item){
      return prev.indexOf(item) < 0;
    });//       ,             (  )
    return a.concat(b);//     。       
  });
  console.log(temp);
  return temp.filter(function(item,index,array){
    return array.indexOf(item) == index;
  });
  //               ,             
  //           。
//                           index,           。
}
sym([1, 2, 3], [5, 2, 1, 4]);

사고1:[]에 관하여slice.all(arguments, 1)에 대한 사고 2: Reduce는 수조의 모든 요소에 대해 순서대로 리셋 함수를 실행한다. 수조에서 삭제되거나 부여되지 않은 요소를 포함하지 않고 네 가지 파라미터를 받아들인다. 첫 번째 값(또는 지난번 리셋 함수의 리셋 값), 현재 요소 값, 현재 인덱스, Reduce의 수조를 호출한다.리셋 함수가 처음 실행되었을 때previousValue와currentValue의 수치는 두 가지가 있는데 만약에 initialValue가 Reduce를 호출할 때 제공된다면 첫 번째previousValue는 initialValue와 같고currentValue는 그룹의 첫 번째 값과 같다.initialValue가 제공되지 않으면 previousValue는 그룹의 첫 번째 값과currentValue는 그룹의 두 번째 값과 같습니다.배열이 비어 있고 initialValue가 제공되지 않으면 TypeError가 표시됩니다.만약 그룹이 하나의 원소만 있고 (위치가 어떻든지) initialValue를 제공하지 않거나, initialValue를 제공하지만 그룹이 비어 있다면, 이 유일한 값은 되돌아오고 콜백은 실행되지 않습니다.예: 수조 구화-var total = [0, 1, 2, 3].reduce(function(a, b) { return a + b;});//total == 6
3. 잔돈 문제(Exact Change)
수납 프로그램 check Cash Register()를 설계하여 구매 가격(price)을 첫 번째 매개 변수로 하고 지불 금액(cash)을 두 번째 매개 변수로 하며 수납기 중의 잔돈(cid)을 세 번째 매개 변수로 한다.cid는 현재 사용할 수 있는 거스름돈을 저장하는 2차원 그룹입니다.수신기의 돈이 부족할 때 'Insufficient Funds' 문자열을 되돌려줍니다.적절한 경우 문자열 "Closed"를 반환합니다.그렇지 않으면, 되찾아야 할 잔돈 목록을 되돌려주고, 큰 것부터 작은 것까지 2차원 그룹에 저장합니다.
//       。panny——1  ,nickel——5  ,dime——1 ,quarter,25  ,one:1  ,...5  ,10  ,20  ,100  。
//        ,           ,        。
function checkCashRegister (price, cash, cid) {
    //    
    if(price==cash){
      return "No Need Back";
    }
    //     
    if (price > cash){
      return "Need More Money";
    }
    var base=100;//    ,      
    var change=(cash-price)*base; //  
    //      ,      。
    var getTotalMoney=function(arr){
        var totalMoney=0;
        arr.reduce(function (preV, currV, currIndex, array){
            totalMoney+=base*(preV[1]+currV[1]);
            return currV;
        });//    :     。
        return totalMoney;
    }
    //    ,    
    var remain = getTotalMoney(cid);
    if (remain==change){//           ,  closed
        return "Closed";    
    }else if(remain < change){//    
        return "Insufficient Funds";
    };
    //   :1 -5 -1 -5 -10 -20 -50 -100 (               :base   100)
    var dollar= [1, 5, 10, 25, 100, 500, 1000, 2000, 10000]; // TODO
    var pay={};//   key:dollar     ,value:         
    var currLast=0;//         
    var currMoney=0;//      (dollar     )
    for (var i=dollar.length-1;i>=0;i--){//      
        //        
        currLast=cid[i][1]*base;      
        if (currLast<=0) { 
            continue;//         0,  
        }
        //      
        currMoney=dollar[i];
        //                   :
        // 1.           ,    51 ,    50    。
        // 2.             ,   4 ,    3 1 ,        
        if(change>currMoney){//              
            if(change

4. 인벤토리 업데이트(Inventory Update)
새로 들어온 화물이 저장된 2차원 그룹에 따라 기존 재고(arr1에 저장된 2차원 그룹을 업데이트합니다.만약 화물이 이미 존재한다면 수량을 갱신합니다.만약 대응하는 화물이 없다면 그것을 수조에 넣고 최신 수량을 갱신합니다.현재 재고 그룹을 되돌려주고 화물 이름의 자모순으로 배열합니다.
//  :(1)         。   hasOwnProperty   ,   ,              。
//     (2)           :Object.keys(obj).sort(),        。            。
function updateInventory(arr1, arr2) {
  var oCur={};
  var oNew={};
  function arrToObj(arr,obj){
    for(var i=0;i

5, 반복 문자열 없음(No repeats please)
하나의 문자열의 문자를 다시 배열하여 새 문자열을 만들고, 새로 생성된 문자열에 연속적으로 반복되지 않은 문자열의 개수를 되돌려줍니다.연속 중복은 단일 문자만 기준으로 한다. 예를 들어 aab는 2를 되돌려야 한다. 총 6가지 배열이 있기 때문이다(aab, aab,aba,baa,baa). 그러나 두 개의 (aba and aba)만 연속 중복된 문자가 없다(이 예에서 a).
function permAlone(str) {

  //    
  var regex = /(.)\1+/g;

  //     
  var arr = str.split('');
  var permutations = [];
  var tmp;

  //       0,        。
  if (str.match(regex) !== null && str.match(regex)[0] === str) return 0;

  //     swap          。
  function swap(index1, index2) {
    tmp = arr[index1];
    arr[index1]=arr[index2];
    arr[index2]=tmp;
  }//     :ab,ba

  //             。
  function generate(int) {
    if(int === 1){//           ,         ,       。
      //                  
      permutations.push(arr.join(''));
    }else{
      for (var i=0; i

6, 날짜 구간 친화적(Friendly Date Ranges)
날짜 구간을 더욱 우호적으로 하세요!흔히 볼 수 있는 날짜 형식인 YYYY-MM-DD를 더욱 읽기 쉬운 형식으로 변환합니다.읽기 쉬운 형식은 월 이름으로 월 숫자를 대체하고, 숫자 대신 서수사로 날을 표시해야 한다. (1st는 1 대신)추측할 수 있는 정보를 표시하지 말라는 것을 기억해라. 만약 한 날짜 구간에서 종료 날짜와 시작 날짜의 차이가 1년보다 적으면 종료 날짜는 연도를 쓰지 않아도 된다.이 경우 월의 시작과 끝 날짜가 같은 달이면 끝 날짜도 월로 쓰지 않아도 된다.또한 시작 날짜 연도가 현재 연도이고 종료 날짜와 시작 날짜가 1년보다 적으면 시작 날짜 연도도 쓸 필요가 없다.예를 들어 현재 연도와 같은 달을 포함할 때makeFriendlyDates(["2017-01-02", "2017-01-05")는 [January 2nd","5th"]는 현재 연도를 포함하지 않고makeFriendlyDates(["2003-08-15","2009-09-21"))는 [August 15th, 2003", "September 21st, 2009"]로 돌아가야 한다.들어오는 날짜 구간을 포함한 모든 발생 가능한 상황을 고려하십시오.불합리한 날짜 구간에 대해undefined로 직접 되돌아가면 됩니다
function makeFriendlyDates(arr) {

  //      ,      1,      2
  var oDate1={},oDate2={};
  var reArr=[];
  for(var i=0;ioDate2["day"]){ //    
            delete oDate2["year"];
        }
    } 
  }

  //        。 json          。
  //        ,       ,         ,              。        。         
  function retArr(obj1,obj2){
    var returnArr=[];
    //            
    //                。   undefined。     。
    var objstr1=[obj1["month"],obj1["day"]+",",obj1["year"]].filter(function(a){return a!=undefined}).join(' ');
    var objstr2=[obj2["month"],obj2["day"]+",",obj2["year"]].filter(function(a){return a!=undefined}).join(' ');
    //
    if(objstr1.substring(objstr1.length-1)==','){
        
        objstr1=objstr1.replace(objstr1.substring(objstr1.length-1),'')
    }
    if(objstr2.substring(objstr2.length-1)==','){
        console.log(objstr1.substring(objstr1.length-1))
        objstr2=objstr2.replace(objstr2.substring(objstr2.length-1),'')
    }
    returnArr=[objstr1,objstr2];
    
    return returnArr;
  }
  console.log(retArr(oDate1,oDate2));
  return retArr(oDate1,oDate2);
}

makeFriendlyDates(["2016-07-01", "2016-07-04"]);
//makeFriendlyDates(["2016-12-01", "2017-02-03"]);
//makeFriendlyDates(["2016-12-01", "2018-02-03"]);
//makeFriendlyDates(["2017-03-01", "2017-05-05"]);
//makeFriendlyDates(["2018-01-13", "2018-01-13"]);
//makeFriendlyDates(["2022-09-05", "2023-09-04"]);
//makeFriendlyDates(["2022-09-05", "2023-09-05"])

7. 객체 구성(Make a Person)
아래에 주어진 방법으로 대상을 구성하다.방법은 getFirstName(), getLastName(), getFullName(), setFirstName(first), setLastName(last), andsetFullName(firstAndLast)이 있습니다.모든 매개 변수가 있는 방법은 문자열 매개 변수만 받아들인다.모든 방법은 실체 대상과만 상호작용한다.유용한 자료: Closures Details of the Object Model
function Person(fullName){
    
    this.getFirstName=function(){
        return fullName.split(' ')[0];
    };
    this.getLastName=function(){
        return fullName.split(' ')[1];
    };
    this.getFullName=function(){
        return fullName;
    };

    this.setFirstName=function(firstName){
        var arr=fullName.split(' ');
        arr.splice(0,1,firstName)  
        fullName=arr.join(' ');   
    };
    this.setLastName=function(lastName){
        var arr=fullName.split(' ');
        arr.splice(1,1,lastName); 
        fullName=arr.join(' ');  
    };
    this.setFullName=function(name){
        fullName=name;
    };

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

8、지도의 파편(Map the Debris)
하나의 수조로 되돌아오는데 그 내용은 원수조에서 대응하는 원소의 평균 해발을 대응하는 궤도 주기로 바꾸는 것이다.원래 수조에는 포맷된 대상 내용이 포함되어 있습니다. 이렇게 {name:'name ', avgAlt: avgAlt}.궤도 주기를 어떻게 구하는지는 여기 온 위키백과를 찍으세요.구한 값은 마땅히 그와 가장 가까운 정수여야 하며, 궤도는 지구를 기준으로 한다.지구 반경은 6367.4447 kilometers이고 지구의 GM 값은 398600.4418이며 원주율은 Math이다.PI 이것은 당신에게 도움이 되는 자원들입니다: Math.pow()
//      6367.4447 kilometers,    GM   398600.4418,     Math.PI
//orbitalPeriod([{name : "sputnik", avgAlt : 35873.5553}])      [{name: "sputnik", orbitalPeriod: 86400}].
//orbitalPeriod([{name: "iss", avgAlt: 413.6}, {name: "hubble", avgAlt: 556.7}, {name: "moon", avgAlt: 378632.553}])      [{name : "iss", orbitalPeriod: 5557}, {name: "hubble", orbitalPeriod: 5734}, {name: "moon", orbitalPeriod: 2377399}].
function orbitalPeriod(arr) {
  var GM = 398600.4418;
  var earthRadius = 6367.4447;
  return arr;
}
orbitalPeriod([{name : "sputnik", avgAlt : 35873.5553}]);
//            。         , GMm/R^2=mrω^2 ω=2π/T,R=r+h,  T=2π(r+h)·sqr((r+h)/GM)。

function orbitalPeriod(arr) { 
  var GM = 398600.4418;
  var earthRadius = 6367.4447;
  for(var i=0;i

9、당신의 짝을 찾으세요(Pairwise)
당신의 짝을 찾으면 우수한 프로그래머가 대상을 대상으로 프로그래밍을 잘한다고 하지만 짝을 자주 찾지 못하는 이유는 무엇일까요?당신은 항상 자신을 프로그래머로 국한시키고 자신의 생각을 열지 않기 때문이다.공동체의 시대야. 여기서 너는 너와 같은 가치관을 가지고 있지만 서로 보완하는 짝을 찾아야 해.예를 들어 당신은 프로그래밍 능력이 강하고 평가가 11점입니다. 만약에 20점을 베스트 커플로 계산한다면 디자인 능력이 강하고 평가가 9점인 여자를 찾아야 합니다.그렇다면 디자인 능력이 9점인 여자를 만나면 주저하지 말고 대담하게 고백하라.절대 뒤의 참외가 앞의 참외보다 달다고 생각하지 마세요.예를 들어 하나의 능력 수조[7,9,11,13,15]가 있는데 최적 조합치가 20으로 계산하면 7+13과 9+11 두 가지 조합만 있다.7은 수조에 있는 인덱스가 0이고 13은 수조에 있는 인덱스가 3이며 9는 수조에 있는 인덱스가 1이고 11은 수조에 있는 인덱스가 2이다.그래서 우리는 함수:pairwise([7,9,11,13,15],20)의 반환값은 0+3+1+2의 합, 즉 6이어야 한다고 말한다.테이블에서 배열의 인덱스와 값 관계를 보다 직관적으로 볼 수 있습니다: Index 0 1 2 3 4 Value 7 9 11 13 15
//  :                     。      false 。
function pairwise(arr, arg) {
  var arr2=arr;
  var count=0;
  for(var j=0;j

PS: 잠시 다른 사람의 블로그를 참조하여 정리 운행하였습니다. 아직 상세한 연구를 하지 못했습니다. 여러분의 댓글과 개인 편지 교류를 환영합니다.

좋은 웹페이지 즐겨찾기