Senhas de Bob

13

Introdução

Bob gosta de ter senhas diferentes para cada site que usa. Ele quer senhas em um formato especial para poder se lembrar. Ajude-o criando um gerador de senhas que seja o mais curto possível em tamanho de código, porque ele gosta de manter as coisas curtas como o seu nome.

Desafio

Crie um gerador de senhas para Bob com quatro parâmetros:

  • Endereço de domínio, (ex: stackexchange.com)
  • Primeiro nome,
  • último nome,
  • Data de nascimento e ano.

e gera uma string que passou pelas seguintes transformações.

Toda senha tem um modelo com base no comprimento l do nome de domínio. Se l for primo, o modelo será desta forma -

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

caso contrário, é desta forma -

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

O campo do símbolo terá valores com base no tipo de domínio.

.com -> $$$
.org -> &&&
.net -> %%%
.edu -> +++
.gov -> @@@
.mil -> >>>
padrão -> ~~~

Agora, ele também quer executar uma cifra de César sobre os campos - [firstname][domain-name][lastname].A direção mudança é certa, se l é primo então ele é deixado. O valor do turno é determinado pelo valor da adição da data e ano de nascimento.

Após o processo acima, o texto não pode ser facilmente lembrado, portanto ele deseja que o texto cifrado seja pronunciável. Para fazer isso, ele deseja substituir cada terceira consoante consecutiva por uma vogal em ordem alfabética (ie aeiou).

Finalmente, ele deseja excluir ocorrências consecutivas das mesmas letras.

Exemplo

Entrada - stackexchange.com bob williams 0894

Saída - 08qraicvafyecugjigyoq94 $$$.

Explicação:

O modelo da senha é [birth-date][domain-name][lastname][birth-year][symbol]porque o tamanho do nome de domínio stackexchangeé primordial. O símbolo será $$$como o tipo de domínio .com.

Vamos preencher esses valores no modelo - 08stackexchangewilliams94$$$. Agora, a cifra de César deve ser executada nos campos [firstname][domain-name][lastname](neste caso, é apenas sobrenome). A direção da mudança está correta porque l é primo e o valor da mudança é 08+94 = 102.

Então, 08stackexchangewilliams94$$$se transforma 08qryaicvafylecugjjgykq94$$$. Agora, cada terceira consoante consecutiva é substituída por uma vogal - 08qraaicvafyeecugjigyoq94$$$ todas as ocorrências consecutivas da mesma letra são excluídas - 08qraicvafyecugjigyoq94$$$. Não se preocupe, é pronunciável para Bob.

informação adicional

  • Endereço de domínio, nome e sobrenome contêm apenas letras minúsculas.
  • O endereço do domínio sempre consistirá apenas em um domínio de segundo e segundo nível, como stackexchange.come não codegolf.stackexchange.com. Além disso, domínios como .co.uknão são permitidos, mas apenas .ukou .insão válidos.
  • A substituição da vogal em ordem alfabética é cíclica. Quero dizer depois u, aé usado para substituir.
  • O intervalo ASCII para a cifra de César é de 97 a 122, inclusive.
  • Você pode receber as entradas conforme descrito aqui .
  • A saída deve ser uma sequência.
  • O formato da data e ano de nascimento é dde yy.Então, 02é aceitável e 2não é.

Isso é código-golfe, então o código mais curto em bytes vence. Golfe feliz!

Gurupad Mamadapur
fonte
4
O nome de domínio sempre consistirá apenas em um domínio de segundo e de nível superior, como stackexchange.comnão img.stackexchange.com? E os domínios de países bbc.co.uk?
Briantist 12/12
Seu exemplo de chamada usa o 0894que se soma, 102mas a explicação usa 08+96=106. O texto cifrado parece usar o 102valor. Apenas uma pequena inconsistência que pode ser confuso ...
briantist
6
Bob é um mofo louco, se ele pode pronunciar isso.
Magic Octopus Urn
5
@carusocomputing Talvez Bob seja galês?
Briantist 12/12
1
Não, eu quis dizer que você defualtnão digita #default
Roman Gräf

Respostas:

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'

Experimente online!

Guardado 24 26 bytes graças a TimmyD !

Uau, isso foi louco. Acho que não posso postar uma descrição completa disso até mais tarde ou amanhã.

Nota: todas as terminações de linha são \n( 0x10), para que eu não precise usar ;e colocar tudo isso em uma linha.

Visão geral rápida:

  1. Divida o domínio no segundo nível e no nível superior.
  2. Divida a data de nascimento em mês e ano.
  3. Calcule o valor do turno.
  4. Determine se o comprimento do SLD é primo. Como o segmento não pode ter mais de 63 caracteres ( consulte também a RFC 1035 ), acho que foi mais curto para codificar a lista de números primos :) Usando o método regex sugerido.
  5. Defina um scriptblock (função anônima essencialmente) para executar a cifra de César.
  6. Aplique a cifra ao SLD, nome e sobrenome
  7. Obtenha o símbolo com um negócio engraçado de hashtable e indexação.
  8. Finalmente, uma bagunça gigante em que aplico o modelo apropriado, execute uma substituição para os trigêmeos consoantes, substituindo cada um por uma subexpressão (código) que substituirá essa seção pelo valor apropriado, depois execute a sequência resultante através de Invoke-Expression( iex) para executar o código incorporado incorporado e, em seguida, uma substituição final de letras consecutivas por uma única letra.
briantist
fonte
@ TimmyD uau, eu nunca vi isso antes, e é brilhante. Obrigado!
Briantist
@ TimmyD você sabe, eu originalmente tentei escrever com unário -joine eu poderia jurar que estava se juntando a espaços e não $nulls, o que me surpreendeu, mas, depois de tentar novamente, funcionou como eu esperava originalmente. Estranho (e obrigado novamente)!
Briantist