Foros aprenderaprogramar.com
Aprender a programar => De todo un poco... => Mensaje iniciado por: joburu en 30 de Noviembre 2013, 17:50
-
Buenas, te hago una consulta respecto a un Trabajo Practico relacionado a Lenguajes.
Me piden realizar una plataforma que restrinja las contraseñas posibles (limitando caracteres alfanuméricos, longitudes, etc.) para poder realizar un seguimiento de las contraseñas usadas.
-Definir un conjunto de contraseñas.
-Generar una gramática de la contraseña.
El problema que tengo es referente al enunciado; como elijo las contraseñas, su longitud y formato.
-
O sea, si quiero hacerla simple: Considero un alfabeto de 5 letras, creo una gramática y sus producciones y tengo un ejercicio como cualquiera del tema.
Pero eso no sería una contraseña (si es libre, uno no está obligado a empezar siempre con, por ejemplo, "a", poner cualquier cosa en el medio y terminas con "d", tan limitada en caracteres y con una estructura tan rígida, pierde el concepto de contraseña).
Ahora bien, si consideramos contraseñas más libres de un alfabeto de diez números (de 0 al 9) donde uno puedo empezar y terminar con cualquier número (más los del medio), se torna muy engorrosa la expresión regular (y no hablemos de una combinación mucho más amplia de letras y números).
Si hago como en los cajeros automáticos que usan 4 digitos y pongo como condición que la longitud es igual a 4, pero al hacer la expresión regular quedaría así: L={0123456789012345678901234567890123456789, cada una con un exponente distinto} ni que hablar del autómata que quedaría un monstruo!
-
Te respondo a través de un nuevo tema del foro para no mezclar
-
Supongamos que quieres crear una contraseña que puede constar de cinco letras: a, b, c ó d, ordenadas de cualquier manera.
Una expresión regular sería:
E = (a | b | c | d | e) , con esta expresión decimos que E es bien a, bien b, bien c, bien d o bien d.
La contraseña sería:
Contraseña = EEEEE, con esta expresión decimos que la contraseña se genera concatenando cinco veces la expresión regular E. También podríamos escribirlo así: Contraseña = (a | b | c | d | e) (a | b | c | d | e) (a | b | c | d | e) (a | b | c | d | e) (a | b | c | d | e) pero esta expresión es más farragosa.
Expresado en forma de gramática tendríamos:
Contraseña -- > EEEEE
E -- > a | b | c | d | e
Una contraseña de 4 dígitos como expresión regular sería:
D = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
Contraseña = DDDD
Expresado en forma de gramática sería:
Contraseña -- > DDDD
D -- > 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
Hay una notación para expresiones regulares que nos permite hacer la escritura más cómoda que es la notación de conjuntos. La notación es [A-Z] indica "cualquier letra mayúscula comprendida entre la A y la Z"; [A-Za-z] indica cualquier letra mayúscula o minúscula entre la a y la z. Por último [0-9] indica cualquier dígito comprendido entre 0 y 9. Puedes restringir los conjuntos, por ejemplo [m-z] significa cualquier letra minúscula entre la m y la z, o [5-8] indica cualquier número entre el 5 y el 8.
De esta manera podríamos definir una contraseña de longitud 4 caracteres que admita letras mayúsculas, minúsculas o dígitos de esta manera:
Como expresión regular:
letra = [A-Za-z]
digito = [0-9]
Caracter = letra | digito
contraseña = CaracterCaracterCaracterCaracter
La gramática suele generarse apoyándonos en las expresiones regulares, que son considerados terminales de la gramática. En este caso la gramática sería:
Contraseña -- > CaracterCaracterCaracterCaracter
Nota: el símbolo de elección "|" también se representa a veces usando el símbolo "+"