Freecodecampブラシ記録-フロントエンドの高度なアルゴリズム

11959 ワード

Validate US Telephone Numbers入力文字列が有効なアメリカの電話番号である場合、trueを返します.
ユーザは、フォームに任意の有効な米国電話番号を記入することができる.次に、有効な番号の例を示します(次のテストで使用する変形の書き方もあります).
555-555-5555(555)555-5555(555)555-5555 5555 555555 1 555 5555 555 5555この節では800-692-7753 or 8 oo-six 427676のように見えます.laskdjfという文字列.あなたの任務は、前に与えられた文字列が有効なアメリカの電話番号であるかどうかを検証することです.区番は必須です.文字列に国コードが指定されている場合は、1であることを確認する必要があります.番号が有効であればtrueを返します.そうでなければfalseに戻る.
function telephoneCheck(str) {
  //  
    var reg = new RegExp(/^(1\s?)?((\(\d{3}\))|\d{3})[\s-]?\d{3}[\s-]?\d{4}$/);
    if (str.search(reg)>=0){
        return true;
    }

    return false;
}

str = telephoneCheck("1(555)555-5555");

console.log(str);

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})を求めるべきである.
function sym() {
    if (arguments.length === 2){
        var arr1 = arguments[0];
        var arr2 = arguments[1];

        var tempArr = [];
        return arr1.filter(function(item){
            if (Array.from(arr2).indexOf(item) >= 0){
                return false;
            }
            return true;
        }).concat(arr2.filter(function(item){
            if (Array.from(arr1).indexOf(item) >= 0){
                return false;
            }
            return true;
        })).filter(function(item){ // 
            if (tempArr.indexOf(item) >= 0){
                return false;
            }
            else {
                tempArr.push(item);
                return true;
            }
        });

    }
    else if(arguments.length > 2){
        var newArgs = [];
        var oldArgs = arguments;
        newArgs.push(sym(arguments[0], arguments[1]));
        for (var i=2; i

tip1:sym.apply(this, newArgs);//配列をパラメータとして渡すには、パラメータが配列ではないため、apply(newArgs)を直接使用する必要があります.
tip 2:配列を重くする必要があることに注意してください.
Exact Changeは、購入価格(price)を第1のパラメータとし、支払金額(cash)を第2のパラメータとし、レジにおける小銭(cid)を第3のパラメータとするレジプログラムcheckCashRegister()を設計する.
cidは2次元配列であり、現在利用可能なお釣りが保存されている.
レジのお金が足りない場合は文字列「Insufficient Funds」を返します.文字列"Closed"を返します.
そうでなければ、回収すべき小銭のリストが戻る、2次元配列に大きいから小さいまで存在する.
function checkCashRegister(price, cash, cid) {
    var change = [];
    // , 。
    var VALUE = [1, 5, 10, 50, 100, 500, 1000, 2000, 10000];
    var money = (cash - price) * 100;
    cid = cid.map(function(item){
        item[1] *= 100;
        return item;
    });

    var i = 8;
    while (money > 0){
        if (i<0){
            return "Insufficient Funds";
        }

        var sum = 0;
        while (money>=VALUE[i] && cid[i][1]>0){
            money -= VALUE[i];
            cid[i][1] -= VALUE[i];
            sum += VALUE[i];
        }

        if (sum>0){
            // temp=cid , temp cid , 
            var temp = cid.slice(); // this is how to make a copy 
            temp[1] = sum / 100;
            change.push(temp);
        }

        i--;
    }

    // 
    for (i=0; i<9; i++){
        if (cid[i][1]>0){
            return change;
        }
    }

    return "Closed";
}

str = checkCashRegister(19.50, 20.00, [["PENNY", 0.50], ["NICKEL", 0], ["DIME", 0], ["QUARTER", 0], ["ONE", 0], ["FIVE", 0], ["TEN", 0], ["TWENTY", 0], ["ONE HUNDRED", 0]]); 
console.log(str);


tips 1:配列はポインタです!他の配列に値を付けると、ポインタが過去に伝わり、新しい配列が変わると元の配列に影響します!!!
            console.log('before:' + cid[i]);
            var temp = cid;
            temp[i][1] = sum / 100;
            console.log('after:' + cid[i]);

印刷結果:
before:PENNY,0
freecodecamp.js:28 after:PENNY,0.5

参考:javascriptでは、1つの配列の内容をすべて別の配列に割り当てます.ブログ
Inventory Update
function updateInventory(arr1, arr2) {
    for (var j=0; jarr1[i][1]){
            i++;
        }
        console.log(i);
        if (i===arr1.length){
            arr1.push(arr2[j]);
        }
        else{
            // 
            if (arr1[i][1] === arr2[j][1]){
                arr1[i][0] += arr2[j][0];
            }
            // 
            else{
                var tempArr = arr1.slice(0, i);
                tempArr.push(arr2[j]);
                arr1 = tempArr.concat(arr1.slice(i));
            }

        }

    }
    return arr1;
}

var curInv = [
    [21, "Bowling Ball"],
    [2, "Dirty Sock"],
    [1, "Hair Pin"],
    [5, "Microphone"]
];
var newInv = [
    [2, "Hair Pin"],
    [3, "Half-Eaten Apple"],
    [67, "Bowling Ball"],
    [7, "Toothpaste"]
];

str = updateInventory(curInv, newInv);

console.log(str);



tips 1:次のコードが書かれています.
for (var j=0; j arr1[i][1][0]){
            i++;
        }
        ……
}

エラー:freecodecamp.js:6 Uncaught TypeError: Cannot read property '1' of undefined
最初はarr 2を多次元配列と見なすことはできないと思っていたが,それを直接標を外した.その結果、パラメータを直接多次元配列と見なすのは問題なく、エラーはiの範囲を制限していないので、私は境界を越えました!!!
tips 2:文字列は直接サイズを比較することができ、最初の異なる文字のascii値コードに基づいて比較され、数字(number)と文字列(string)が比較的大きい場合、数値(number)を文字列(string)に強制的に変換して比較されます.例:
console.log('13'>'3'); //  :false, '1'

No repeats please
1つの文字列の中の文字を並べ替える新しい文字列を生成し、新しく生成された文字列の中で連続的に重複する文字がない文字列の個数を返す.連続繰り返しは1文字のみ
例えば、aabは、合計6に配列する(aab,aab,aba,aba,baa,baa)ため、2を返すべきであるが、連続的に繰り返される文字(本例ではa)は2つしかない.
function swap(array, i, j){
    if (i!=j){
        var temp = array[i];
        array[i] = array[j];
        array[j] = temp;
    }
}


function permAlone(str){
    var count = 0;

    function allSort(array, start, end) {
        if (start < end - 1){
            for (var i=start; i

フロントエンドアルゴリズムの中で最も難しい問題だと感じて、再帰的な考え方を使います.
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に直接戻ればよい
function dayAppendix(day){
    var str;
    switch (day){
    case 1: 
    case 21:
    case 31: str = "st";break;
    case 2:
    case 22: str = "nd";break;
    case 3:
    case 23: str = "rd";break;
    default: str = "th";
    }
    return str; 
}

function makeFriendlyDates(arr) {
    var d1 = arr[0].split('-').map(function(item){
        return parseInt(item);
    });
    var d2 = arr[1].split('-').map(function(item){
        return parseInt(item);
    });

    if ((d1[0]>d2[0]) || 
        (d1[0]===d2[0] && d1[1]>d2[1]) || 
        (d1[0]===d2[0] && d1[1]===d2[1] && d1[2]>d2[2])){
        return undefined;
    }

    var Month = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];
    var retArr = [];

    var str1 = Month[d1[1]-1] + " " + d1[2];
    var str2 = "";

    str1 += dayAppendix(d1[2]);

    var withinAYear = false;

    var deltaY = d2[0] - d1[0];
    var deltaM = d2[1] - d1[1];
    var deltaD = d2[2] - d1[2];

    if ((deltaY===0)||
        (deltaY===1 && deltaM<0)||
        (deltaY===1 && deltaM===0 && deltaD<0)){
        withinAYear = true;
    }

    var curYear = 2017;
    if (d1[0]!==curYear || !withinAYear){
        str1 = str1 + ', ' + d1[0];
    }
    retArr.push(str1);

    if (deltaY===0 && deltaM===0 && deltaD===0){
        return retArr;
    }

    if (d1[0]!==d2[0] || d1[1]!==d2[1] || !withinAYear){
        str2 += Month[d2[1]-1] + ' ';
    }
    str2 += d2[2];

    str2 += dayAppendix(d2[2]);


    if (!withinAYear){
        str2 = str2 + ', ' + d2[0];
    }

    retArr.push(str2);

    return retArr;

}


str =makeFriendlyDates(["2010-10-23", "2011-10-22"]);


console.log(str);

tips 1:英語の日付略記は語尾から判別され、すなわち、個位が1でst、個位が2でnd、個位が3でrd、その他の個位がthであるが、11,12,13は例外でthを用いる.(読み方によって、elevenはいつもstを加えることができないでしょう)tips 2:複数の条件を書いて、論理を試算して、比較的に明らかにしやすいです.tips 3:「開始日と終了日が同じ月の場合」は、同じ年&&同じ月を指します.
Make a Person
JavaScriptなどのプロトタイプベースの言語では、オブジェクトのみの違いはありません.プロトタイプベースの言語には,いわゆるプロトタイプオブジェクトの概念がある.プロトタイプオブジェクトはテンプレートとして使用でき、新しいオブジェクトは元のプロパティを取得できます.任意のオブジェクトは、作成時でも実行時でも作成できる独自のプロパティを指定できます.また、任意のオブジェクトを別のオブジェクトのプロトタイプとして使用することができ、後者が前者のプロパティを共有できるようにします.
JavaScriptコンストラクション関数およびプロトタイプオブジェクト-王浴昊-CSDNブログ
var Person = function(firstAndLast) {
    var arr = firstAndLast.split(' ');
    var firstName = arr[0];
    var lastName = arr[1];

    this.getFirstName = function(){
        return firstName;
    };
    this.getLastName = function(){
        return lastName;
    };
    this.getFullName = function(){
        return firstName + ' ' + lastName;
    };
    this.setFirstName = function(first){
        firstName = first;
    };
    this.setLastName = function(last){
        lastName = last;
    };
    this.setFullName = function(fullName){
        firstAndLast = fullName;
        var tempArr = fullName.split(' ');
        firstName = tempArr[0];
        lastName = tempArr[1];
    };
};

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

Mapthe Debrisは、元の配列の対応する要素の平均海抜を対応する軌道周期に変換する配列を返す.
元の配列にはフォーマットされたオブジェクトの内容が含まれ、このように{name: 'name', avgAlt: avgAlt}である.
軌道周期がどのように求められるかについては、ここon wikipedia(英語を見たくなければ軌道高さで軌道周期を計算する公式を自分で検索することができる).
求めた値は最も近い整数であるべきで、軌道は地球を基準としている.
地球の半径は6367.4447 kilometersで、地球のGM値は398600.4418で、円周率はMathである.PI
function orbitalPeriod(arr) {
    var GM = 398600.4418;
    var earthRadius = 6367.4447;
    return arr.map(function(obj){
        var R = (obj.avgAlt + earthRadius);

        var retObj = {};
        retObj.name = obj.name;
        retObj.orbitalPeriod = Math.round(2 * Math.PI * R * Math.pow(R/GM, 0.5));

        return retObj;
    });
}

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

console.log(str);

Pairwiseはあなたのパートナーを見つけた
優秀なプログラマーはオブジェクト向けのプログラミングが得意だと言われていますが、相手が見つからないことが多いのはなぜですか.あなたはいつも自分をプログラマーに限定して、自分の思考を開いていないからです.
これはコミュニティの時代ですね.ここではあなたと同じ価値観を持っているが、補完的なパートナーを見つけるべきです.
例えば、プログラミング能力が強く、推定値が11点で、20点を最適なカップルとして計算すると、設計能力が強く、推定値が9点の女の子を探すべきです.
では、9点のデザイン能力を持つ女性に出会ったら、決してためらわないで、大胆に告白してください.後ろの瓜が前の瓜より甘いと思ってはいけないよ.
例を挙げると、能力配列[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 flag = [];
    var sum = 0;

    for (var i=0; i