Homelab, Linux, JS & ABAP (~˘▾˘)~

# [JavaScript] Algorithms and Data Structures Projects

These are my notes while doing the course JavaScript Algorithms and Data Structures on https://www.freecodecamp.org. I highly recommend it if you prefer to try things directly rather than watching videos.

1. Palindrome Checker

```function palindrome(str) {

// clear string
str = str.toLowerCase().replace(/[^a-z0-9]/g, "");

// reverse string
let strBack = str.split("").reverse().join("");

// palindrome?
return (str === strBack) ? true : false;

}

palindrome("_eye");
palindrome("five|\_/|four");
palindrome("1 eye for of 1 eye.");
```

2. Roman Numeral Converter

```function convertToRoman(num) {

const lookup = {M:1000,CM:900,D:500,CD:400,C:100,XC:90,L:50,XL:40,X:10,IX:9,V:5,IV:4,I:1};
let roman = '';

for ( let i in lookup ) {
while ( num >= lookup[i] ) {
roman += i;
num -= lookup[i];
}
}
return roman;
}

convertToRoman(6);
```

3. Caesars Cipher

```function rot13(str) {

const alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
const length = alphabet.length;
let decode = "";

const getROT13 = index => {
return (index+13 >= length) ? alphabet[13-(length-index)] : alphabet[index+13];
}

for (let i=0; i<str.length; i++) {

let index = alphabet.indexOf(str[i]);

decode += (index<0) ? str[i] : getROT13(index);

}

return decode;
}

rot13("SERR PBQR PNZC")
rot13("SERR CVMMN!")
```

4. Telephone Number Validator

```function telephoneCheck(str) {

let regexCheck = /^(1.*){0,1}(\d{3}|[(]\d{3}[)])[\s|-]*\d{3}.*\d{4}\$/g;

let result = regexCheck.test(str);

if (result) {
let length = str.match(/\d/g).length;
result = (length == 7 || length == 10 || (length == 11 && str[0] == 1)) ? true : false;
}

console.log(str.match(regexCheck));
console.log(result);

return result;

}

telephoneCheck("555-555-5555");
telephoneCheck("1 555-555-5555");
telephoneCheck("1 (555) 555-5555");
telephoneCheck("5555555555");
telephoneCheck("555-555-5555")
telephoneCheck("(555)555-5555")
telephoneCheck("1(555)555-5555")
telephoneCheck("1 555)555-5555") //false
telephoneCheck("(6054756961)")  //false
telephoneCheck("2 (757) 622-7382") //false
telephoneCheck("10 (757) 622-7382") //false
```

5. Cash Register

```function checkCashRegister(price, cash, cid) {

let changeArr = [];

const currency = { "ONE HUNDRED": 100, "TWENTY": 20, "TEN": 10, "FIVE": 5, "ONE": 1, "QUARTER": 0.25, "DIME": 0.1, "NICKEL": 0.05, "PENNY": 0.01 }

const substract = (a, b) => parseFloat(a - b).toPrecision(4);

const calcAmount = (change, curr) => {
let rest = change % curr;
let div = substract(change, rest) / curr;
return div * curr;
}

let change = substract(cash, price);

//check if cid equals to change
//or if cid is already not enough
let sum = 0;
for (let k=0; k<cid.length;k++) {
sum += cid[k][1]
}
if (sum == change) {
return {status: "CLOSED", change: cid};
} else if (sum < change) {
return {status: "INSUFFICIENT_FUNDS", change: []};
}

//calculate change
for (let i in currency) {
if (change > currency[i]) {
for (let j=0; j<cid.length;j++) {
if (i == cid[j][0]) {
let amount = cid[j][1];
if (substract(change, amount) < 0)  {
amount = calcAmount(change, currency[i]);
}
change = substract(change, amount);
changeArr.push([i, amount]);
}
}
}
}

if (change != 0) {
//not able to give the correct change
return {status: "INSUFFICIENT_FUNDS", change: []};
}
return {status: "OPEN", change: changeArr};
}

checkCashRegister(19.5, 20, [["PENNY", 1.01], ["NICKEL", 2.05], ["DIME", 3.1], ["QUARTER", 4.25], ["ONE", 90], ["FIVE", 55], ["TEN", 20], ["TWENTY", 60], ["ONE HUNDRED", 100]]);

checkCashRegister(3.26, 100, [["PENNY", 1.01], ["NICKEL", 2.05], ["DIME", 3.1], ["QUARTER", 4.25], ["ONE", 90], ["FIVE", 55], ["TEN", 20], ["TWENTY", 60], ["ONE HUNDRED", 100]])

checkCashRegister(19.5, 20, [["PENNY", 0.01], ["NICKEL", 0], ["DIME", 0], ["QUARTER", 0], ["ONE", 0], ["FIVE", 0], ["TEN", 0], ["TWENTY", 0], ["ONE HUNDRED", 0]])

checkCashRegister(19.5, 20, [["PENNY", 0.01], ["NICKEL", 0], ["DIME", 0], ["QUARTER", 0], ["ONE", 1], ["FIVE", 0], ["TEN", 0], ["TWENTY", 0], ["ONE HUNDRED", 0]])

checkCashRegister(19.5, 20, [["PENNY", 0.5], ["NICKEL", 0], ["DIME", 0], ["QUARTER", 0], ["ONE", 0], ["FIVE", 0], ["TEN", 0], ["TWENTY", 0], ["ONE HUNDRED", 0]])
```