DEV Community

Cristian Fernando
Cristian Fernando

Posted on Edited 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

Top comments (10)

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
 
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
 
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
 
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
 
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
 
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;