Hãy nhớ những chương trình vũ phu để bẻ khóa mật khẩu hiển thị mọi kết hợp họ đang thử? Chính xác hơn, tại một thời điểm, n ký tự đầu tiên được cố định (chúng đã được đoán thành công) và mọi ký tự có thể cho các ký tự còn lại đang được thử nghiệm. Bạn có thể đã thấy một số trong phim hoặc trong một số phần mềm được viết bởi những người thích giao diện ưa thích.
Xin lỗi vì đã làm chúng tôi thất vọng, nhưng chúng tôi sẽ không viết chương trình bẻ khóa mật khẩu, chỉ có một chương trình để tạo lại đầu ra đẹp.
Thử thách
Đưa ra một chuỗi chứa các ký tự ascii có thể in nhưng không có dòng mới (mã ascii 32 đến 126 hoặc khớp với biểu thức chính quy ^[ -~]{2,}$
), in một đầu ra theo quy tắc này:
- Tại thời điểm
t=n seconds
, cácn
ký tự đầu tiên được in là cácn
ký tự đầu tiên của chuỗi đầu vào. - Sau các
n
ký tự cố định, bạn nên nối thêm một chuỗi ký tự ngẫu nhiên (được chọn ngẫu nhiên giả ngẫu nhiên từ phạm vi unicodethành
~
(mã 32 đến 126)) để tạo thành một chuỗi có độ dài của chuỗi ban đầu. - Bạn nên xuất ít nhất (nhiều hơn về sau) 20 dòng mỗi giây: mỗi dòng sẽ có cùng một
n
ký tự đầu tiên, nhưng một kết thúc ngẫu nhiên khác nhau.
Có lẽ bạn chưa rõ lắm về những gì bạn phải làm, vì vậy hãy xem qua một ví dụ:
Thí dụ
Tôi sẽ chỉ in 5 dòng khác nhau cho mỗi giây thay vì tối thiểu 20 dòng chỉ để dễ đọc hơn.
Hãy xem xét đầu vào abcde
.
Trong giây đầu tiên, một đầu ra hợp lệ có thể giống như (hoàn toàn ngẫu nhiên):
dGuT4
S!jkN
"gQ>[
TU3!
*fAjV
Sau đó, t=1
ký tự đầu tiên của mỗi chuỗi sau sẽ là a
(ký tự đầu tiên của đầu vào):
a);jD
aHv^p
aqw5*
a|.?:
a{gbK
Bây giờ, t=2
hai ký tự đầu tiên sẽ là ab
:
abTJ"
ab\ e
ab3T#
abYWS
ab"#<
Bây giờ, t=3
ba ký tự đầu tiên sẽ là abc
:
abcvW
abc3G
abc(g
abc{@
abc@4
Bây giờ, t=4
bốn ký tự đầu tiên sẽ là abcd
:
abcdD
abcdv
abcdj
abcd$
abcd6
Cuối cùng, t=5
chúng tôi in đầu vào (chỉ một lần):
abcde
Một vài giới hạn
- Bạn không nên bận tâm quá nhiều đến độ chính xác ngôn ngữ của mình trong vài giây (ví dụ: Nếu thuật toán của bạn đúng nhưng hệ thống / ngôn ngữ của bạn thiếu độ chính xác thì không sao).
- Giây đầu tiên có thể ngắn hơn một giây (Nghĩa là, nếu bạn khởi chạy chương trình của mình trong một giây, giây đầu tiên có thể chỉ là thời gian còn lại cho đến hết giây hiện tại). Hoặc đặt khác đi, bạn không phải đợi bắt đầu một giây mới để bắt đầu in các đầu ra.
- Ít nhất 20 dòng mỗi giây : Cách tự nhiên hơn sẽ là một vòng lặp vô hạn với một hành vi đặc biệt mỗi giây (hoặc hết thời gian, hoặc bất cứ điều gì), do đó sẽ dẫn đến vài nghìn dòng mỗi giây (và điều đó hoàn toàn ổn! ). Nhưng nếu bạn có một ý tưởng khác, hãy sử dụng nó miễn là bạn in ít nhất 20 dòng mỗi giây.
- Đầu vào sẽ luôn dài hơn 2 ký tự.
- Bạn có thể xem xét rằng đầu vào sẽ không dài hơn 30 ký tự nếu nó giúp. (Nhưng nếu nó hoạt động cho những cái dài hơn, thì nó là tốt nhất)
- Định dạng đầu vào phải là đại diện tự nhiên nhất của một chuỗi trong ngôn ngữ của bạn.
- Bạn được phép in một dòng mới.
Mã ví dụ
Nếu bạn vẫn không hiểu chính xác những gì bạn phải làm, bạn có thể chạy đoạn mã sau trong thiết bị đầu cuối linux để xem:
perl -F -aplE 'map{$t=time;print$s,map{chr 32+rand 94}@F until$t-time;$s.=shift@F}@F' <<< "Cracking in progress\!"
Tiêu chí chiến thắng
Đây là mã golf , vì vậy mã ngắn nhất trong byte thắng!
Cảm ơn Laikoni và Flp.Tkc vì những gợi ý và cải tiến của họ trong hộp cát.
\r
(làm cho tất cả chúng thay thế nhau trên màn hình như trong hoạt hình), hoặc được \n
chấp nhận không?
\n
là hoàn toàn chấp nhận được. Phiên bản với \r
chỉ ở đây vì nó trông đẹp hơn, nhưng bạn không cần những thứ đó \r
.