Introdução
Aparentemente, esta pergunta foi feita aqui e, infelizmente, foi encerrada. Eu pensei que era uma boa idéia tentar novamente com ele, mas feito da maneira certa.
O XKCD analisa como somos treinados para usar senhas "difíceis de lembrar", pensando que é seguro, mas, em vez disso, levaria um computador três dias para ser descoberto. Por outro lado, lembrar de 4 a 5 palavras traz a Intranet da Senha do Kuan e é fácil de lembrar. Louco como isso funciona, hein?
Desafio
O trabalho hoje é criar 5 senhas usando palavras. 4 palavras por senha e no mínimo 4 letras por palavra, mas não máximo. A Intropy de senha de Kuan precisará ser calculada para cada senha, mas um mínimo forçado não será definido.
O que é a intropia de senha do Kuan?
A Intropy de senha da Kuan é uma medida de quão imprevisível é uma senha, de acordo com Kuan. Não é um cálculo simples: E = log 2 (R) * L . Sendo a Intropy da senha de Kuan, R sendo o intervalo de caracteres disponíveis e L para o comprimento da senha.
O intervalo de caracteres disponíveis é auto-explicativo. É o intervalo de caracteres que uma senha pode ter, nesse caso, maiúscula e minúscula. Como há 26 caracteres no alfabeto, 26 x 2 = 52 caracteres em todo o intervalo da senha.
O comprimento da senha também é auto-explicativo. É o tamanho total da senha após a criação.
Restrições
- Sem entrada.
- Uma palavra não pode reaparecer na mesma senha.
- Não são permitidos símbolos ou números em uma senha.
- 4 palavras por senha, mas um mínimo forçado de 4 letras por palavra.
- Não há espaços entre as palavras.
- Você não pode gerar a mesma senha repetidamente.
- Cada palavra deve ser maiúscula em uma senha.
- A saída deve ser legível por humanos, deve ser espaçada. Também deve incluir a senha Intropy da senha de Kuan usando-a usando a equação Password Intropy da senha de Kuan acima.
- Dicionário . Você deve usar isso, fazer o download como um arquivo de texto e integrar de acordo. Esta será a lista da qual você extrai palavras. Seu código deve assumir que está disponível.
- Isso é código-golfe , os bytes mais curtos vencem.
Saída
TriedScarProgressPopulation 153.9
TryingPastOnesPutting 119.7
YearnGasesDeerGiven 108.3
DoubtFeetSomebodyCreature 142.5
LiquidSureDreamCatch 114.0
N
símbolo do conjuntoS
, a entropia da senha élog2(|S|)*N
. Aqui, o tamanho do conjunto de símbolos é o tamanho do dicionário (|S|=4284
) e o número de símbolos é o número de palavras (N=4
), portanto, a entropia para cada senha é48.3
.3t1ta#asd
), a entropia será o logaritmo do número de senhas possíveis. Se você sempre escolher 4 palavras uniformemente aleatoriamente em um dicionário de 4284 palavras, haverá 4284 ^ 4 senhas, cada uma com log de entropia₂ (4284) * 4 × 48.26.Respostas:
Python 2,
1021019791 bytesAssume o dicionário como uma lista chamada
f
.Pode ser testado salvando o arquivo como
dict.txt
e chamandofonte
exec
(exec
é uma palavra-chave no Python 2).shuffle(f);
.57*len(x)/10.
. Salve outro byte removendo os parênteses, fazendo a impressão ter uma tupla. Aqui está uma versão resumida: TIOsample(f,4)
vez deshuffle
. Tambémf
pode ser apenasopen('dict.txt').read().split('\n')
,open('dict.txt').readlines()
ou apenasopen('dict.txt')
(eu sei que não é golfed, mas ainda).PowerShell (3.0 ou superior), 77 bytes
Experimente online!
Usando Jonathan Allan s'
57*len/10
truque de .$d
contém o dicionário como uma matriz de palavras. Se você estiver jogando em casa e quiser preencher$d
:Usando uma versão em golfe de
(Get-Culture).TextInfo.ToTitleCase()
para colocar em maiúscula a primeira letra; Não acho que exista uma maneira mais curta de fazer isso no PowerShell.O resto é bem direto, eu acho.
O link TIO possui o dicionário inteiro; desativar o cache e enlouquecer!
fonte
$d
como deveria assumir que está presente no ambiente.(gc d)| random..
onde o dicionário é um arquivo chamado d no mesmo diretório.Gelatina , 22 bytes
Um link monádico que lista uma lista de caracteres, o dicionário analisado (conforme permitido no bate-papo ).
Experimente online! (Clique em "Argumentos" para ocultar o dicionário e reduzir a necessidade de rolar.)
Quão?
Como o dicionário contém apenas palavras válidas (
4
caracteres ou mais, apenas[a-z]
), não é necessário verificar esta condição.Como todas as palavras do dicionário têm comprimentos nos
[4-8]
possíveis comprimentos de senha[16,32]
, as possíveis entropias nunca serão arredondadas de maneira diferente para uma casa decimal do que substituindolog(52,2)
por5.7
. O único problema é que a utilização de um valor de ponto flutuante de5.7
vai dar ponto flutuante erros de arredondamento para comprimentos18
,26
e31
. No entanto multiplicando por57
e , em seguida, dividindo por10
usando×57÷⁵
evita este (enquanto ainda está sendo um byte menor do que a impressão do valor integral de ponto flutuante de precisão usando×52l2¤
).fonte
Ruby,
8983 bytesAssume que as senhas são armazenadas na variável
d
. Você pode adicionar esta linha antes do código:e chame o script, por exemplo:
Saída de amostra:
KitchenMiseryLurkJuntas ... uau.
-6 bytes de Ajedi32
fonte
shuffle!
e substituindopop
porsample
.A word cannot reappear in the same password
, pensando que não significava reutilização de palavras em todas as senhas. Obrigado :)Mathematica, 178 bytes
Experimente online
copie e cole usando ctrl-ve pressione Shift + Enter para executar
Mathematica, 136 bytes
assumindo que m é o dicionário, o código é
.
fonte
hosts
arquivo).Bater ,
66.65 bytesExperimente online!
O dicionário é recebido pelo STDIN. Mistura todas as palavras no dicionário e emite primeiro 4.
Para cada palavra, soma seu comprimento em var l e ecoa a palavra em maiúscula. No final, chama bc para fazer as contas.
Solução Awk, 112 bytes, quatro senhas:
fonte
(Esta é uma adaptação da resposta dos marmistas, mas não tenho o representante para comentar)
Python,
8886 bytesAo explorar como
set
não é determinístico, você pode evitar a importação de qualquer biblioteca de aleatoriedade.fonte
set(f).pop()
.set(f).pop()
, não funciona, eu tentei. Dá o mesmo resultado cada vez.Japonês , 30 bytes
Experimente online!
fonte
JavaScript (ES6), 164 bytes
Assume que o dicionário é passado para a função como uma matriz.
Snippet de teste
fonte
Mathematica, 71 bytes
Supondo que o dicionário já esteja carregado em uma matriz chamada
d
.Explicação:
fonte
ColdFusion 216 bytes
Isso funciona no ColdFusion 11+ e no Lucee 4.5+
Para executá-lo: https://trycf.com/gist/ff14e2b27d66f28ff69ab90365361b12/acf11?theme=monokai
O link TryCF possui menos golf-ish, mas o mesmo código.
Eu realmente não esperava ter uma resposta competitiva no golfe; Eu só queria ver o que seria necessário para concluir esse desafio no ColdFusion. Especialmente porque não há muita CF nessas respostas. :-) Após a instalação, foi surpreendentemente mais curto do que eu esperava.
Minha primeira tentativa foi um pouco mais curta até lembrar que a mesma palavra não pode ser usada mais de uma vez. Embora seja altamente improvável que o randomizador escolha o mesmo índice mais de uma vez, despejo os índices nas chaves de uma estrutura, o que impedirá a duplicação. Então eu uso essa lista de chaves para criar minha string de senha final. Eu também usei o truque de matemática para encontrar entropia.
fonte
PHP ,
136129 bytes-7 bytes, obrigado Jörg
Experimente online!
fonte
Python 3, 252 bytes
Este é o meu primeiro desafio de golfe de código que eu já fiz! Eu sei que existem outras respostas em Python aqui (que provavelmente são melhores que as minhas), mas isso parecia divertido, e então eu queria tentar de qualquer maneira. Aqui está a versão do golfe:
Eu publicaria um Experimente Online! link, mas isso não suporta vários arquivos. Então, aqui está um link repl.it: https://repl.it/InIl/0
Além disso, aqui está a versão não destruída:
Como eu disse, esta é minha primeira vez em busca de códigos, então eu tenho certeza que isso poderia melhorar muito.
fonte
tcl, 137
Não é um vencedor, com certeza, mas acho que pode ser um pouco mais golfe.
demo - O objetivo da linha 1 é apenas colocar o conteúdo do dicionário na variável
d
fonte
Vim, 87 pressionamentos de teclas
Supõe que o dicionário esteja em um arquivo chamado
w
. Sempre usará 4 palavras consecutivasExplicação:
fonte
q / kdb +,
76746556 bytesSolução:
Exemplo:
Explicação:
Leia na lista de palavras, separe "", escolha 4 palavras aleatórias nessa lista, maiúscula a primeira letra de cada palavra e junte-se. Alimente isso em uma função lambda que retorna a senha e a 'entropia' calculada:
Notas:
Eu cedi e usei 5.70044 em vez de
2 xlog 52 xexp
...fonte