Como ya sabrás, los hackers están en todas partes y quieren hackear todo. Se le pidió que establezca requisitos de contraseña que detendrán a cualquier hacker . El problema es que su jefe ha escuchado que pagar por LOC es malo y le paga $ 1800 - $ 0.03 * caracteres insertados por mes para que escriba lo más simple que posiblemente podría funcionar. Por lo tanto, debe usar una pequeña cantidad de caracteres (con suerte muy pequeños), o de lo contrario olvidarse del efectivo. Además, a tu jefe no le importa qué idioma usarás.
Los requisitos para contraseñas buenas son similares a los del artículo mencionado, excepto que los requisitos basados en el diccionario se eliminaron para evitar que la solución dependa de archivos externos, no es necesario verificar si las letras se reorganizan (difícil de entender lo que realmente significa), se elimina la última regla (¿Qué es 3/4?) y no verifica las contraseñas antiguas.
Los requisitos exactos después de eliminar ciertos requisitos del artículo vinculado son:
- tener al menos 8 caracteres!
- ¡No tenga más de 12 caracteres!
- tener mayúsculas y minúsculas!
- ¡no tenga más de 8 letras mayúsculas!
- ¡no tenga más de 8 letras minúsculas!
- tener al menos 2 letra (s)!
- ¡Ten una carta principal!
- tener al menos 1 dígito (s)!
- ¡no seas tu nombre de usuario!
- ¡No seas tu nombre de usuario al revés!
- No contiene su nombre de usuario!
- ¡No contenga su nombre de usuario al revés!
- ¡No tenga más de 1 par (es) de caracteres repetidos!
- ¡No tiene 3 ocurrencias del mismo personaje!
- no contiene quilates (^)
- no contiene espacio
- no contiene =
- no conatain &
- no contienen #
- no contienen ,
- no conatain ;
- no contienen "
- no contiene>
- no contiene <
- no contienen [
- no contiene |
- no contienen )
Todos los errores ortográficos en esta lista se dejaron como están.
$ ./checkpass
Username: John
Password: L!]E2m69
OK.
$ ./checkpass
Username: John
Password: JohnnhoJ12
Nope.
$ ./checkpass
Username: JOE.smith
Password: JOE!smith123
OK.
El código más corto gana dinero (enviado como archivo JPG). Tiene que mostrar las indicaciones "Nombre de usuario:" y "Contraseña:" y responder con el mensaje exacto.
1
(dígito uno) en lugar de ell.Respuestas:
Perl,
203194189193 caracteresAquí está mi versión de Perl sobre el problema:
Las expresiones regulares verifican, en orden, que la contraseña:
comienza con una letra, tiene de ocho a doce caracteres
contiene un dígito
contiene una letra mayúscula
tiene ocho o menos letras mayúsculas
tiene ocho o menos letras minúsculas
contiene una letra minúscula
no contiene ninguno de los signos de puntuación prohibidos, tres ocurrencias de cualquier carácter, más de una aparición de un carácter duplicado, el nombre de usuario o el nombre de usuario invertido.
(Gracias a Peter Taylor por señalar un error en la versión de 189 caracteres).
fuente
use v5.10;
y falla mi caso de prueba "se regexes escaparon correctamente". Ver ideone.com/QKFnZ\Q$u\E|\Q$n
(la última\E
se puede omitir, si esta parte se moviera para finalizar).(.)(.*\1.*\1|\1.*(.)\3)
(no probado, no voy a intentar crear una batería de prueba completa con ideone).Ruby, 270 caracteres.
Una implementación de ruby basada en doce expresiones regulares. Cada expresión es una coincidencia positiva (primeros cinco) o negativa (últimos siete). Como restricción, el nombre de usuario solo puede contener letras o dígitos.
La expresión regular positiva coincide:
/^.{8,12}$/
: ¡tenga al menos 8 caracteres! ¡No debe tener más de 12 caracteres!/\p{Lower}/
y/\p{Upper}/
: tener mayúsculas y minúsculas!/^(\p{Alpha}.*){2}/
: ¡tenga al menos 2 letra (s) !, tenga una letra inicial!/\d/
: tener al menos 1 dígito (s)!La expresión regular negativa coincide:
/(\p{Lower}.*){9}/
: ¡no tenga más de 8 letras minúsculas!/(\p{Upper}.*){9}/
: ¡no tenga más de 8 letras mayúsculas!/(.)\1.*(.)\2/
: ¡no tenga más de 1 par (es) de caracteres repetidos!/(.).*\1.*\1/
: no tiene 3 ocurrencias del mismo personaje!/[ ^=&#,;"<>\[|)]/
: no contiene cursor, espacio, =, &, #, ,,;, ",>, <, [, |,)/#{u}/
: ¡no sea su nombre de usuario !, ¡no contenga su nombre de usuario!/#{u.reverse}/
: ¡no sea su nombre de usuario al revés !, ¡no contenga su nombre de usuario al revés!fuente
Python 3, 291 bytes / caracteres
Más bien formateado y comentado:
Puede encontrar esta solución en ideone.com , pero el resultado se ve un poco feo porque no muestra la entrada predefinida o incluso los saltos de línea allí. Además, la combinación de nombre de usuario-contraseña
"JOE.smith"
-"JOE!smith123"
se introduce en la actualidad como datos de entrada fijos.Sin embargo, agregué un desglose de todos los controles como salida de depuración.
fuente