Las contraseñas de Bob

13

Introducción

A Bob le gusta tener contraseñas diferentes para cada sitio web que usa. Quiere contraseñas en un formato especial para poder recordar. Ayúdelo construyendo un generador de contraseñas que sea lo más corto posible en longitud de código, porque le gusta mantener las cosas cortas como su nombre.

Desafío

Cree a Bob un generador de contraseñas que tome cuatro parámetros:

  • Dirección de dominio, (ej .: stackexchange.com)
  • Nombre de pila,
  • apellido,
  • Fecha de nacimiento y año.

y genera una cadena que ha sufrido las siguientes transformaciones.

Cada contraseña tiene una plantilla basada en la longitud l del nombre de dominio. Si l es primo, entonces la plantilla es de esta forma:

[birth-date][domain-name][lastname][birth-year][symbol]

de lo contrario es de esta forma

[symbol][birth-year][firstname][domain-name][birth-date].

El campo de símbolo tendrá valores basados ​​en el tipo de dominio.

.com -> $$$
.org -> &&&
.net -> %%%
.edu -> +++
.gov -> @@@
.mil -> >>>
predeterminado -> ~~~

Ahora, él también quiere ejecutar un cifrado César sobre los campos - [firstname][domain-name][lastname].La dirección de desplazamiento es correcto si l es primo de lo contrario se deja. El valor del turno está determinado por el valor de la adición de la fecha de nacimiento y el año.

Después del proceso anterior, el texto no se puede recordar fácilmente, por lo que quiere que el texto cifrado sea pronunciable. Para hacer esto, quiere reemplazar cada tercera consonante consecutiva con una vocal en orden alfabético (es decir, aeiou).

Finalmente, quiere eliminar ocurrencias consecutivas de las mismas letras.

Ejemplo

Entrada - stackexchange.com bob williams 0894

Salida - 08qraicvafyecugjigyoq94 $$$.

Explicación

La plantilla de contraseña es [birth-date][domain-name][lastname][birth-year][symbol], porque la longitud del nombre de dominio stackexchangees primo. El símbolo será $$$como es el tipo de dominio .com.

Llenemos esos valores en la plantilla - 08stackexchangewilliams94$$$. Ahora el cifrado César debe ejecutarse en campos [firstname][domain-name][lastname](en este caso es solo apellido) La dirección del cambio es correcta porque l es primo y el valor del cambio es 08+94 = 102.

Entonces, se 08stackexchangewilliams94$$$convierte en 08qryaicvafylecugjjgykq94$$$. Ahora cada tercera consonante consecutiva se reemplaza con una vocal (se 08qraaicvafyeecugjigyoq94$$$ eliminan todas las ocupaciones consecutivas de la misma letra) 08qraicvafyecugjigyoq94$$$. No te preocupes, es pronunciable para Bob.

información adicional

  • La dirección del dominio, el nombre y el apellido contienen solo alfabetos en minúsculas.
  • La dirección de dominio siempre consistirá solo en un dominio de segundo nivel y de nivel superior, me gusta stackexchange.comy no codegolf.stackexchange.com. Además, los dominios como .co.ukno están permitidos pero son justos .uko .inválidos.
  • El reemplazo de la vocal en orden alfabético es cíclico. Quiero decir después u, ase usa para reemplazar.
  • El rango ASCII para el cifrado César es de 97 a 122 inclusive.
  • Puede tomar la entrada como se describe aquí .
  • La salida tiene que ser una cadena.
  • El formato de fecha y año de nacimiento es ddy yy.Así 02es aceptable y 2no lo es.

Este es el código de golf, por lo que gana el código más corto en bytes. ¡Feliz golf!

Gurupad Mamadapur
fuente
44
¿El nombre de dominio siempre consistirá en un dominio de segundo nivel y de nivel superior, como stackexchange.comno img.stackexchange.com? ¿Qué pasa con los dominios de países bbc.co.uk?
briantist
Su llamada de ejemplo usa lo 0894que se suma 102pero la explicación usa 08+96=106. El texto cifrado parece usar el 102valor. Solo una ligera inconsistencia que podría ser confusa ...
briantist
66
Bob es un loco mofo si puede pronunciar eso.
Urna de pulpo mágico
55
@carusocomputing ¿Quizás Bob es galés?
briantist
1
No, me refiero a que defualtno escribedefault
Roman Gräf

Respuestas:

7

PowerShell 3+, 480 476 474 453 450 448 bytes

param($d,$f,$l,$b)$s,$t=$d-split'\.'
$m,$y=$b-split'(?<=..)(?=..)'
$v=+$m+$y
$p='1'*$s.Length-match'^(?!(..+)\1+$)..'
$c={-join([char[]]"$input"|%{[char](97..122)[((+$_-97)+((26-$v),$v)[$p])%26]})}
$s=$s|&$c
$f=$f|&$c
$l=$l|&$c
$a=(($a=@{com='$';org='&';net='%';edu='+';gov='@';mil='>'}.$t),'~')[!$a]*3
("`"$(("$a$y$f$s$m","$m$s$l$y$a")[$p]-replace'([^aeiou\d]{3})',"`$('`$1'-replace'[a-z]`$$',('aeiou'[`$i++%5]))")`""|iex)-replace'([a-z])\1+','$1'

Pruébalo en línea!

Guardado 24 26 bytes gracias a TimmyD !

Wow, esta fue una locura. No creo que pueda publicar un desglose completo de esto hasta más tarde o mañana.

Nota: todas las terminaciones de línea son \n( 0x10), por lo que no tengo que usar ;y poner todo esto en una línea.

Vista rápida:

  1. Divide el dominio en el segundo nivel y el nivel superior.
  2. Divide la fecha de nacimiento en mes y año.
  3. Calcule el valor del cambio.
  4. Determine si la longitud del SLD es primo. Como el segmento no puede tener más de 63 caracteres ( ver también RFC 1035 ), creo que fue más corto solo codificar la lista de números primos :) Usando el método de expresiones regulares sugerido.
  5. Defina un bloque de script (función anónima esencialmente) para realizar el cifrado César.
  6. Aplique el cifrado al SLD, nombre y apellidos.
  7. Obtenga el símbolo con una tabla hash e indexación de negocios divertidos.
  8. Finalmente, un desorden gigante donde aplico la plantilla apropiada, ejecuto un reemplazo para los tripletes de consonantes, reemplazando cada uno con una subexpresión (código) que reemplazará esa sección con el valor apropiado, luego ejecuta la cadena resultante a través de Invoke-Expression( iex) para ejecutar el generó un código embebido, luego un reemplazo final de letras consecutivas con una sola letra.
briantista
fuente
@TimmyD wow, nunca había visto eso antes, y es genial. ¡Gracias!
briantist
@TimmyD ya sabes, originalmente intenté escribirlo con unary -joiny podría haber jurado que se unía con espacios y no con $nulls, lo que me sorprendió, pero al haberlo intentado nuevamente funcionó como esperaba originalmente. Extraño (y gracias de nuevo)!
briantist