Generando una contraseña adecuada

8

Historia

Necesito recordar muchas contraseñas y no quiero usar la misma para varios sitios web, así que se me ocurrió una regla, pero la regla no debería ser transparente, así que lo que hago es:

  • Piense en una palabra larga o concepto como breadpudding.
  • Reemplace la primera letra con el sitio en el que estamos iniciando sesión. Si estamos iniciando sesión google, nuestra palabra se convierte greadpudding.
  • Escribe la primera letra en mayúscula.
  • Cambia la segunda letra a un @signo.
  • Si la contraseña comienza con una no consonante, agregue un número determinado (como 1234); de lo contrario, agregue otro número (como 4321).

Ta da, ahora tienes una contraseña adecuada.

Sin embargo, este proceso es arduo, por lo que necesito un programa para generar esto en función de lo siguiente:

Problema

Entrada dada:

  • a : la palabra inicial, que es una cadena y siempre está en minúscula, y se garantiza que tenga más de 3 caracteres.
  • b : el sitio en el que estamos iniciando sesión, que es una cadena y siempre está en minúsculas, y se garantiza que no está vacío.
  • c : el número para las no consonantes, que es un número entero positivo que puede tener ceros a la izquierda.
  • d : el número de consonantes, que es un entero positivo que puede tener ceros a la izquierda.

Salida de una cadena basada en los criterios anteriores.

Casos de prueba

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

Reglas

  • y es una consonante
  • Si decide co des un número entero, puede analizarlo como tal, y los ceros iniciales pueden ignorarse ( 0091se trata como 91).
  • Se permiten espacios en blanco al final y nuevas líneas.
  • Puede enviar el resultado a STDOUT o devolver el resultado en una función.
  • Personajes permitidos en ay bson [a-z0-9!@#$%^&*()_+=-].
  • Puede aceptar las 4 entradas en cualquier orden consistente.

Este es el . El código más corto en bytes gana.

LiefdeWen
fuente
55
A través de 20 años de esfuerzo, hemos capacitado con éxito a todos para usar contraseñas que son difíciles de recordar para los humanos, pero fáciles de adivinar para las computadoras. La fuerza de la contraseña nunca está determinada por cuántos caracteres en mayúscula / especiales hay en la contraseña.
Leaky Nun
@LeakyNun Sí, estoy de acuerdo, pero la cantidad de juegos de caracteres permitidos también lo hace más difícil, así que imagínese si un cuadro de contraseña solo permite letras minúsculas, lo que disminuye la dificultad de forzar mucho.
LiefdeWen
Sí, a una longitud dada, la inclusión de más tipos de caracteres (números, mayúsculas, símbolos) aumenta la seguridad, pero no de manera exponencial. Una contraseña larga con letras minúsculas es mucho más segura que una contraseña corta de tipo mixto. Según zxcvbn: "4321breadpudding" (10 ^ 9) roto en <1s almacenado como hash rápido, "4321G @ eadpudding" (10 ^ 11) roto en 8s, "la abuela hace un gran budín de pan" (10 ^ 24) roto en siglos , "¡Abuelita, haz un gran budín de pan!" (10 ^ 27) roto en siglos. Recuerde calcular la dificultad de la contraseña en órdenes de magnitud, en cuyo caso 2 no es mucho.
vee_ess
3
"¿Cuánto tiempo tarda G @ anny en preparar un gran pudín de pan 1234 para que se rompa"? Bueno, ahora está en todas las listas de crackz0rd, así que menos de 1 segundo :-P
Olivier Grégoire
1
@LeakyNun ¿Leíste el texto de sabor para ese cómic xkcd ...?
Poke

Respuestas:

2

Jalea , 17 bytes

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

Un programa completo, tomando los argumentos en el orden b, a, c, d.

Pruébalo en línea!

¿Cómo?

El enlace principal es diádica, tomando by a, las entradas del programa son entonces b, a, c, y d(el tercero a sexto argumentos de línea de comando), de modo cy dse accede 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
fuente
3

Python 3 , 69 bytes

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

Pruébalo en línea!

Monja permeable
fuente
¿Por qué no usar b[0]not in"aeiou"en su lugar?
officialaimm
3
@officialaimm porque por alguna razón olvidada 9se cuenta como no consonante.
Leaky Nun
Sí, la regla en la pregunta no dice nada sobre los números explícitamente ...
officialaimm
2
Ahorre 3 bytes (nota: zes el máximo carácter posible):('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

Pruébalo en línea!

Explicación (obsoleta)

¦                     # 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

utilizado en el enlace ya нque aún no se ha extraído a TIO.

Emigna
fuente
2

Javascript ES6, 87 bytes

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

Manifestación

Weedoze
fuente
Estaba a punto de publicar esto. Quiero decir, literalmente , personaje por personaje. Bummer, lol
Hankrecords
@ Hankrecords Jeje, quizás podamos mejorarlo
Weedoze
Puesto que {|}~no son caracteres válidos, puede reemplazar /[bcdfghjklmnpqrstvwxyz]/.test(b[0])?d:ccon /[ -_aeiou]/.test(b[0])?c:dpor 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
fuente
1
erm ... en lugar de 21 conjuntos de argv[1][0]='c'|argv[1][0]='c'|...donde c = consonante, puedes fácilmente reducir esto haciendo ¡ !(argv[1][0]='a'|argv[1][0]='e'|argv[1][0]='i'|argv[1][0]='o'|argv[1][0]='u')Reduce la puntuación en 264 solo con eso!
Baldrickk
No, como se mencionó de otra manera, eso permite números y otros caracteres
Azul
@muddyfish entonces lo logras (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')). Aún más corto por un margen. Sin embargo, hay tantas maneras de jugar golf este código que no sé por dónde empezar ...: s
Olivier Grégoire
Estoy abierto a ideas :) Este es mi primer intento de jugar golf
ulascan
Bueno, lo estás haciendo bien! Estoy seguro de que aún se puede mejorar, como usar una variable en lugar de usar una macro, pero sí, ¡estás comenzando con el pie derecho! :) ¡Probablemente puedas hacer un buen uso de estos consejos de golf !
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))})

Función anónima. Evalúa a

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 es lo que hay en TIO. Por favor, ayúdame a jugar golf esa expresión regular porque soy terrible con ellos.

Guardado 2 bytes de Giuseppe.

Pruébalo en línea!

BLT
fuente
podrías usar!grepl('[aeiouy]',m)
Giuseppe
1
o mejor aún, grepl('[aeiouy]',m)y simplemente cambiar cy d.
Giuseppe
93 bytes "if" hace que la ifsintaxis sea mucho más ordenada en lugar de usar elseo ifelse; También guardé substringen una variable y puse men mayúsculas inmediatamente para guardar un byte.
Giuseppe
1
Intenté ejecutar su función y me encontré con dos problemas: pryrestá tratando de hacer substringuna discusión; y tu greplsolo encuentra "no vocales", que no es lo mismo que las consonantes. La "if"cosa que acaba de perder, gracias por señalarlo.
BLT
En realidad no lo había probado; No me di cuenta de pryr::fque no le gustaría eso; podrías usar la expresión regular '[az && [^ aeiouy]]' de la respuesta de Kevin Cruijissen?
Giuseppe
2

Retina , 80 75 bytes

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

Pruébalo en línea!

Probar un nuevo idioma aquí, toma entradas en el orden dado en la pregunta

Explicación:

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

Cree una palabra que sea la segunda palabra, la primera letra, el signo @, la primera palabra del tercer carácter en adelante.

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

Si la palabra comienza con una no consonante, agregue el primer número

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

Si todavía quedan 3 líneas (no hay sustitución en el último paso, entonces comienza con una consonante), agregue el segundo número

T`l`L`^.

Mayúscula la primera letra

PunPun1000
fuente
1

QBIC , 81 bytes

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

Explicación

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

Tenga en cuenta que las dos últimas líneas parecen iguales, pero el intérprete cambia el comportamiento ligeramente en cada una ;: cada vez que ve la ;instrucción, crea una nueva variable (en este caso, los vars È $ andF $ `son los primeros disponibles después de leer todos otros literales y argumentos de línea cmd) y asigna el primer parámetro de línea cmd aún no asignado a esa variable.

Steenbergh
fuente
1

JavaScript (ES6), 76 bytes

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

Hubiera agregado esto como una sugerencia como una mejora a la solución de Weedoze , pero parece que no puedo hacer ningún comentario al respecto, ya que casi siempre estoy al acecho

Ian
fuente
1

C # , 111 bytes

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

La comprobación de la consonante es particularmente costosa sin capacidad directa de expresión regular en el stringtipo.


fuente
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)

F # todavía es muy nuevo para mí, por lo que probablemente haya mejores enfoques para esto.


fuente
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 el búltimo parámetro en lugar del segundo.
-1 byte eliminando y
-7 bytes gracias a @ OlivierGrégoire (y los parámetros están en orden nuevamente)
-5 bytes gracias a @ PunPun1000

Explicación:

Pruébalo aquí

(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
fuente
1
yes una consonante para que pueda soltar la yexpresión regular en 1 byte.
LiefdeWen
2
(a,b,c,d)->es más corto que a->b->c->d->. El curry solo es útil para 2 parámetros. Para 3, curry es lo mismo que no curry. Para 4 y más, no hay curry más corto.
Olivier Grégoire
1
(a,b,c,d)->b.toUpperCase().charAt(0)+"@"+a.substring(2)+(b.matches("[a-z&&[^aeiou]].*")?d:c)tiene 92 bytes de longitud. Además, utiliza los parámetros en el orden correcto (lo que me confundió al principio :-().
Olivier Grégoire
1
@ OlivierGrégoire Gracias. La segunda vez cometo ese error con respecto al curry con cuatro parámetros ... Y primero toUpperCase()y luego .charAt(0)es de hecho más corto ... No estoy seguro de cómo me he perdido eso. (Y el orden diferente era permitir (b=...), lo que no sería posible si no fuera el último parámetro con curry, porque entonces tenía que ser final/ estaba implícito final)
Kevin Cruijssen
1
Como {|}~no son caracteres válidos, puede usarlos [ -_aeiou]para no consonantes e intercambiar dy cpara menos 5 bytes
PunPun1000
0

V , 25 bytes

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

DÍî

Pruébalo en línea!

Toma argumentos en el búfer en orden:

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

Bash 4 , 76 bytes

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

Funciona en 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
fuente
0

JavaScript (ES6), 69 bytes

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

Bastante simple, probablemente se pueda jugar golf

AlcaldeMonty
fuente