O servidor de domínio exige que todos os funcionários tenham uma senha forte e aleatória, em conformidade com as seguintes regras:
- Exatamente 15 caracteres.
- Apenas caracteres digitáveis pelo teclado (conforme mostrado no tipo de código abaixo). Ensinar as vendas a usar os códigos ALT + NUMPAD não é permitido.
- Pelo menos 1 letra minúscula:
abcdefghijklmnopqrstuvwxyz
- Pelo menos 1 letra maiúscula:
ABCDEFGHIJKLMNOPQRSTUVWXYZ
- Pelo menos 1 dígito numérico:
0123456789
- Pelo menos 1 símbolo:
`~!@#$%^&*()_+-={}|[]\:";'<>?,./
Para esse fim, a TI encomendou e distribuirá um Gerador de senha aleatória a todos os funcionários. Todos os funcionários deverão usar o Gerador de senha aleatória. Os requisitos para o Gerador de senha aleatória são, além das restrições de senha acima:
- Ele deve ser capaz de gerar todas as permutações de todos os caracteres permitidos.
- Ele deve exibir a senha gerada na tela.
- É necessário que o código seja o menor possível (em bytes).
Envie sua solução proposta dentro da próxima semana.
correcthorsebatterystaple
Respostas:
Mathematica (18)
Deixe-me um pouco de trapaça
PS não segurança :)
fonte
Ruby,
7469 bytesFaça uma amostra aleatória do intervalo de ascii 33 - 126 até que todas as classes de caracteres estejam presentes:
Ruby, 39 bytes
Usando a descoberta inteligente de alce:
Edite para satisfazer a multidão:
Observe que as regras foram alteradas depois que eu publiquei isso pela primeira vez. No momento, as duas entradas anteriores se aplicavam às regras. Gostaria também de salientar que as regras ainda não estão muito bem definidas:
"Permutações". Não há permutações dos caracteres permitidos que estejam em conformidade com o restante das regras, porque qualquer permutação do conjunto de caracteres permitidos é tão longa quanto o próprio conjunto de caracteres permitidos (enquanto a senha deve ter 15 caracteres). E não há repetições em uma permutação. No entanto, minha primeira entrada é ainda mais "aleatória" do que muitas das outras respostas bem votadas aqui.
No entanto, aqui está. Permite repetições de caracteres e sublinhado:
Ruby, 77 bytes
Eu também usei no
puts
lugarp
deste porquep
imprime a cadeia de caracteres entre "aspas" e alguns caracteres escapam com uma barra invertida.Ruby, 70 bytes
Como Ventero aponta,
~
pode ser pulado na frente dos regexes eprint
pode ser substituídoputs$_
. Mas com a saída feia, isso faz com que você também possa imprimir todas as senhas rejeitadas, comprimindo-as em uma única linha:Explicação
Como pedido.
$_
é uma variável semi-mágico que contém a última linha ler da entrada - para que você não precisa sempre de armazená-lo, como este . Aqui, porém, a usamos por causa de outra propriedade, a saber, que o~
operador aplica uma regex diretamente a ela, um truque que aprendi pela primeira vez por chron . Substituí o uso deall
, mas deve ser bem fácil entender se você tem o restante ( consulte os documentos ).fonte
.all?{|r|~r}
faz? O que$_=
faz?\W
em Ruby incluem o sublinhado_
? Na maioria dos dialetos regex eu sei que não. E se o seu código não pudesse gerar senhas em que um_
fosse o único símbolo não alfanumérico, isso violaria um requisito. A segunda abordagem viola muito obviamente esse requisito, mas acho que não foi redigido corretamente naquele momento.\W
não contém um sublinhado no RegEx compatível com Perl ( origem ).sample
não repete elementos; portanto, senhas com elementos repetidos não podem ser geradas pelo seu código. Você pode corrigir esses dois problemas para tornar sua resposta conforme a pergunta? Vendo como a sua é a solução líder, exceto o Wolfram Alpha, seria bom verificar se você pode se conformar e ainda manter a liderança. Eu acho que não deve ser muito difícil.Java 8 -
354329319275267 caracteresApenas por diversão, usando lambdas com Java 8 - cada saída possível tem a mesma probabilidade de ser encontrada.
Ele usa o fato de que os caracteres permitidos têm códigos ASCII consecutivos, de 33 a 126.
Saída de amostra:
Programa compactado:
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);}}
fonte
while(a+A+d+p<4)
junto com ema|=1
vez dea++
? Ou use máscaras de bits, ou seja, coisas comoa|=1
througha|=8
, coma<15
a condição loop. Isso economiza outros 13 caracteres se eu contei corretamente.new String(int[],int,int)
salva outros 40 caracteres ímpares!Python 2.X + 3.X (229 caracteres): gere e substitua
Idéia
r
por um dígito aleatórios
, coms != r
, por uma letra maiúsculaCódigo
Python 2.X + 3.X (194 caracteres): Gere e verifique
\u
e\l
não existe no regex do Python.random.sample
é sem substituição, seja para obter todas as senhas permitidas possíveis, precisamos de amostragem com substituição.Usando falha na descrição do problema
Atualmente, a descrição do problema não exige que todos os símbolos / dígitos apareçam com a mesma probabilidade. Com a solução a seguir, você não pode fazer nenhuma suposição sobre um único símbolo e / ou posição. Mas você pode fazer isso com vários.
Python 2.X + 3.X (62 caracteres)
Agradeço a daniero pela ideia de usar a amostra.
fonte
\l
e assim por diante para os regexes python documentados? Não o veja na referência . Meu Python 3.3.3 nem aceita"\u"
. Ostr(…)
não une as letras em 3.3.3 ou 2.7.6. Uma sugestão para Otimização:all(s("\\"+i,p)for i in "dluW")
.random.sample
escolhe elementos sem substituição, para que nem todas as senhas sejam possíveis.\u
e\l
é apenas para vim.Bash em * nix (109)
Para funcionar corretamente,
$a
não deve ser definido com uma senha válida, mas não aleatória, com antecedência. Se você deseja incluira=
e uma quebra de linha na frente, são mais três caracteres, mas permite executar a coisa repetidamente. Obviamente, você também pode substituir todas as novas linhas;
por uma única linha que possa ser executada quantas vezes desejar.Além disso, você deve definir
LC_ALL=C
ou não variáveis de ambiente específicas do código do idioma (LANG
eLC_CTYPE
em particular), pois os intervalos de caracteres dependem da ordem de intercalação igual à ordem ascii./dev/urandom
é a fonte de bytes aleatórios.!-~
é o intervalo de todos os caracteres permitidos, conforme especificado na pergunta.tr -dc
remove todos os caracteres não listados em seu próximo argumento.head
leva 15 dos caracteres restantes.grep
verifica se cada um dos tipos necessários ocorre pelo menos uma vez. Sua entrada consiste em quatro cópias do candidato; portanto, a ordem dos símbolos não importa; portanto, todas as senhas possíveis têm chance de serem selecionadas. O-q
to grep suprime a saída.Por razões desconhecidas, em
/dev/random
vez de/dev/urandom
levar idades. Parece que a entropia se esgotou muito rapidamente. Se vocêcd
para/dev
, você pode evitar mais alguns bytes, mas que se sente um pouco como fazer batota.Python 2 (138)
Para tornar o código legível, adicionei uma nova linha e recuo após o loop, que não é necessário e que não contei.
Esta é essencialmente a mesma ideia que na versão bash. A fonte aleatória aqui é
random.sample
, que não repetirá elementos. Para combater esse fato, usamos 15 cópias da lista de cartas permitidas. Dessa forma, todas as combinações ainda podem ocorrer, embora aquelas com letras repetidas ocorram com menos frequência. Mas decido considerar isso um recurso, não um bug, já que a pergunta não exigia igual probabilidade para todas as permutações, apenas a possibilidade.Python 3 (145)
Uma nova linha e um recuo novamente não são contados. Além de algumas sobrecargas de sintaxe específicas do Python-3, esta é a mesma solução do Python 2.
JavaScript (161)
Eu adicionei as novas linhas para facilitar a leitura, mas não as contei.
R (114)
Quebra de linha e recuo dentro do loop foram adicionados, mas não contados. Se quiser, você pode movê-lo novamente para uma
;
linha separada.fonte
grepl
no seu código R. Se ao menos eu tivesse pensado em repetir a senha do teste quatro vezes para que você pudesse fazer todas as verificações em uma. E você sabe, se eu tivesse pensado sobresample
eintToUtf8
. No entanto, você precisa adicionarreplace=TRUE
(ou mais concisamente, apenas adicionar,T
) ao seu método de amostra para garantir que você esteja obtendo todas as senhas possíveis.replace=T
erro, obrigado por apontar isso. EncontrarintToUtf8
adivinhando nomes prováveis com a conclusão da guia me levou um bom tempo; Eu sabia que essa função deveria existir, mas os nomes mais comuns comochr
e assim por diante não foram usados.*4
? Eu pensei que seu regex corresponderia a qualquer sequência, esse anúncio primeiro uma letra maiúscula, depois qualquer coisa, depois uma letra minúscula do que qualquer coisa ... o que eu entendi errado?re.search
nãore.match
, portanto, o regex pode corresponder a qualquer lugar da senha do candidato. Isso explica por que terminará eventualmente?re.search
vez dere.match
. Isso explica tudo. Mas ainda acho que você não precisa do*4
. Obrigado pela explicação (+1)C # (
123 - 139103 - 127 caracteres compactados):Usando um método de estrutura perfeitamente adequado em
System.Web.dll
:Compactado:
Exemplo:
Como alternativa, pegue o valor do segundo parâmetro (
int numberOfNonAlphanumericCharacters
) na linha de comando:fonte
GeneratePassword
não suporta o conjunto completo de símbolos especificado na pergunta. Também não encontrei garantias sobre o número mínimo de ocorrências de cada categoria de personagem.class P
estring[] a
.R (
301322 caracteres)A correção esqueceu de verificar os dígitos.
(espaço em branco adicionado apenas para maior clareza).
Gera todas as permutações possíveis de 15 caracteres dos 94 caracteres. Em seguida, seleciona aleatoriamente um até que corresponda aos critérios.
A mágica está na
q:q
operação, que gera um novo tipo de dado de fator que é a interação de todos os fatores da primeiraq
lista com todos os fatores da segunda lista , com todas as combinações possíveis dessas duas listas incluídas na lista de " níveis "desse fator. Interaja 15 cópias da lista de caracteres permitidos e você obtém (94 ^ 15) níveis possíveis.Por favor não tente isto em casa. O código leva alguns segundos para descobrir todas as permutações de três caracteres. Realmente não consigo imaginar quanto tempo levaria para descobrir todas as permutações de 15 caracteres, se o computador não tivesse apenas memória insuficiente no enquanto isso. Quando executei o script finalizado (senha de três caracteres) para verificá-lo, a primeira senha que ele cuspiu foi "oO =", que eu penso resume a reação que você deve ter com esse código.
fonte
Mathematica 170
Exemplos
"<]} Pg3 / e? 3 + Z ~ Oz"
"X / 8jWe @ f (_x5P: ="
"2wz2VQhtJC? * R7 ^"
fonte
Python 2.7 (182)
fonte
join
tipo de coisa deve estar lá: seria esperado que os usuários entendessem a sintaxe da lista python a partir da saída['q', 'u', ...]
:?aA$bc1111111111
).Golfe (60)
Desde o obl. golfscript está faltando e como um noob eu preciso da prática de qualquer maneira :)
Ele apenas cria uma matriz com os 4 caracteres aleatórios necessários + 11 e ordena em ordem aleatória.
fonte
{r}$
. Essa é uma maneira bastante suja de embaralhar uma lista - eu gosto! ;-)0Aa~~~~~~~~~~~~
. :-(JavaScript
258240233225Usando uma regra em que:
function(x){return x*x}
pode ser reescrito comofunction(x)x*x
. Apenas parece funcionar para funções que retornam um valor.Próxima iteração, reduzida
x.sort(function().5-R())
parax.sort(y=>.5-R())
Próxima iteração, reduzida ainda mais com a notação de seta gorda, que infelizmente só funciona para o Firefox 22 e superior.
fonte
JavaScript (269 caracteres compactados)
Para maior clareza, este é o código antes de compactá-lo no JS-Fiddle :
Aqui, ele é compactado em 269 caracteres ( JS-Fiddle ):
fonte
shuffle()
"função personalizada". É parte do JavaScript ou código que você teria que escrever por conta própria?Clojure (63):
Mas precisa ser aprimorado para garantir que contenha pelo menos 1 caractere de cada categoria (Superior, Inferior, Dígito, Símbolo).
fonte
No servidor sql
Veja em ação - 1
veja em Ação - 2
fonte
~0Aa
, nem qualquer senhab
seguida pora
.SAS (191)
*TQP,(f=h10*)S=
Comentado / recuado:
fonte
PowerShell: 119
Código Gofled
Sem golfe e comentado
fonte
^.*(?=.{15,})(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[!#$%&? "]).*$
você pode fazer uma correspondência com isso, que só corresponderá quando houver um símbolo superior, inferior, dígito e dígito.1aZ%
e(p3R
corresponderiam? Tive alguma dificuldade em encontrar maneiras de fazer isso online.$x-cmatch'^.*(?=.{15,})(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[!#$%&? "]).*$'
Boas correspondências: Correspondências comC>suD1?hTwbDx(z
j%4O]HyeG|u[U$5
O/rGeD0$hJk=GO/
falha:3evthX3_X^nBrR`
.nA ~ uYzrR4YV-r.u-IjZE48ntQ;HxV
Python 2.7 (149)
Escrito de maneira mais legível (e não executável);
Bastante direto e surpreendentemente não muito mais do que uma versão "gerar, tentar novamente ao falhar na correspondência".
fonte
0Aa~~~~~~~~~~~~
? (Note-se que'~' == chr(126)
.)PSQL (189)
Parece que o PSQL é um pouco detalhado ... :)
Demonstração do SQLfiddle .
fonte
PHP,
235225Esse script embaralha os caracteres e é verificado via RegEx para garantir que a senha seja forte (ou seja regenerada).
fonte
while(true) ... if (condition) break
você pode usarwhile (!condition)
Javascript (209)
Semi-não-destruído;
fonte
Perl, 92
Não é tão conciso quanto a resposta do Ruby, mas tenho certeza de que um assistente de Perl poderia tornar isso ainda mais curto ... Não estou muito feliz com todos os
m//
s no final, mas parece funcionar e deve satisfazer as condições para eventualmente gerar todas as permutações.Uso da amostra:
Editado para corrigir a validação e mudar
[[:punct:]]
para[\W_]
após os comentários dos MvGs.fonte
aaaaaaaaaaaaaa
faria o loop terminar. Você deve testar critérios com senhas não aleatórias para garantir que eles façam o que você deseja.[[:punct:]]
? Acho que prefiro o, which is shorter and of which I'm even more sure that it is correct, at least combined with your
intervalo '[\ W_] 33..127`.\W
por não incluir_
, no entanto, você está absolutamente certo, não é necessário: gist.github.com/anonymous/8301237 . Obrigado!Java 7 (
270234 caracteres)A premissa é a mesma usada por @assylias com java 8 (gerar senhas aleatórias até uma senha válida). No entanto, em vez de usar lambdas, a senha é gerada iterando uma matriz char e validada pela correspondência de uma regex.
Código Minificado:
fonte
Powershell
Versão One Liner (143 bytes)
Mini versão (146 bytes)
Versão legível (860 bytes)
fonte
abcd1234ABCD{|}~
nunca vai vir para cima porque$symbol
as forças, pelo menos um dos símbolos para estar entre ASCII 33 e 47$SR
, talvez$Q
?(g(65..90))
as65..90|g'. And change the
instruções down foreach` emforeach-object
loops usando o%
alias. Exemplo:foreach($N in (1..11)){
...}
deve ser factível como1..11|%{
...}
. Tenho certeza de que há outras otimizações possíveis, mas na verdade tenho uma implementação completamente diferente em mente que pretendo tentar mais tarde.Fator, 196 caracteres
Mesmo algoritmo que MvG e moose. Não é o mais curto, mas deve atender a todos os critérios (atuais) da pergunta:
fonte
~{}|1234abcdABCD
falhará na regex."~{}|1234abcdABCD" 60 cycle "[A-Z].*[a-z].*[0-9].*[\\W_]" findall empty? not => t
C - 154 caracteres
Como odeio
srand()
? Deixe-me contar os caminhos.fonte
Haskell, 192
A sequência impressa possui aspas e escapa os caracteres de barra invertida e de aspas; se isso for inaceitável,
print
pode ser substituídoputStrLn
por mais 3 bytes. Aqui está uma versão mais legível:É bem simples, apenas cria uma lista infinita / lenta de caracteres ASCII aleatórios no intervalo
'!'
para'~'
, em seguida, lança o primeiro elemento até que os 15 primeiros caracteres tenham pelo menos um caractere de cada sequência de caracteres necessários.fonte
Excel VBA, 209 bytes
Gera aleatoriamente 15 caracteres ASCII para que todas as combinações possíveis sejam possíveis. Em seguida, usa um padrão de expressão regular para verificar se ele contém pelo menos um de cada critério.
Se isso acontecer, a senha será exibida, se não "refazer" será exibido.
Agradecemos a Bart Kiers pelo padrão Expressão Regular: https://stackoverflow.com/questions/1559751/regex-to-make-sure-that-the-string-contains-at-least-one-lower-case-char- superior
fonte
AutoHotkey 352
Usando - Basta executar o script
fonte
Python (121 caracteres)
Faz uso do fato de que você pode multiplicar listas em Python [1,2,3] * 2 fornece [1,2,3,1,2,3]. Importa aleatoriamente. Os números em uma lista multiplicada por três são bordas entre os intervalos na tabela ascii para os caracteres necessários, por exemplo, [65, 90] mapeia para letras maiúsculas.
fonte
import random
no código.PHP 5.5 (230 bytes)
Ou em uma linha (211 bytes)
fonte