Ingat program brute-force untuk memecahkan kata sandi yang menunjukkan setiap kombinasi yang mereka coba? Lebih tepatnya, pada satu titik, karakter n pertama diperbaiki (mereka telah berhasil ditebak), dan setiap karakter yang mungkin untuk yang tersisa sedang diuji. Anda mungkin pernah melihat beberapa di film, atau di beberapa perangkat lunak yang ditulis oleh orang-orang yang suka antarmuka mewah.
Maaf mengecewakan, tapi kami tidak akan menulis program untuk memecahkan kata sandi, hanya satu untuk mereproduksi output yang bagus.
Tantangan
Diberikan string yang mengandung karakter ascii yang dapat dicetak tetapi tidak ada baris baru (kode ascii 32 hingga 126 atau cocok dengan regex ^[ -~]{2,}$
), cetak output mengikuti aturan ini:
- Pada saat itu
t=n seconds
,n
karakter pertama yang dicetak adalahn
karakter pertama dari string input. - Setelah
n
karakter tetap, Anda harus menambahkan string yang membentuk karakter acak (dipilih pseudo-acak secara acak dari rentang unicodeke
~
(kode 32 hingga 126)) untuk membentuk string dengan panjang karakter awal. - Anda harus menghasilkan setidaknya (lebih lanjut tentang itu nanti) 20 baris setiap detik: masing-masing dari mereka akan memiliki
n
karakter pertama yang sama , tetapi ujung acak yang berbeda.
Mungkin belum terlalu jelas apa yang harus Anda lakukan, jadi mari kita lihat sebuah contoh:
Contoh
Saya hanya akan mencetak 5 baris berbeda untuk setiap detik, bukan 20 minimum hanya untuk membuatnya lebih mudah dibaca.
Pertimbangkan inputnya abcde
.
Selama detik pertama, output yang valid dapat berupa (benar-benar acak):
dGuT4
S!jkN
"gQ>[
TU3!
*fAjV
Kemudian, t=1
karakter pertama dari setiap string berikut adalah a
(karakter pertama dari input):
a);jD
aHv^p
aqw5*
a|.?:
a{gbK
Sekarang,, t=2
dua karakter pertama adalah ab
:
abTJ"
ab\ e
ab3T#
abYWS
ab"#<
Sekarang, t=3
tiga karakter pertama adalah abc
:
abcvW
abc3G
abc(g
abc{@
abc@4
Sekarang,, t=4
empat karakter pertama adalah abcd
:
abcdD
abcdv
abcdj
abcd$
abcd6
Akhirnya, t=5
kami mencetak input (hanya sekali):
abcde
Beberapa persiapan
- Anda tidak perlu terlalu repot dengan ketepatan bahasa Anda terhadap detik (mis. Jika algoritme Anda benar tetapi sistem / bahasa Anda kurang presisi maka tidak masalah).
- Detik pertama bisa lebih pendek dari satu detik (Yaitu, jika Anda meluncurkan program Anda selama satu detik, detik pertama dapat menjadi waktu yang tersisa hingga akhir detik saat ini). Atau dengan kata lain, Anda tidak perlu menunggu dimulainya detik baru untuk mulai mencetak hasilnya.
- Setidaknya 20 baris per detik : Cara yang lebih alami akan menjadi loop tanpa batas dengan perilaku khusus setiap detik (atau batas waktu, atau apa pun), sehingga mungkin menghasilkan beberapa ribu baris per detik (dan itu tidak apa-apa! ). Tetapi jika Anda memiliki ide lain, silakan menggunakannya selama Anda mencetak setidaknya 20 baris per detik.
- Input akan selalu lebih dari 2 karakter.
- Anda dapat mempertimbangkan bahwa input tidak akan lebih dari 30 karakter jika itu membantu. (Tetapi jika itu bekerja untuk yang lebih lama, itu untuk yang terbaik)
- Format input harus merupakan representasi string yang paling alami dalam bahasa Anda.
- Anda diizinkan untuk mencetak baris tambahan.
Contoh kode
Jika Anda masih tidak mengerti apa yang harus Anda lakukan, Anda dapat menjalankan kode berikut di terminal linux untuk melihat:
perl -F -aplE 'map{$t=time;print$s,map{chr 32+rand 94}@F until$t-time;$s.=shift@F}@F' <<< "Cracking in progress\!"
Kriteria menang
Ini adalah kode-golf , jadi kode terpendek dalam byte menang!
Terima kasih kepada Laikoni dan Flp.Tkc untuk saran dan peningkatan mereka di kotak pasir.
\r
(membuat mereka semua saling menggantikan pada layar seperti dalam animasi), atau \n
dapat diterima?
\n
sangat bisa diterima. Versi dengan \r
hanya ada di sini karena terlihat lebih baik, tetapi Anda tidak memerlukannya \r
.