El servidor de dominio requiere que todos los empleados tengan una contraseña segura y aleatoria que cumpla con las siguientes reglas:
- Exactamente 15 caracteres de largo.
- Solo caracteres que se pueden escribir en el teclado (como se muestra a continuación en el tipo de código). No se permite enseñar a las ventas a usar códigos ALT + NUMPAD.
- Al menos 1 letra minúscula:
abcdefghijklmnopqrstuvwxyz
- Al menos 1 letra mayúscula:
ABCDEFGHIJKLMNOPQRSTUVWXYZ
- Al menos 1 dígito numérico:
0123456789
- Al menos 1 símbolo:
`~!@#$%^&*()_+-={}|[]\:";'<>?,./
Para este propósito, TI ha encargado y distribuirá un generador de contraseñas aleatorias a todos los empleados. Todos los empleados deberán utilizar el generador de contraseñas aleatorias. Los requisitos para el generador de contraseñas aleatorias son, además de las restricciones de contraseña anteriores:
- Debe poder generar todas las permutaciones de todos los caracteres permitidos.
- Debe mostrar la contraseña generada en la pantalla.
- Se requiere que el código sea lo más pequeño posible (en bytes).
Envíe su solución propuesta dentro de la próxima semana.
correcthorsebatterystaple
Respuestas:
Mathematica (18)
Déjame un poco de trampa
PD no seguridad :)
fuente
Ruby,
7469 bytesSimplemente muestree aleatoriamente del rango ASCII 33 - 126 hasta que estén presentes todas las clases de caracteres:
Ruby, 39 bytes
Usando el descubrimiento inteligente de los alces:
Editar para satisfacer a la mafia:
Tenga en cuenta que las reglas cambiaron después de que publiqué esto por primera vez. En ese momento, las dos entradas anteriores se aplicaban a las reglas. También me gustaría señalar que las reglas aún no están muy bien definidas:
"Permutaciones". No hay permutaciones de los caracteres permitidos que cumplan con el resto de las reglas, porque cualquier permutación del conjunto de caracteres permitidos es tan larga como el conjunto de caracteres permitidos (mientras que la contraseña debe tener 15 caracteres). Y no hay repeticiones en una permutación. Sin embargo, mi primera entrada es aún más "aleatoria" que muchas de las otras respuestas bien votadas aquí.
Sin embargo, aquí lo tienes. Permite repeticiones de caracteres y guiones bajos:
Ruby, 77 bytes
También utilicé en
puts
lugar dep
en este porquep
imprime la cadena entre comillas y algunos caracteres escaparon con una barra diagonal inversa.Ruby, 70 bytes
Como señala Ventero,
~
se puede omitir frente a las expresiones regulares y seprint
puede reemplazarputs$_
. Pero con la salida fea, esto también puede imprimir todas las contraseñas rechazadas, apretándolas en una sola línea:Explicación
De acuerdo a lo pedido.
$_
es una variable semi-mágico que contiene la última línea de leer de la entrada - por lo que no siempre es necesario almacenarlo, como este . Sin embargo, aquí lo usamos debido a otra propiedad, a saber, que el~
operador le aplica una expresión regular directamente, un truco que aprendí por primera vez por cron . Reemplacé el uso deall
, pero debería ser bastante fácil de entender si obtienes el resto ( ver los documentos ).fuente
.all?{|r|~r}
hacer? ¿Qué$_=
hacer?\W
En Ruby incluye el guión bajo_
? En la mayoría de los dialectos regex sé que no. Y si su código no pudiera generar contraseñas donde un solo_
era el único símbolo no alfanumérico, violaría un requisito. El segundo enfoque viola muy obviamente ese requisito, pero supongo que no estaba redactado correctamente en ese momento.\W
no contiene un guión bajo en RegEx ( fuente ) compatible con Perl .sample
no repite elementos, por lo que su código no puede generar contraseñas con elementos repetidos. ¿Puede solucionar estos dos problemas para que su respuesta se ajuste a la pregunta? Al ver cómo la suya es la solución líder, a excepción de Wolfram Alpha, sería bueno ver si puede conformarse y seguir manteniendo el liderazgo. Supongo que no debería ser demasiado difícil.Java 8 -
354329319275267 caracteresSolo por diversión, usando lambdas con Java 8: cada salida posible tiene la misma probabilidad de ser encontrada.
Utiliza el hecho de que los caracteres permitidos tienen códigos ascii consecutivos, de 33 a 126.
Salida de muestra:
Programa comprimido:
class A{static int a,A,d,p;public static void main(String[]x){String s;do{s=new String(new java.util.Random().ints(15,33,127).toArray(),0,15);a=A=d=p=0;s.chars().map(c->c>96&c<123?a=1:c>64&c<90?A=1:c>47&c<58?d=1:(p=1)).min();}while(a+A+d+p<4);System.out.println(s);}}
fuente
while(a+A+d+p<4)
junto con ena|=1
lugar dea++
? O máscaras de bits uso, es decir cosas comoa|=1
a través dea|=8
, cona<15
como condición de bucle. Esto ahorra otros 13 caracteres si conté correctamente.new String(int[],int,int)
guarda otros 40 caracteres impares!Python 2.X + 3.X (229 caracteres): generar y reemplazar
Idea
r
por un dígito aleatorios
, cons != r
, por una letra mayúsculaCódigo
Python 2.X + 3.X (194 caracteres): generar y verificar
\u
y\l
no existe en Python regex.random.sample
tiene reemplazo, para obtener todas las contraseñas permitidas posibles necesitamos muestreo con reemplazo.Usando falla en la descripción del problema
Actualmente, la descripción del problema no exige que cada símbolo / dígito aparezca con la misma probabilidad. Con la siguiente solución, no puede asumir nada sobre un solo símbolo y / o posición. Pero puedes hacerlo con múltiples.
Python 2.X + 3.X (62 caracteres)
Gracias a daniero por la idea de usar muestra.
fuente
\l
y demás para las expresiones regulares de Python? No lo veo en la referencia . Mi Python 3.3.3 ni siquiera acepta"\u"
. Elstr(…)
no une las letras en 3.3.3 o 2.7.6. Una sugerencia para optmization:all(s("\\"+i,p)for i in "dluW")
.random.sample
elige elementos sin reemplazo, por lo que no todas las contraseñas son posibles.\u
y\l
es solo vim.Bash en * nix (109)
Para que funcione correctamente,
$a
no se debe establecer una contraseña válida pero no aleatoria por adelantado. Si desea incluira=
una línea en el frente, son tres caracteres más, pero le permite ejecutar la cosa repetidamente. Obviamente, también puede reemplazar todas las líneas nuevas por;
lo que tiene una línea que puede ejecutar con la frecuencia que desee.Además, debería haber establecido
LC_ALL=C
o no establecer variables de entorno específicas de la localidad (LANG
yLC_CTYPE
en particular), ya que los rangos de caracteres dependen de que el orden de clasificación sea igual al orden ASCII./dev/urandom
es la fuente de bytes aleatorios.!-~
es el rango de todos los caracteres permitidos, como se especifica en la pregunta.tr -dc
elimina todos los caracteres que no figuran en su siguiente argumento.head
toma 15 de los personajes restantes.grep
comprueba si cada uno de los tipos requeridos ocurre al menos una vez. Su entrada consiste en cuatro copias del candidato, por lo que el orden de los símbolos no importa, por lo tanto, todas las contraseñas posibles tienen la posibilidad de ser seleccionadas. El-q
to grep suprime la salida.Por razones desconocidas, en
/dev/random
lugar de/dev/urandom
lleva años. Parece que la entropía se agotó bastante rápido. Sicd
en/dev
, puede evitar algunos más bytes, pero que se siente un poco como hacer trampa.Pitón 2 (138)
Para que el código sea legible, agregué una nueva línea y una sangría después del ciclo que no es necesario y que no conté.
Esta es esencialmente la misma idea que en la versión bash. La fuente aleatoria aquí es
random.sample
, que no repetirá elementos. Para contrarrestar este hecho, utilizamos 15 copias de la lista de letras permitidas. De esa manera, toda combinación puede ocurrir, aunque las que tienen letras repetidas ocurrirán con menos frecuencia. Pero decido considerar esto como una característica, no como un error, ya que la pregunta no requería la misma probabilidad para todas las permutaciones, solo la posibilidad.Pitón 3 (145)
Una nueva línea y una sangría nuevamente no cuentan. Además de algunos gastos generales de sintaxis específicos de Python-3, esta es la misma solución que para Python 2.
JavaScript (161)
Agregué las nuevas líneas para facilitar la lectura, pero no las conté.
R (114)
Salto de línea y sangría dentro del bucle agregado pero no contado. Si lo desea, puede moverlo nuevamente a una sola
;
línea separada.fuente
grepl
en su código R. Si solo hubiera pensado en repetir la contraseña de prueba cuatro veces para poder hacer todas las comprobaciones en una. Y sabes, si solo hubiera pensado ensample
yintToUtf8
. Sin embargo, debe agregarreplace=TRUE
(o de manera más concisa, solo necesita agregar,T
) a su método de muestra para asegurarse de obtener todas las contraseñas posibles.replace=T
error, gracias por señalarlo. EncontrarintToUtf8
adivinando nombres probables con la finalización de tabulación me llevó bastante tiempo; Sabía que tal función tiene que existir, pero los nombres más comunes comochr
y así sucesivamente no se usaron.*4
? Pensé que su expresión regular coincidiría con cualquier cadena, ese anuncio primero una letra mayúscula, luego cualquier cosa, luego una letra minúscula, que cualquier cosa ... ¿qué me equivoqué?re.search
nore.match
, así, el texto podría coincidir en cualquier lugar de la contraseña candidato. ¿Esto explica por qué terminará eventualmente?re.search
lugar dere.match
. Eso lo explica. Pero sigo pensando que no necesitas el*4
. Gracias por la explicación (+1)C # (
123 - 139103 - 127 caracteres compactados):Usando un método de marco perfectamente adecuado en
System.Web.dll
:Comprimido:
Ejemplo:
Alternativamente, tome el valor del segundo parámetro (
int numberOfNonAlphanumericCharacters
) de la línea de comando:fuente
GeneratePassword
no admite el conjunto completo de símbolos especificado en la pregunta. Tampoco encontré ninguna garantía sobre el número mínimo de ocurrencias de cada categoría de personaje.class P
ystring[] a
.R (
301322 caracteres)La corrección olvidó verificar los dígitos.
(espacio en blanco agregado solo para mayor claridad).
Genera todas las permutaciones posibles de 15 caracteres de los 94 caracteres. Luego, selecciona uno al azar hasta que coincida con los criterios.
La magia está en la
q:q
operación, que genera un nuevo tipo de datos de factor que es la interacción de todos los factores en la primeraq
lista con todos los factores en la segunda lista , con cada combinación posible de esas dos listas incluidas en la lista de " niveles "de ese factor. Interactúa 15 copias de la lista de personajes permitidos y obtienes (94 ^ 15) niveles posibles.Por favor, no intente esto en casa. El código tarda un par de segundos en descubrir todas las permutaciones de tres caracteres, realmente no puedo imaginar cuánto tiempo tomaría averiguar todas las permutaciones de 15 caracteres, si su computadora no se quedara sin memoria en el mientras tanto. Cuando ejecuté el script terminado (contraseña de tres caracteres) para verificarlo, la primera contraseña que escuchó fue "oO =", que creo que resume la reacción que debería tener ante este código.
fuente
Mathematica 170
Ejemplos
"<]} Pg3 / e? 3 + Z ~ Oz"
"X / 8jWe @ f (_x5P: ="
"2wz2VQhtJC? * R7 ^"
fuente
Python 2.7 (182)
fuente
join
tipo tiene que estar allí: ¿Se espera que los usuarios entiendan la sintaxis de la lista de Python de la salida['q', 'u', ...]
:?aA$bc1111111111
) sean imposibles.Golfscript (60)
Desde el obl. falta golfscript y como novato necesito la práctica de todos modos :)
Simplemente construye una matriz con los 4 caracteres aleatorios requeridos + 11 y los ordena en orden aleatorio.
fuente
{r}$
. Esa es una manera bastante sucia de barajar una lista, ¡me gusta! ;-)0Aa~~~~~~~~~~~~
. :-(JavaScript
258240233225Usando una regla donde:
function(x){return x*x}
puede reescribirse comofunction(x)x*x
. Solo parece funcionar para funciones que devuelven un valor.Próxima iteración, reducida
x.sort(function().5-R())
ax.sort(y=>.5-R())
Próxima iteración, reducida aún más con la notación de flecha gruesa, que lamentablemente solo funciona para Firefox 22 y superior.
fuente
JavaScript (269 caracteres compactados)
Para mayor claridad, este es el código antes de compactarlo con JS-Fiddle :
Aquí se compacta a 269 caracteres ( JS-Fiddle ):
fuente
shuffle()
ser una "función personalizada"? ¿Es parte de JavaScript o código que tendría que escribir usted mismo?Clojure (63):
Pero debe mejorarse para garantizar que contenga al menos 1 carácter de cada categoría (Superior, Inferior, Dígito, Símbolo).
fuente
En sql-server
Véalo en acción - 1
verlo en acción - 2
fuente
~0Aa
, ni ninguna contraseña dondeb
sea seguidaa
.SAS (191)
*TQP,(f=h10*)S=
Comentado / sangrado:
fuente
PowerShell: 119
Código Gofled
Sin golf y comentado
fuente
^.*(?=.{15,})(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[!#$%&? "]).*$
puede hacer una coincidencia con esto, que solo coincidirá cuando haya un Símbolo superior, inferior, de dígitos.1aZ%
y(p3R
coincidir? Tuve algunas dificultades para encontrar formas de hacerlo en línea.$x-cmatch'^.*(?=.{15,})(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[!#$%&? "]).*$'
coincidencias buenas:C>suD1?hTwbDx(z
j%4O]HyeG|u[U$5
O/rGeD0$hJk=GO/
coincidencias3evthX3_X^nBrR`
fallidas : .nA ~ uYzrR4YV-r.`u-IjZE48ntQ;HxV
Python 2.7 (149)
Escrito de una manera más legible (y no ejecutable);
Bastante sencillo y sorprendentemente no mucho más largo que una versión de "generar, reintentar en falla de partido".
fuente
0Aa~~~~~~~~~~~~
? (Tenga en cuenta que'~' == chr(126)
)PSQL (189)
Parece que PSQL es un poco detallado ... :)
Demostración de SQLfiddle .
fuente
PHP,
235225Este script baraja los caracteres y luego se verifica a través de RegEx para asegurarse de que la contraseña sea segura (o se regenere).
fuente
while(true) ... if (condition) break
que pueda usarwhile (!condition)
Javascript (209)
Semi-no-golfista;
fuente
Perl, 92
No es tan conciso como la respuesta de Ruby, pero estoy seguro de que un asistente de Perl podría hacer esto aún más corto ... No estoy muy contento con todos los
m//
mensajes al final, pero parece funcionar y debería satisfacer las condiciones para eventualmente generar Todas las permutaciones.Uso de la muestra:
Editado para la validación fijar y cambiar
[[:punct:]]
a[\W_]
después MVGS comentarios.fuente
aaaaaaaaaaaaaa
provocaría que el bucle finalice. Debe probar los criterios con contraseñas no aleatorias para asegurarse de que hagan lo que usted quiere que hagan.[[:punct:]]
? Supongo que preferiría el, which is shorter and of which I'm even more sure that it is correct, at least combined with your
rango '[\ W_] 33..127`.\W
no incluyera_
, sin embargo, tiene toda la razón, no es necesario: gist.github.com/anonymous/8301237 . ¡Gracias!Java 7 (
270234 caracteres)La premisa es la misma utilizada por @assylias con java 8 (generar contraseñas aleatorias hasta una contraseña válida). Sin embargo, en lugar de usar lambdas, la contraseña se genera iterando una matriz de caracteres y validada haciendo coincidir una expresión regular.
Código Minificado:
fuente
Potencia Shell
Versión One Liner (143 bytes)
Mini versión (146 bytes)
Versión legible (860 bytes)
fuente
abcd1234ABCD{|}~
nunca aparecerá porque$symbol
obliga a que al menos uno de los símbolos esté entre ASCII 33 y 47.$SR
, tal vez$Q
?(g(65..90))
hacia abajo para65..90|g'. And change the
declaraciones foreach` aforeach-object
bucles utilizando el%
alias. Ejemplo:foreach($N in (1..11)){
...}
debe ser factible como1..11|%{
...}
. Estoy bastante seguro de que hay otras optimizaciones que son posibles, pero en realidad tengo una implementación completamente diferente en mente que estoy planeando probar más tarde.Factor, 196 caracteres
Mismo algoritmo que MvG y alces. No es el más corto, pero debe satisfacer todos los criterios (actuales) en la pregunta:
fuente
~{}|1234abcdABCD
fallará en la expresión regular."~{}|1234abcdABCD" 60 cycle "[A-Z].*[a-z].*[0-9].*[\\W_]" findall empty? not => t
C - 154 caracteres
¿Cómo no me gusta
srand()
? Déjame contar las formas.fuente
Haskell, 192
La cadena impresa tiene comillas alrededor y escapa a la barra invertida y los caracteres de comillas; si eso es inaceptable,
print
se puede reemplazar conputStrLn
por 3 bytes más. Aquí hay una versión más legible:Es bastante sencillo, sólo se crea un infinito / lista de perezoso de caracteres ASCII aleatorios en el rango
'!'
de'~'
, a continuación, se deja caer a cabo el primer elemento hasta que los primeros 15 caracteres tienen al menos un carácter de cada cadena de caracteres necesarios.fuente
Excel VBA, 209 bytes
Genera aleatoriamente 15 caracteres ASCII, por lo que todas las combinaciones posibles son posibles. Luego usa un patrón de expresión regular para verificar si contiene al menos uno de cada criterio.
Si lo hace, se muestra la contraseña, si no se muestra "rehacer".
Crédito a Bart Kiers por el patrón de expresión regular: https://stackoverflow.com/questions/1559751/regex-to-make-sure-that-the-string-contains-at-least-one-lower-case-char- Superior
fuente
AutoHotkey 352
Utilizando : solo ejecuta el script
fuente
Python (121 caracteres)
Aprovecha el hecho de que puedes multiplicar listas en Python [1,2,3] * 2 da [1,2,3,1,2,3]. Importaciones aleatorias. Los números en una lista multiplicados por tres son bordes entre los rangos en la tabla ASCII para los caracteres necesarios, por ejemplo, [65, 90] mapas a letras mayúsculas.
fuente
import random
en el código.PHP 5.5 (230 bytes)
O en una línea (211 bytes)
fuente