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 stackexchange
es 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.com
y nocodegolf.stackexchange.com
. Además, los dominios como.co.uk
no están permitidos pero son justos.uk
o.in
válidos. - El reemplazo de la vocal en orden alfabético es cíclico. Quiero decir después
u
,a
se 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
dd
yyy
.Así02
es aceptable y2
no lo es.
Este es el código de golf, por lo que gana el código más corto en bytes. ¡Feliz golf!
stackexchange.com
noimg.stackexchange.com
? ¿Qué pasa con los dominios de paísesbbc.co.uk
?0894
que se suma102
pero la explicación usa08+96=106
. El texto cifrado parece usar el102
valor. Solo una ligera inconsistencia que podría ser confusa ...defualt
no escribedefault
Respuestas:
PowerShell 3+,
480476474453450448 bytesPruébalo en línea!
Guardado
2426 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:
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.Invoke-Expression
(iex
) para ejecutar el generó un código embebido, luego un reemplazo final de letras consecutivas con una sola letra.fuente
-join
y podría haber jurado que se unía con espacios y no con$null
s, lo que me sorprendió, pero al haberlo intentado nuevamente funcionó como esperaba originalmente. Extraño (y gracias de nuevo)!