Ricordi quei programmi a forza bruta per decifrare la password che mostra tutte le combinazioni che stanno provando? Più precisamente, ad un certo punto, i primi n caratteri sono stati corretti (sono stati indovinati con successo), e tutti i caratteri possibili per i restanti vengono testati. Probabilmente ne hai visti alcuni nei film o in alcuni software scritti da persone a cui piacciono le interfacce fantasiose.
Ci dispiace deludere, ma non scriveremo un programma per decifrare la password, solo uno per riprodurre l'output gradevole.
Sfida
Data una stringa contenente caratteri ASCII stampabili ma nessuna nuova riga (codice ASCII da 32 a 126 o corrispondente al regex ^[ -~]{2,}$
), stampare un output seguendo queste regole:
- Al momento
t=n seconds
, in
primi caratteri stampati sono in
primi caratteri della stringa di input. - Dopo i
n
caratteri fissi, è necessario aggiungere una stringa di caratteri casuali (scelti uniformemente pseudo-casuali dall'intervallo unicodea
~
(codici da 32 a 126)) per formare una stringa della lunghezza di quella iniziale. - Dovresti produrre almeno (più avanti) più di 20 righe al secondo: ognuna di esse avrà gli stessi
n
primi caratteri, ma una diversa fine casuale.
Probabilmente non è ancora chiaro cosa dovresti fare, quindi facciamo un esempio:
Esempio
Stamperò solo 5 righe diverse per ogni secondo anziché il minimo 20 solo per renderlo più leggibile.
Considera l'input abcde
.
Durante il primo secondo, un output valido può essere qualcosa di simile (completamente casuale):
dGuT4
S!jkN
"gQ>[
TU3!
*fAjV
Quindi, t=1
il primo carattere di ogni stringa seguente sarà a
(il primo carattere dell'input):
a);jD
aHv^p
aqw5*
a|.?:
a{gbK
Ora, t=2
i primi due personaggi saranno ab
:
abTJ"
ab\ e
ab3T#
abYWS
ab"#<
Ora, t=3
i primi tre personaggi saranno abc
:
abcvW
abc3G
abc(g
abc{@
abc@4
Ora, t=4
i primi quattro personaggi saranno abcd
:
abcdD
abcdv
abcdj
abcd$
abcd6
Infine, t=5
stampiamo l'input (solo una volta):
abcde
Alcune precisazioni
- Non dovresti preoccuparti troppo della precisione della tua lingua verso i secondi (es. Se l'algoritmo è corretto ma il tuo sistema / linguaggio manca di precisione, allora va bene).
- Il primo secondo può essere più breve di un secondo (ovvero, se si avvia il programma durante un secondo, il primo secondo può essere solo il tempo rimanente fino alla fine del secondo corrente). O in altre parole, non è necessario attendere l'inizio di un nuovo secondo per iniziare a stampare gli output.
- Almeno 20 righe al secondo : il modo più naturale sarebbe un loop infinito con un comportamento speciale uno al secondo (o un timeout, o qualsiasi altra cosa), quindi ciò comporterà probabilmente qualche migliaio di righe al secondo (e va benissimo! ). Ma se hai un'altra idea, sentiti libero di usarla fintanto che stampi almeno 20 righe al secondo.
- L'input avrà sempre una lunghezza superiore a 2 caratteri.
- Puoi considerare che l'input non sarà più lungo di 30 caratteri se aiuta. (Ma se funziona per quelli più lunghi, è per il meglio)
- Il formato di input dovrebbe essere la rappresentazione più naturale di una stringa nella tua lingua.
- Hai il permesso di stampare una nuova riga finale.
Esempio di codice
Se ancora non capisci esattamente cosa devi fare, puoi vedere il seguente codice in un terminale Linux per vedere:
perl -F -aplE 'map{$t=time;print$s,map{chr 32+rand 94}@F until$t-time;$s.=shift@F}@F' <<< "Cracking in progress\!"
Criterio vincente
Questo è code-golf , quindi vince il codice più corto in byte!
Grazie a Laikoni e Flp.Tkc per i loro suggerimenti e miglioramenti nella sandbox.
\r
(facendole sostituire tutte sullo schermo come nell'animazione) o è \n
accettabile?
\n
è perfettamente accettabile. La versione con \r
è qui solo perché sembra migliore, ma non hai bisogno di quelli \r
.