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.
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
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.
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.
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]]}