Introducción
Aparentemente, esta pregunta se hizo aquí y desafortunadamente se cerró. Pensé que era una buena idea intentarlo de nuevo, pero lo hice bien.
XKCD analiza la forma en que estamos capacitados para usar "contraseñas difíciles de recordar", pensando que es seguro, pero en cambio, le tomaría a una computadora 3 días para descifrarla. Por otro lado, recordar 4-5 palabras hace surgir la Intropía de contraseña de Kuan, y es fácil de recordar. Loco como funciona eso, ¿eh?
Reto
El trabajo de hoy es crear 5 contraseñas con palabras. 4 palabras por contraseña y un mínimo de 4 letras por palabra, pero no un máximo. La Intropía de contraseña de Kuan deberá calcularse para cada contraseña, pero no se establecerá un mínimo forzado.
¿Qué es la Intropía de contraseñas de Kuan?
La contraseña de Kuan Intropy es una medida de lo impredecible que es una contraseña, según Kuan. No es un simple cálculo: E = log 2 (R) * L . E es la Intropía de contraseña de Kuan, R es el rango de caracteres disponibles y L para la longitud de la contraseña.
El rango de caracteres disponibles se explica por sí mismo. Es el rango de caracteres que puede tener una contraseña, en este caso, mayúsculas y minúsculas. Como hay 26 caracteres en el alfabeto, 26 x 2 = 52 caracteres en todo el rango de la contraseña.
La longitud de la contraseña también se explica por sí misma. Es la longitud total de la contraseña después de la creación.
Restricciones
- Sin entrada.
- Una palabra no puede reaparecer en la misma contraseña.
- No se permiten símbolos o números en una contraseña.
- 4 palabras por contraseña, pero un mínimo forzado de 4 letras por palabra.
- No hay espacios entre palabras.
- No puede generar la misma contraseña una y otra vez.
- Cada palabra debe estar en mayúscula en una contraseña.
- La salida tiene que ser legible por humanos, debe estar espaciada. También debe incluir la Intropía de contraseña de Kuan de la contraseña con la ecuación de Intropía de contraseña de Kuan anterior.
- Diccionario . Debe usar esto, descargarlo como un archivo de texto e integrarlo en consecuencia. Esta será la lista de la que tomarás palabras. Su código debe asumir que está disponible.
- Este es el código de golf , gana el byte más corto.
Salida
TriedScarProgressPopulation 153.9
TryingPastOnesPutting 119.7
YearnGasesDeerGiven 108.3
DoubtFeetSomebodyCreature 142.5
LiquidSureDreamCatch 114.0
N
símbolos del conjuntoS
, la entropía de la contraseña eslog2(|S|)*N
. Aquí el tamaño del conjunto de símbolos es el tamaño del diccionario (|S|=4284
) y el número de símbolos es el número de palabras (N=4
), por lo que la entropía para cada contraseña es48.3
.3t1ta#asd
), entonces la entropía será el logaritmo del número de contraseñas posibles. Si siempre elige 4 palabras uniformemente al azar de un diccionario de 4284 palabras, entonces hay 4284 ^ 4 contraseñas, cada una con entropía log₂ (4284) * 4 ≈ 48.26.Respuestas:
Pitón 2,
1021019791 bytesAsume el diccionario como una lista llamada
f
.Se puede probar guardando el archivo como
dict.txt
y llamandofuente
exec
(exec
es una palabra clave en Python 2).shuffle(f);
.57*len(x)/10.
. Guarde otro byte quitando los paréntesis haciendo que la impresión tome una tupla. Aquí hay una versión reducida: TIOsample(f,4)
lugar deshuffle
. Tambiénf
puede seropen('dict.txt').read().split('\n')
,open('dict.txt').readlines()
o simplementeopen('dict.txt')
(sé que no es golf pero aún así).PowerShell (3.0+), 77 bytes
Pruébalo en línea!
El uso de Jonathan Allan 's
57*len/10
truco de .$d
contiene el diccionario como un conjunto de palabras. Si estás jugando en casa y quieres llenar$d
:Usando una versión de golf
(Get-Culture).TextInfo.ToTitleCase()
para poner en mayúscula la primera letra; No creo que haya una forma más corta de hacerlo en PowerShell.El resto es bastante sencillo, creo.
El enlace TIO tiene todo el diccionario; desactivar el caché y volverse loco!
fuente
$d
como se supone, suponiendo que esté presente en el entorno.(gc d)| random..
donde el diccionario es un archivo llamado d en el mismo directorio.Jalea , 22 bytes
Un enlace monádico que toma una lista de la lista de caracteres, el diccionario analizado (como se permite en el chat ).
Pruébalo en línea! (Haga clic en "Argumentos" para ocultar el diccionario y reducir la necesidad de desplazarse).
¿Cómo?
Como el diccionario solo contiene palabras válidas (
4
caracteres o más, solo[a-z]
), no es necesario verificar esta condición.Dado que todas las palabras en el diccionario tienen longitudes en
[4-8]
la contraseña, las longitudes posibles están en[16,32]
, y las posibles entropías nunca se redondearán de manera diferente a un decimal si se reemplazalog(52,2)
con5.7
. El único problema es que el uso de un valor de punto flotante5.7
dará punto flotante errores de redondeo para las longitudes18
,26
y31
. Sin embargo, multiplicar por57
y luego dividir mediante el10
uso×57÷⁵
evita esto (mientras sigue siendo un byte más corto que imprimir el valor de precisión de punto flotante completo usando×52l2¤
).fuente
Ruby,
8983 bytesAsume que las contraseñas se almacenan en la variable
d
. Puede agregar esta línea antes del código:y llame al script por ejemplo así:
Salida de muestra:
KitchenMiseryLurkJoints ... wow.
-6 bytes de Ajedi32
fuente
shuffle!
y reemplazarpop
consample
.A word cannot reappear in the same password
, pensando que no significaba la reutilización de palabras en todas las contraseñas. Gracias :)Mathematica, 178 bytes
Pruébalo en línea
copia y pega usando ctrl-v y presiona shift + enter para ejecutar
Mathematica, 136 bytes
suponiendo que m es el diccionario, el código es
.
fuente
hosts
archivo).Bash ,
6665 bytesPruébalo en línea!
El diccionario es recibido por STDIN. Baraja todas las palabras en el diccionario y genera las primeras 4.
Para cada palabra, suma su longitud en var l, y hace eco de la palabra en mayúscula. Al final llama a bc para hacer los cálculos.
Solución Awk, 112 bytes, cuatro contraseñas:
fuente
(Esta es una adaptación de la respuesta de Martmists, pero no tengo el representante para comentar)
Python,
8886 bytesAl explotar cómo
set
es no determinista, puede evitar tener que importar bibliotecas de aleatoriedad.fuente
set(f).pop()
.set(f).pop()
embargo no funciona, lo probé. Da el mismo resultado cada vez.Japt , 30 bytes
Pruébalo en línea!
fuente
JavaScript (ES6), 164 bytes
Asume que el diccionario se pasa a la función como una matriz.
Fragmento de prueba
fuente
Mathematica, 71 Bytes
Asumiendo que el diccionario ya está cargado en una matriz llamada
d
.Explicación:
fuente
ColdFusion 216 bytes
Esto funciona en ColdFusion 11+ y Lucee 4.5+
Para ejecutarlo: https://trycf.com/gist/ff14e2b27d66f28ff69ab90365361b12/acf11?theme=monokai
El enlace TryCF tiene menos golf-ish pero el mismo código.
Realmente no esperaba tener una respuesta de golf competitiva; Solo quería ver qué se necesitaría para completar este desafío en ColdFusion. Especialmente porque no hay mucha FQ en estas respuestas. :-) Después de la configuración, fue sorprendentemente más corto de lo que esperaba.
Mi primer intento fue un poco más corto hasta que recordé que la misma palabra no se puede usar más de una vez. Aunque es muy poco probable que el aleatorizador elija el mismo índice más de una vez, vuelco los índices en las claves de una estructura, lo que evitará la duplicación. Luego uso esa lista de claves para construir mi cadena de contraseña final. También usé el truco matemático para encontrar la entropía.
fuente
PHP ,
136129 bytes-7 bytes, gracias Jörg
Pruébalo en línea!
fuente
Python 3, 252 bytes
¡Este es mi primer desafío de código de golf que he hecho! Sé que hay otras respuestas de Python aquí (que probablemente sean mejores que las mías), pero esto parecía divertido, por lo que quería probarlo de todos modos. Aquí está la versión de golf:
¡Publicaría una Prueba en línea! enlace, pero eso no admite múltiples archivos. Así que aquí hay un enlace repl.it: https://repl.it/InIl/0
Además, aquí está la versión sin golf:
Como dije, esta es la primera vez que hago gofling de código, así que estoy seguro de que esto podría mejorarse mucho.
fuente
tcl, 137
No es un ganador seguro, pero creo que se puede jugar un poco más al golf.
demo - El propósito de la línea 1 es solo poner el contenido del diccionario en la variable
d
fuente
Vim, 87 pulsaciones de teclas
Asume que el diccionario está en un archivo llamado
w
. Siempre usará 4 palabras consecutivasExplicación:
fuente
q / kdb +,
76746556 bytesSolución:
Ejemplo:
Explicación:
Lea en la lista de palabras, separe en "", elija 4 palabras al azar de esta lista, la primera letra en mayúscula de cada palabra, luego únalas. Alimente esto en una función lambda que devuelve la contraseña y la 'entropía' calculada:
Notas:
Me derrumbé y usé 5.70044 en lugar de
2 xlog 52 xexp
...fuente