Gerando uma senha adequada

8

História

Preciso me lembrar de muitas senhas e não quero usar a mesma para vários sites, então criei uma regra, mas a regra não deve ser transparente, então o que faço é:

  • Pense em uma palavra longa ou conceito como breadpudding.
  • Substitua a primeira letra pelo site em que estamos fazendo login. Se estamos logando google, nossa palavra se torna greadpudding.
  • Faça a primeira letra maiúscula.
  • Mude a segunda letra para um @sinal.
  • Se a senha começar com uma não consoante, adicione um determinado número (como 1234); caso contrário, adicione outro número (como 4321).

Ta da, agora você tem uma senha adequada.

Embora esse processo seja árduo, preciso de um programa para gerar isso para mim com base no seguinte:

Problema

Dados fornecidos:

  • a : a palavra inicial, que é uma sequência e é sempre em minúscula, com garantia de mais de três caracteres.
  • b : o site no qual estamos efetuando login, que é uma string e sempre está em minúscula e é garantido que não está vazio.
  • c : o número de não consoantes, que é um número inteiro positivo que pode ter zeros à esquerda.
  • d : o número de consoantes, que é um número inteiro positivo que pode ter zeros à esquerda.

Saída uma string com base nos critérios acima.

Casos de teste

Entrada a="volvo", b="gmail", c=5555, d="0001"

G@lvo0001

Entrada a="sherlock", b="9gag", c=31415926535, d=3

9@erlock31415926535

Entrada a="flourishing", b="+google", c=11111, d=2222

+@ourishing11111

Regras

  • y é uma consoante.
  • Se você decidir cou dfor um número inteiro, poderá analisá-lo como tal e os zeros à esquerda podem ser ignorados ( 0091tratados como 91).
  • Espaço em branco e novas linhas à direita são permitidos.
  • Você pode enviar o resultado para STDOUT ou retornar o resultado em uma função.
  • Caracteres permitidos em ae bsão [a-z0-9!@#$%^&*()_+=-].
  • Você pode aceitar as 4 entradas em qualquer ordem consistente.

Isso é . O menor código em bytes vence.

LiefdeWen
fonte
5
Através de 20 anos de esforço, treinamos com sucesso todos para usar senhas difíceis de lembrar para os humanos, mas fáceis de adivinhar pelos computadores. A força da senha nunca é determinada pelo número de caracteres especiais / maiúsculos na senha.
Leaky Nun
@LeakyNun Sim, eu concordo, mas a quantidade de conjuntos de caracteres permitidos também torna mais difícil, então imagine se uma caixa de senha permitisse apenas letras minúsculas, diminuindo muito a dificuldade de forçar brutos.
precisa saber é o seguinte
Sim, em um determinado período, a inclusão de mais tipos de caracteres (números, maiúsculas, símbolos) aumenta a segurança, mas não exponencialmente. Uma senha longa em letras minúsculas é muito mais forte que uma senha curta do tipo misto de caracteres. De acordo com zxcvbn: "4321breadpudding" (10 ^ 9) quebrado em <1s armazenado como hash rápido ", 4321G @ eadpudding" (10 ^ 11) quebrado em 8s ", vovó faz muito pudim de pão" (10 ^ 24) quebrado em séculos , "Vovó, faça um ótimo pudim de pão!" (10 ^ 27) quebrado em séculos. Lembre-se de calcular a dificuldade da senha em ordens de magnitude; nesse caso, 2 não é muito!
precisa saber é o seguinte
3
"Quanto tempo o G @ anny faz um ótimo pudim de pão levar para ser quebrado"? Bem, agora ele está em todas as listas crackz0rd tão menos de 1 segundo :-P
Olivier Grégoire
1
@LeakyNun Você leu o texto de sabor para o quadrinho do xkcd ..?
Poke

Respostas:

2

Geléia , 17 bytes

Ḣ©Œu;”@o;⁶⁵®eØC¤?

Um programa completo, tendo os argumentos na ordem b, a, c, d.

Experimente online!

Quão?

O link principal é diádica, tendo be a, as entradas do programa são, em seguida b, a, ce d(o terceiro ao sexto argumentos de linha de comando), então ce dsão acessados como tal.

Ḣ©Œu;”@o;⁶⁵®eØC¤?  Main link: b, a           e.g. "gmail", "volvo" (c="5555" and d="0001")
Ḣ                  head b                         'g'
 ©                 copy to register and yield     'g'
  Œu               convert to uppercase           "G"
     ”@            literal '@' character          '@'
    ;              concatenate                    "G@"
       o           logical or with a (vectorises) "G@lvo"
                ?  if:
               ¤     nilad followed by link(s) as a nilad:
           ®           recall value from register  'g'
             ØC        yield consonants            "BCDFGHJKLMNPQRSTVWXYZbcdfghjklmnpqrstvwxyz"
            e          exists in?                  1
         ⁶         ...then: 6th arg = 4th in = d   "0001" 
          ⁵        ...else: 5th arg = 3rd in = c   "5555"
        ;          concatenate                     "G@lvo0001"
                   implicit print
Jonathan Allan
fonte
3

Python 3 , 69 bytes

lambda a,b,*c:b[0].upper()+"@"+a[2:]+c[b[0]in"bcdfghjklmnpqrstvwxyz"]

Experimente online!

Freira Furada
fonte
Por que não usar b[0]not in"aeiou"?
officialaimm
3
@officialaimm porque, por algum motivo esquecido por Deus, 9é contado como não consoante.
Leaky Nun
Sim, a regra em questão não diz nada sobre os números explicitamente ...
officialaimm
2
Salve 3 bytes (nota: zé o máximo de caracteres possível):('a'<b[0])*b[0]not in"eiou"
Jonathan Allan
2

05AB1E , 22 20 18 bytes

н©u'@I¦¦žN®åiI\}IJ

Entrada tomada como b,a,c,d

Experimente online!

Explicação (desatualizada)

¦                     # remove the first char of a
 s                    # swap b to the top of the stack
  н©                  # push the head of b and store a copy in register
    uì                # convert the head to upper case and prepend to a
      U               # store in variable X
       žN®åi          # if the head of b is a consonant
            \}        # discard c
              X«      # concatenate X with c or d
                '@1ǝ  # insert an "@" at character position 1

usado no link como нainda não foi enviado ao TIO.

Emigna
fonte
2

Javascript ES6, 87 bytes

(a,b,c,d)=>b[0].toUpperCase()+'@'+a.slice(2)+(/[bcdfghjklmnpqrstvwxyz]/.test(b[0])?d:c)

Demo

Weedoze
fonte
Eu estava prestes a postar isso. Quero dizer, literalmente , personagem por personagem. Bummer, lol
Hankrecords
@Hankrecords Hehe, talvez possamos melhorá-lo
Weedoze
Desde {|}~não são caracteres válidos, você pode substituir /[bcdfghjklmnpqrstvwxyz]/.test(b[0])?d:ccom /[ -_aeiou]/.test(b[0])?c:dpara menos 13 bytes
PunPun1000
2

C, 441 286 139 bytes

#define o(c)*a[1]==0xc
int main(int b,char** a){printf("%c@%s%s",*a[1],a[2]+2,(*a[1]>97&*a[1]<128)
&!(o(65)|o(69)|o(6F)|o(75))?a[4]:a[3]);}
ulascan
fonte
1
erm ... em vez de 21 conjuntos de argv[1][0]='c'|argv[1][0]='c'|...onde c = consoante, você pode facilmente reduzir isso fazendo !(argv[1][0]='a'|argv[1][0]='e'|argv[1][0]='i'|argv[1][0]='o'|argv[1][0]='u')Reduz a pontuação em 264 apenas por isso!
precisa
Não, como mencionado em contrário, que permite números e outros caracteres
azul
@muddyfish então você faz (argv[0][1]>='a'&argv[0][1]<='z'&!(argv[1][0]='a'|argv[1][0]='e'|argv[1][0]='i'|argv[1][0]='o‌​'|argv[1][0]='u')). Ainda menor por uma margem. No entanto, existem tantas maneiras de jogar esse código que não sei por onde começar ...: s
Olivier Grégoire
Estou aberto a idéias :) Esta é minha primeira tentativa de golfe
ulascan
Bem, você está bem! Tenho certeza de que ainda pode ser aprimorado, como usar uma variável em vez de usar uma macro, mas sim, você está começando com o pé direito! :) Você provavelmente poderia fazer bom uso dessas dicas de golfe !
Olivier Grégoire
2

R , 105 103 bytes

pryr::f({m=substr(b,0,1);paste0(toupper(m),'@',substring(a,3),'if'(grepl("[b-df-hj-np-tv-z]",m),d,c))})

Função anônima. Avalia para

function (a, b, c, d) 
{
    m = substr(b, 0, 1)                      #first letter of website
    paste0(toupper(m),                       #concatenate that letter, capitalized,
           "@",                              #an '@',     
           substring(a, 3),                  #the rest of the long string,
           if(                               #and
           grepl("[b-df-hj-np-tv-z]", m)),   #if the first letter is a consonant,
           d                                 #the consonant string/num,
           else c)                           #else the other one
}

que é o que está no TIO. Por favor, me ajude a jogar esse regex porque sou péssimo com eles.

Salvou 2 bytes de Giuseppe.

Experimente online!

BLT
fonte
você poderia usar!grepl('[aeiouy]',m)
Giuseppe
1
ou melhor ainda, grepl('[aeiouy]',m)e apenas troque ce d.
21717 Giuseppe
93 bytes "if" tornam a ifsintaxe muito mais clara em vez de usar elseor ifelse; Também salvei substringem uma variável e coloquei mem maiúscula imediatamente para salvar um byte.
21717 Giuseppe
1
Tentei executar sua função e tive dois problemas: pryrestá tentando substringargumentar; e você greplsó encontra "não vogais", o que não é o mesmo que consoantes. A "if"coisa que eu perdi, obrigado por apontar isso.
BLT
Na verdade, eu não tinha testado; Eu não sabia pryr::fque não iria gostar disso; você poderia usar o regex '[az && [^ aeiouy]]' da resposta de Kevin Cruijissen?
21417 Giuseppe #
2

Retina , 80 75 bytes

^..(.*)¶(.).*
$2@$1
^([ -_aeiou].*)¶(.*)¶.*
$1$2
(.*)¶.*¶(.*)
$1$2
T`l`L`^.

Experimente online!

Experimentar um novo idioma aqui, recebe entradas na ordem dada na pergunta

Explicação:

^..(.*)¶(.).*
$2@$1

Crie uma palavra que seja a segunda palavra, primeira letra, sinal @, primeira palavra a partir do terceiro caractere.

^([ -_aeiou].*)¶(.*)¶.*
$1$2

Se a palavra começar com uma não consoante, acrescente o primeiro número

(.*)¶.*¶(.*)
$1$2

Se ainda restarem 3 linhas (nenhuma substituição na última etapa, portanto, ela começa com uma consoante), acrescente o segundo número

T`l`L`^.

Maiúscula a primeira letra

PunPun1000
fonte
1

QBIC , 81 bytes

G=ucase$(_s;,1|)+@@`+_s;,3,_lC||~instr(@bcdfghjklmnpqrstvwxyz`,_sC,1|)|?G+;\?G+;

Explicação

Parameters are Website(A$), base word(C$), consonant-number(E$), and nonsonant-number(F$)
G=                           SET G$ to
 ucase$(      )              the upper-case version of (also works for '9gag', '+google')
        _s;,1|                  the first char of the website A$ read from cmd line
 +@@`                        plus a literal @ (B$)
 +_s;,3,_lC||                plus all characters from base word C$ from 3rd char onwards
~instr(                      IF the second arg to INSTR is in the first
 @bcdfghjklmnpqrstvwxyz`,      with all consonants in the first arg
 _sC,1|                        and the first char of the base word C$ in the second
 )
|?G+;                        THEN print G$ plus the consonant addition
\?G+;                        ELSE print G$ plus the other addition

Observe que as duas últimas linhas parecem iguais, mas o intérprete altera ligeiramente o comportamento de cada uma ;: Sempre que vê a ;instrução, cria uma nova variável (nesse caso, os vars È $ andF $ `são os primeiros disponíveis depois de ler tudo literais e argumentos de linha de cmd) e atribui o primeiro parâmetro de linha de cmd ainda não atribuído a essa variável.

steenbergh
fonte
1

JavaScript (ES6), 76 bytes

(a,b,c,d)=>b[0].toUpperCase()+'@'+a.slice(2)+(/[aeiou\d_\W]/.test(b[0])?c:d)

Eu teria acrescentado isso como uma sugestão para melhorar a solução do Weedoze , mas parece que não posso comentar sobre isso, porque eu me espreito

Ian
fonte
1

C # , 111 bytes

(a,b,c,d)=>Char.ToUpper(b[0])+"@"+a.Substring(2)+(b.IndexOfAny("bcdfghjklmnpqrstvwxyz".ToCharArray()==0)?d:c);

A verificação da consoante é particularmente cara, sem capacidade direta de regex no stringtipo.


fonte
1

F # , 157 bytes

let f(a:string)(b:string)c d=System.Char.ToUpper(b.[0]).ToString()+"@"+a.[2..]+(if((Seq.except['e';'i';'o';'u']['b'..'z'])|>Seq.contains b.[0])then d else c)

O F # ainda é muito novo para mim, então provavelmente existem abordagens melhores para isso.


fonte
1

Java 8, 112 99 92 87 bytes

(a,b,c,d)->b.toUpperCase().charAt(0)+"@"+a.substring(2)+(b.matches("[a-z&&[^aeiou]].*")?d:c)

-13 bytes, tomando o parâmetro blast em vez de second.
-1 byte removendo y
-7 bytes graças a @ OlivierGrégoire (e os parâmetros estão em ordem novamente)
-5 bytes graças a @ PunPun1000

Explicação:

Experimente aqui.

(a,b,c,d)->                     // Method with 4 String parameters and String return-type
  b.toUpperCase().charAt(0)     //  First character of B capitalized
  +"@"                          //  + literal "@"
  +a.substring(2)               //  + A excluding first two characters
  +(b.matches("[ -_aeiou].*")?  //  If B starts with a consonant:
    d                           //   + D
   :                            //  Else:
    c)                          //   + C
                                // End of method (implicit / lambda with single return)
Kevin Cruijssen
fonte
1
yé uma consoante, então você pode soltar o yno seu regex por 1 byte.
precisa saber é o seguinte
2
(a,b,c,d)->é mais curto que a->b->c->d->. O curry é útil apenas para 2 parâmetros. Para 3, curry é o mesmo que sem curry. Para 4 e acima, o curry não é mais curto.
Olivier Grégoire
1
(a,b,c,d)->b.toUpperCase().charAt(0)+"@"+a.substring(2)+(b.matches("[a-z&&[^aeiou]].*")?d:c)tem 92 bytes. Além disso, ele usa os parâmetros na ordem correta (o que me confuso no início :-().
Olivier Grégoire
1
@ OlivierGrégoire Obrigado. Na segunda vez, cometi esse erro em relação ao curry com quatro parâmetros. E primeiro toUpperCase()e depois .charAt(0)é realmente mais curto. Não tenho certeza de como perdi isso. (E a ordem diferente era para permitir (b=...), o que não seria possível se não fosse o último parâmetro com curry, porque era preciso final/ estava implícitofinal .)
Kevin Cruijssen
1
Como {|}~não são caracteres válidos, você pode usar [ -_aeiou]para não consoantes e trocard e cpara menos 5 bytes
PunPun1000
0

V , 25 bytes

ldvjr@Ç^[aeiou]ü^Á/j

DÍî

Experimente online!

Leva argumentos no buffer em ordem:

website
word/phrase
consonant number
non-consonant number
nmjcman101
fonte
0

Bash 4 , 76 bytes

g(){
a=${2:0:1}
c=$4
[[ "aeiou[0-9]" =~ .*$a.* ]]&&c=$3
p="${a^}@${1:2}$c"
}

Funciona no Bash 4:

g volvo gmail 5555 0001; echo $p
g sherlock 9gag 31415926535 3; echo $p
g flourishing +google 11111 2222; echo $p
vee_ess
fonte
0

JavaScript (ES6), 69 bytes

(a,b,c,d)=>e=a[0].toUpperCase()+"@"+a.slice(2)+/[AEIOU]/.test(e)?c:d

Muito simples, provavelmente pode ser jogado golfe

MayorMonty
fonte