Pamiętasz te brutalne programy, które łamią hasło, które pokazują każdą kombinację, której próbują? Dokładniej, w pewnym momencie n pierwszych znaków jest naprawionych (zgadywano z powodzeniem) i testowany jest każdy możliwy znak dla pozostałych. Prawdopodobnie widziałeś niektóre w filmach lub w oprogramowaniu napisanym przez ludzi, którzy lubią fantazyjne interfejsy.
Przykro nam, że rozczarowałem, ale nie napiszemy programu do łamania hasła, tylko jednego do odtworzenia ładnego wyniku.
Wyzwanie
Biorąc pod uwagę ciąg znaków zawierający drukowalne znaki ascii, ale bez znaków nowej linii (kod ascii 32 do 126 lub zgodny z wyrażeniem regularnym ^[ -~]{2,}$
), wydrukuj wynik zgodnie z następującymi regułami:
- W czasie
t=n seconds
, gdyn
pierwsze znaki drukowane sąn
pierwsze znaki ciągu wejściowego. - Po
n
ustalonych znakach należy dołączyć ciąg znaków utworzony losowo (wybrany jednolicie pseudolosowo z zakresu Unicodedo
~
(kod 32 do 126)), aby utworzyć ciąg o długości początkowej. - Powinieneś wypisywać co najmniej (więcej na ten temat później) 20 linii na sekundę: każdy z nich będzie miał te same
n
pierwsze znaki, ale inny losowy koniec.
Prawdopodobnie nie jest jeszcze bardzo jasne, co należy zrobić, więc przejdźmy przez przykład:
Przykład
Wydrukuję tylko 5 różnych wierszy na każdą sekundę zamiast 20 minimum, aby było bardziej czytelne.
Rozważ dane wejściowe abcde
.
W ciągu pierwszej sekundy prawidłowym wyjściem może być coś takiego (całkowicie losowy):
dGuT4
S!jkN
"gQ>[
TU3!
*fAjV
Następnie t=1
pierwszym znakiem każdego następnego ciągu będzie a
(pierwszy znak wejścia):
a);jD
aHv^p
aqw5*
a|.?:
a{gbK
Teraz t=2
dwie pierwsze postacie będą ab
:
abTJ"
ab\ e
ab3T#
abYWS
ab"#<
Teraz t=3
pierwsze trzy postacie będą abc
:
abcvW
abc3G
abc(g
abc{@
abc@4
Teraz t=4
pierwsze cztery znaki to abcd
:
abcdD
abcdv
abcdj
abcd$
abcd6
Na koniec t=5
wypisujemy dane wejściowe (tylko raz):
abcde
Kilka szczegółów
- Nie powinieneś zbytnio przejmować się precyzją języka w sekundach (tj. Jeśli twój algorytm jest poprawny, ale twój system / język nie ma precyzji, to jest w porządku).
- Pierwsza sekunda może być krótsza niż jedna sekunda (to znaczy, jeśli uruchomisz program w ciągu sekundy, pierwszą sekundą może być pozostały czas do końca bieżącej sekundy). Innymi słowy, nie musisz czekać na początek nowej sekundy, aby rozpocząć drukowanie wyników.
- Co najmniej 20 linii na sekundę : Bardziej naturalną metodą byłaby nieskończona pętla ze specjalnym zachowaniem co sekundę (lub przekroczenie limitu czasu lub cokolwiek innego), dzięki czemu powstanie prawdopodobnie kilka tysięcy linii na sekundę (i to doskonale! ). Ale jeśli masz inny pomysł, możesz go używać, o ile drukujesz co najmniej 20 linii na sekundę.
- Dane wejściowe zawsze będą miały więcej niż 2 znaki.
- Możesz wziąć pod uwagę, że dane wejściowe nie będą dłuższe niż 30 znaków, jeśli to pomoże. (Ale jeśli działa na dłuższe, to na najlepsze)
- Format wejściowy powinien być najbardziej naturalną reprezentacją ciągu w twoim języku.
- Możesz wydrukować końcowy znak nowej linii.
Przykład kodu
Jeśli nadal nie rozumiesz dokładnie, co musisz zrobić, możesz uruchomić następujący kod w terminalu Linux, aby zobaczyć:
perl -F -aplE 'map{$t=time;print$s,map{chr 32+rand 94}@F until$t-time;$s.=shift@F}@F' <<< "Cracking in progress\!"
Kryterium wygranej
To jest golf golfowy , więc wygrywa najkrótszy kod w bajtach!
Podziękowania dla Laikoni i Flp.Tkc za sugestie i ulepszenia w piaskownicy.
\r
(powodując, że wszystkie one zastępują się na ekranie, jak w animacji), czy jest to \n
dopuszczalne?
\n
jest całkowicie do przyjęcia. Wersja z \r
jest właśnie tutaj, ponieważ wygląda lepiej, ale nie potrzebujesz ich \r
.