Comprobador Palindromos

Consigna

Devuelve true si la cadena proporcionada es un palíndromo. De lo contrario, devuelve false.

Un palíndromo es una palabra o frase que se escribe de la misma manera hacia adelante y hacia atrás, ignorando la puntuación, mayúsculas, minúsculas y espaciado.

Nota: Tendrás que eliminar todos los caracteres no alfanuméricos (puntuación, espacios y símbolos) y convertir todo en mayúsculas o minúsculas para comprobar si hay palíndromos.

Pasaremos cadenas con formatos variables, como racecar, RaceCar y race CAR entre otros.

También pasaremos cadenas con símbolos especiales, como 2A3*3a2, 2A3 3a2 y 2_A3*3#A2.

CÓDIGO:

const searchChar = (arrChars, indexStart, indexMakeCut) => arrChars.slice(indexStart, arrChars.length - indexMakeCut); function palindrome(str) { let strToLower = str.toLowerCase(); let arrStr = strToLower.split(""); let arrChars = arrStr.filter((item) => /[a-zA-Z0-9]/.test(item)); let cutArrayInHalf = parseInt(arrChars.length / 2); let isPalin = true; let indexStart = -1; let indexMakeCut = 0; for (let i = 0; i < cutArrayInHalf; i++) { let lastCharToCompare = searchChar(arrChars, indexStart, indexMakeCut); if (lastCharToCompare[0] !== arrChars[i]) { isPalin = false; return isPalin; } indexStart--; indexMakeCut++; } return isPalin; } console.log(palindrome("eye"));

PRUEBAS:

palindrome("eye") debe devolver un booleano. palindrome("eye") debe devolver true. palindrome("_eye") debe devolver true palindrome("race car") debe devolver true. palindrome("not a palindrome") debe devolver false. palindrome("A man, a plan, a canal. Panama") debe devolver true. palindrome("never odd or even") debe devolver true. palindrome("nope") debe devolver false. palindrome("almostomla") debe devolver false. palindrome("My age is 0, 0 si ega ym.") debe devolver true. palindrome("1 eye for of 1 eye.") debe devolver false. palindrome("0_0 (: /-\ :) 0-0") debe devolver true. palindrome("five|\_/|four") debe devolver false.

Conversor Numero Romano

Consigna

Convierte el número proporcionado en un número romano. Todos los números romanos deben proporcionarse en mayusculas.

CÓDIGO:

function convertToRoman(num) { let defaultRomanNums = { 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 strResult = ""; for (let romanNumber in defaultRomanNums) { for ( ; num >= defaultRomanNums[romanNumber]; num -= defaultRomanNums[romanNumber] ) { strResult += romanNumber; } } return strResult; } console.log(convertToRoman(36));

PRUEBAS:

convertToRoman(2) debe devolver la cadena II. convertToRoman(3) debe devolver la cadena III. convertToRoman(4) debe devolver la cadena IV. convertToRoman(5) debe devolver la cadena V. convertToRoman(9) debe devolver la cadena IX. convertToRoman(12) debe devolver la cadena XII. convertToRoman(16) debe devolver la cadena XVI. convertToRoman(29) debe devolver la cadena XXIX. convertToRoman(44) debe devolver la cadena XLIV. convertToRoman(45) debe devolver la cadena XLV. convertToRoman(68) debe devolver la cadena LXVIII convertToRoman(83) debe devolver la cadena LXXXIII convertToRoman(1023) debe devolver la cadena MXXIII convertToRoman(2014) debe devolver la cadena MMXIV convertToRoman(3999) debe devolver la cadena MMMCMXCIX

Cifrado Cesar

Consigna

Uno de los cifrados más simples y conocidos es el cifrado César, también conocido como cifrado por desplazamiento. En un cifrado por desplazamiento los significados de las letras se desplazan por una cantidad determinada.

Un uso moderno común es el cifrado ROT13, donde los valores de las letras son desplazados por 13 lugares. Así que A ↔ N, B ↔ O y así sucesivamente.

Escribe una función que reciba una cadena codificada en ROT13 como entrada y devuelva una cadena decodificada.

Todas las letras estarán en mayúsculas. No transformes ningún carácter no alfabético (espacios, puntuación, por ejemplo), pero si transmítelos.

CÓDIGO:

onst searchEncryptedLetter = (letter) => { const letters = [ "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", ]; let startSearch = 13; let indexLetter = letters.indexOf(letter); return indexLetter >= 13 ? letters[indexLetter - startSearch] : letters[indexLetter + startSearch]; }; function rot13(str) { let strResult = ""; let arrStr = str.split(""); for (let i = 0; i < arrStr.length; i++) { if (/[A-Z]/.test(arrStr[i])) { strResult += searchEncryptedLetter(arrStr[i]); } else { strResult += arrStr[i]; } } return strResult; } console.log(rot13("SERR PBQR PNZC"));

PRUEBAS:

rot13("SERR PBQR PNZC");

rot13("SERR PBQR PNZC") debe decodificarse en la cadena FREE CODE CAMP rot13("SERR CVMMN!") debe decodificarse en la cadena FREE PIZZA! rot13("SERR YBIR?") debe decodificarse en la cadena FREE LOVE? rot13("GUR DHVPX OEBJA SBK WHZCF BIRE GUR YNML QBT.") debe decodificarse en la cadena THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG.

Validando Nros Telefono US

Consigna

Devuelve true si la cadena pasada concuerda con un número de teléfono válido en Estados Unidos.

El usuario puede completar el campo del formulario de la forma que elija, siempre que tenga el formato de un número estadounidense válido.

Los siguientes ejemplos son de formatos válidos para números estadounidenses (consulte las pruebas a continuación para otras variantes):

555-555-5555

(555)555-5555

(555) 555-5555

555 555 5555

5555555555

1 555 555 5555

Para este desafío se te presentará una cadena como 800-692-7753 o 8oo-six427676;laskdjf.

Tu trabajo es validar o rechazar el número de teléfono estadounidense basado en cualquier combinación de los formatos proporcionados arriba.

El código de área es obligatorio.

Si el código de país es proporcionado, debes confirmar que el código de país es 1.

Devuelve true si la cadena es un número de teléfono estadounidense valido; de lo contrario devuelve false.

CÓDIGO:

function telephoneCheck(str) { let resultBoolean = false; let patternWithoutParentheses = /^[1]?(\s)*(\d{3})+[-|\s]*(\d{3})+[-|\s]*\d{4}$/; let patternWithParentheses = /^[1]?(\s)*[\(]+(\d{3})+[\)]+[-|\s]*(\d{3})+[-|\s]*\d{4}$/; if (patternWithoutParentheses.test(str)) return (resultBoolean = true); if (patternWithParentheses.test(str)) return (resultBoolean = true); return resultBoolean; } console.log(telephoneCheck("555-555-5555"));

PRUEBAS:

telephoneCheck("555-555-5555") should return a boolean. telephoneCheck("1 (555) 555-5555") should return true. telephoneCheck("1 555-555-5555") should return true. telephoneCheck("5555555555") should return true. telephoneCheck("555-555-5555") should return true. telephoneCheck("(555)555-5555") should return true. telephoneCheck("1(555)555-5555") should return true. telephoneCheck("555-5555") should return false. telephoneCheck("5555555") should return false. telephoneCheck("1 555)555-5555") should return false. telephoneCheck("1 555 555 5555") should return true. telephoneCheck("123**&!!asdf#") should return false. telephoneCheck("2(757)6227382") should return false. telephoneCheck("555)-555-5555") should return false. telephoneCheck("11 555-555-5555") should return false.

Caja Registradora

Diseña una función checkCashRegister() que acepte el precio de compra como primer argumento (price), la cantidad pagada como segundo argumento (cash), y el dinero en efectivo que tiene la caja (cid) como tercer argumento.

cid es un arreglo 2D que enumera las monedas disponibles.

La función checkCashRegister() siempre debe devolver un objeto con una clave status y una clave change.

Devuelve {status: "INSUFFICIENT_FUNDS", change: []} si el efectivo en caja es menor que el cambio necesario, o si no puedes devolver el cambio exacto.

Devuelve {status: "CLOSED", change: [...]} si el efectivo en caja como valor de la clave change es igual al cambio que se debe entregar.

En cualquier otro caso, devuelve {status: "OPEN", change: [...]}, con el cambio a entregar en monedas y billetes, ordenados de mayor a menor, como valor de la clave change.

Unidad Monetaria Importe

Penny $0.01 (PENNY) Nickel $0.05 (NICKEL) Dime $0.1 (DIME) Quarter $0.25 (QUARTER) Dollar $1 (ONE) Five Dollars $5 (FIVE) Ten Dollars $10 (TEN) Twenty Dollars $20 (TWENTY) One-hundred Dollars $100 (ONE HUNDRED)

A continuación, un ejemplo del efectivo en caja en formato de arreglo:

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

CÓDIGO:

const checkCoinsInBox = (change, moneyNotExceedChange) => { for (let i = 0; i < moneyNotExceedChange.length; i++) { let amountCoinsNeededForType = 0; let amountCoinsAvaible = moneyNotExceedChange[i][2]; for (let j = 0; j < amountCoinsAvaible && change >= moneyNotExceedChange[i][1]; j++ ) { change = Number((change - moneyNotExceedChange[i][1]).toFixed(2)); amountCoinsNeededForType++; if (change === 0) { moneyNotExceedChange[i].push(amountCoinsNeededForType); return moneyNotExceedChange; } else if (change < 0) { return false; } } if (amountCoinsNeededForType > 0) moneyNotExceedChange[i].push(amountCoinsNeededForType); } }; function checkCashRegister(price, cash, cid) { let change = cash - price; let coins = []; let changeToReturn = { status: "", change: [], }; let totalCash = cid .map((item) => coins.push(item[0]) && item[1]) .reduce((acc, prev) => acc + prev, 0); if (totalCash < change) { changeToReturn.status = "INSUFFICIENT_FUNDS"; return changeToReturn; } if (totalCash === change) { changeToReturn.status = "CLOSED"; changeToReturn.change = cid; return changeToReturn; } let monetaryUnitAmount = [ ["PENNY", 0.01], ["NICKEL", 0.05], ["DIME", 0.1], ["QUARTER", 0.25], ["ONE", 1], ["FIVE", 5], ["TEN", 10], ["TWENTY", 20], ["ONE HUNDRED", 100], ]; let changeCashByType = []; for (let i = 0; i < cid.length; i++) { changeCashByType.push([ cid[i][0], monetaryUnitAmount[i][1], cid[i][1] / monetaryUnitAmount[i][1], ]); } changeCashByType.sort(function compareFunction(a, b) { return a[1] > b[1] ? -1 : 1; }); let moneyNotExceedChange = changeCashByType.filter( (item) => item[1] <= change ); let numberMoneyNeededByType = checkCoinsInBox( change, moneyNotExceedChange, changeCashByType ); if (!numberMoneyNeededByType) { changeToReturn.status = "INSUFFICIENT_FUNDS"; } else { changeToReturn.status = "OPEN"; let arrMoneyWithChange = numberMoneyNeededByType .map((element) => element[3] && [element[0], element[1] * element[3]]) .filter((item) => item !== undefined); changeToReturn.change = arrMoneyWithChange; } return changeToReturn; } console.log(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]]) );

PRUEBAS:

heckCashRegister(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]]) debe devolver un objeto 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]]) debe devolver {status: "OPEN", change: [["QUARTER", 0.5]]} 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]]) debe devolver {status: "OPEN", change: [["TWENTY", 60], ["TEN", 20], ["FIVE", 15], ["ONE", 1], ["QUARTER", 0.5], ["DIME", 0.2], ["PENNY", 0.04]]} heckCashRegister(19.5, 20, [["PENNY", 0.01], ["NICKEL", 0], ["DIME", 0], ["QUARTER", 0], ["ONE", 0], ["FIVE", 0], ["TEN", 0], ["TWENTY", 0], ["ONE HUNDRED", 0]]) debe devolver {status: "INSUFFICIENT_FUNDS", change: []} checkCashRegister(19.5, 20, [["PENNY", 0.01], ["NICKEL", 0], ["DIME", 0], ["QUARTER", 0], ["ONE", 1], ["FIVE", 0], ["TEN", 0], ["TWENTY", 0], ["ONE HUNDRED", 0]]) debe devolver {status: "INSUFFICIENT_FUNDS", change: []} heckCashRegister(19.5, 20, [["PENNY", 0.5], ["NICKEL", 0], ["DIME", 0], ["QUARTER", 0], ["ONE", 0], ["FIVE", 0], ["TEN", 0], ["TWENTY", 0], ["ONE HUNDRED", 0]]) debe devolver {status: "CLOSED", change: [["PENNY", 0.5], ["NICKEL", 0], ["DIME", 0], ["QUARTER", 0], ["ONE", 0], ["FIVE", 0], ["TEN", 0], ["TWENTY", 0], ["ONE HUNDRED", 0]]}