Lembre-se daqueles programas de força bruta para quebrar a senha que mostram todas as combinações que estão tentando? Mais precisamente, em um ponto, os n primeiros caracteres são corrigidos (foram adivinhados com sucesso) e todos os caracteres possíveis para os demais estão sendo testados. Você provavelmente já viu alguns filmes ou softwares escritos por pessoas que gostam de interfaces sofisticadas.
Desculpe desapontar, mas não escreveremos um programa para quebrar a senha, apenas um para reproduzir a boa saída.
Desafio
Dada uma sequência contendo caracteres ascii imprimíveis, mas sem novas linhas (código ascii 32 a 126 ou correspondendo ao regex ^[ -~]{2,}$
), imprima uma saída seguindo estas regras:
- No momento
t=n seconds
, osn
primeiros caracteres impressos são osn
primeiros caracteres da sequência de entrada. - Após os
n
caracteres fixos, você deve anexar um caractere aleatório formado por sequência (escolhido uniformemente pseudo-aleatoriamente do intervalo unicodepara
~
(código 32 a 126)) para formar uma sequência com o comprimento do inicial. - Você deve produzir pelo menos (mais sobre isso mais tarde) 20 linhas a cada segundo: cada uma delas terá os mesmos
n
primeiros caracteres, mas com um final aleatório diferente.
Provavelmente ainda não está muito claro o que você deve fazer, então vamos dar um exemplo:
Exemplo
Imprimo apenas 5 linhas diferentes a cada segundo, em vez dos 20 mínimos, apenas para torná-lo mais legível.
Considere a entrada abcde
.
Durante o primeiro segundo, uma saída válida pode ser algo como (completamente aleatório):
dGuT4
S!jkN
"gQ>[
TU3!
*fAjV
Então, t=1
o primeiro caractere de cada sequência a seguir será a
(o primeiro caractere da entrada):
a);jD
aHv^p
aqw5*
a|.?:
a{gbK
Agora, t=2
os dois primeiros caracteres serão ab
:
abTJ"
ab\ e
ab3T#
abYWS
ab"#<
Agora, t=3
os três primeiros caracteres serão abc
:
abcvW
abc3G
abc(g
abc{@
abc@4
Agora, t=4
os quatro primeiros caracteres serão abcd
:
abcdD
abcdv
abcdj
abcd$
abcd6
Por fim, t=5
imprimimos a entrada (apenas uma vez):
abcde
Algumas precisões
- Você não deve se preocupar muito com a precisão do seu idioma em segundos (ou seja, se o seu algoritmo estiver correto, mas o seu sistema / idioma não tiver precisão, tudo bem).
- O primeiro segundo pode ter menos de um segundo (ou seja, se você iniciar o programa durante um segundo, o primeiro segundo poderá ser apenas o tempo restante até o final do segundo atual). Em outras palavras, você não precisa esperar o início de um novo segundo para começar a imprimir as saídas.
- Pelo menos 20 linhas por segundo : a maneira mais natural seria um loop infinito com um comportamento especial a cada segundo (ou um tempo limite ou o que for), de modo que resultará provavelmente em alguns milhares de linhas por segundo (e isso é perfeitamente bom! ) Mas se você tiver outra ideia, fique à vontade para usá-la, desde que imprima pelo menos 20 linhas por segundo.
- A entrada sempre terá mais de 2 caracteres.
- Você pode considerar que a entrada não terá mais de 30 caracteres, se ajudar. (Mas se funcionar para os mais longos, é o melhor)
- O formato de entrada deve ser a representação mais natural de uma string no seu idioma.
- Você tem permissão para imprimir uma nova linha à direita.
Exemplo de código
Se você ainda não entender exatamente o que precisa fazer, execute o seguinte código em um terminal linux para ver:
perl -F -aplE 'map{$t=time;print$s,map{chr 32+rand 94}@F until$t-time;$s.=shift@F}@F' <<< "Cracking in progress\!"
Critério de vitória
Isso é código-golfe , então o código mais curto em bytes ganha!
Agradecemos a Laikoni e Flp.Tkc por suas sugestões e melhorias na sandbox.
\r
(fazendo com que todas se substituam na tela como na animação) ou é \n
aceitável?
\n
é perfeitamente aceitável. A versão com \r
está aqui apenas porque parece melhor, mas você não precisa disso \r
.