DEV Community

Cristian Fernando
Cristian Fernando

Posted on • Updated on

Advent.js🎅🏼| #3: El Grinch quiere fastidiar la navidad

El Grinch quiere fastidiar la navidad

El Grinch está abriendo las cartas que iban a Santa Claus y las está dejando hechas un lío. 😱

Las cartas son una cadena de texto que incluyen regalos y paréntesis ().

Para saber si una carta es válida ✅, debes comprobar que los paréntesis cierran correctamente y que, además, no vayan vacíos.

¡Pero ojo! Porque el Grinch ha dejado llaves { y corchetes [ dentro de los paréntesis que hacen que no sean válidas. Por suerte sólo los ha dejado en medio de los paréntesis...

Ejemplos:

"bici coche (balón) bici coche peluche" // -> ✅
"(muñeca) consola bici" // ✅

"bici coche (balón bici coche" // -> ❌
"peluche (bici [coche) bici coche balón" // -> ❌
"(peluche {) bici" // -> ❌
"() bici" // ❌
Enter fullscreen mode Exit fullscreen mode

Crea una función que pasándole el texto de la carta, devuelva true si es válida y false si no lo es. ¡Y acaba con la travesura del Grinch!

Completa el reto!


Mi solución:


Puedes seguir a @midudev y estar pendiente de los retos de Advent.js

Latest comments (10)

Collapse
 
alexjamesmx profile image
Alejandro Santiago • Edited

SIN REGEX

export default function isValid(letter) {
let has = 0;
  [...letter].forEach((c, i) => {
    if(has === 0 && c ==='('){
    has = 1;
    }
    if(has ===  1 && c === ')'){
        has = 0;        
      if(letter.charAt(i-1)== "("){
        has =2;
      }
    }
        if((has === 1 && c === "{") ||  (has === 1 && c === "[")){
      has = 2;
    }
  })
 return has == 0 ? true : false
}
Enter fullscreen mode Exit fullscreen mode
Collapse
 
danmd profile image
Daniel Mondragon

Aquí una solución un poco más fácil y sin regex

function isValid(letter) {
    if (letter.includes('(' && ')')) {
        if (letter.includes('[') || letter.includes('{') || letter.includes(`()`) || (letter.indexOf(`(`) > letter.indexOf(')'))) {
            return false;
        } else {
            return true;
        }
    } else {
        return false;
    }

}
Enter fullscreen mode Exit fullscreen mode
Collapse
 
elgrilloparlante profile image
Elgrilloparlante

Tardísimo, pero aqui va una con una expresion regular sencillita:

export default function isValid(letter) {
    const validGift = new RegExp(/\([\w\u00C0-\u017F]+\)+/);
    const matches = (letter.match(validGift) || []).length
    const isValid = matches == 1 && !letter.includes('()') ? true : false;

    return isValid;
}
Enter fullscreen mode Exit fullscreen mode

Espero que os sea util!

Collapse
 
carlpy profile image
Darknight8020

hay alguna otra manera de hacerlo sin usar regex?

Collapse
 
duxtech profile image
Cristian Fernando

usar regex es complicado para muchos,claro que hay otras maneras de resolverlo pero yo opte por solucionarlo con una regex

Collapse
 
marquimark profile image
Marquimark

Casi no llego, tarde pero aqui esta mi respuesta, me he sacado el aire, pero creanme, trabajo honesto.

const cadenas = 'bici coche (balón bici coche';

function validaCartas(carta) {
if ((/(\D*^[([)]])/g).test(carta)) {
return true;
} else if ((/({2,}/g) || (/){2,}/g) || (/(\s*)/g) || (/(\D+/g) || (/\D+)/g)(/\s[/) || (/\D*[/) || (/\s{\s*)/) || (/\D*{\s*)/).test(carta))
{
return false;
};
}
console.log( validaCartas(cadenas));

Collapse
 
duxtech profile image
Cristian Fernando

Ouuuch esa regex se ve que te hizo humear el cerebro 🤯😬

Collapse
 
marquimark profile image
Marquimark

gracias, si la verdad, pero quise poner otras mas a las que dieron en el ejemplo, si van dos parentesis a la apertura, al cierre, si los parentesis no son solo vacios con nada de espacio () sino vacios con muchos ( ).

Thread Thread
 
duxtech profile image
Cristian Fernando

personalmente solo uso regex cuando no se complican tanto xd
siempre trato de que sea la última opción a usar en un problema

Collapse
 
armanyfelix profile image
Armany

Utilize un .test en vez del .exec, asi queda mas simple la condicion.
const result = /(([^)]+))/.test(letter);
return (result) ? false : true;