Câu hỏi này dựa trên những gì tôi nghĩ ra để trả lời một câu hỏi khác .
Đôi khi các câu hỏi ở đây yêu cầu vẽ một số nghệ thuật ASCII. Một cách đơn giản để lưu trữ dữ liệu cho nghệ thuật là RLE (mã hóa độ dài chạy) . Vì thế:
qqqwwwwweeerrrrrtttyyyy
trở thành:
3q5w3e5r3t4y
Bây giờ để vẽ một nghệ thuật ASCII lớn, bạn có thể nhận được dữ liệu như thế này (bỏ qua các ký tự dòng mới):
19,20 3(4)11@1$20 11@19,15"4:20 4)19,4:20 11@
^^^
Note that this is "20 whitespaces"
(Character count: 45)
Các ký tự được sử dụng cho nghệ thuật ASCII sẽ không bao giờ là chữ thường hoặc chữ in hoa hoặc số, chỉ ký hiệu, dấu hiệu và ký hiệu mà luôn nằm trong bộ ký tự ASCII có thể in được.
Bạn muốn tiết kiệm một số khoảng trống trong chuỗi đó, vì vậy bạn thay thế các số bằng bộ ký tự viết hoa (là 'A' bằng 1, 'B' bằng 2 cho đến khi 'Z' bằng 26), bởi vì bạn sẽ không bao giờ nhận được hơn 26 lần lặp lại của một nhân vật. Vì vậy, bạn nhận được:
S,T C(D)K@A$T K@S,O"D:T D)S,D:T K@
(Character count: 34)
Và cuối cùng bạn nhận thấy rằng một số nhóm (ký tự + ký hiệu) đang lặp lại, vì vậy bạn thay thế các nhóm xuất hiện 3 lần trở lên trong chuỗi bằng bộ ký tự chữ thường, theo thứ tự hoặc xuất hiện trong chuỗi, nhưng lưu trữ trong bộ đệm thay thế được thực hiện (theo định dạng "nhóm + char thay thế" cho mỗi lần thay thế) và để lại phần còn lại của chuỗi. Vì vậy, các nhóm sau:
S, (3 times)
T (4 times)
K@ (3 times)
được thay thế bằng 'a', 'b' và 'c', bởi vì sẽ không bao giờ có quá 26 nhóm lặp lại. Vì vậy, cuối cùng bạn nhận được:
S,aT bK@c
abC(D)cA$bcaO"D:bD)aD:bc
(Character count: 9+24=33)
[Bước cuối cùng chỉ lưu 1 byte vì các nhóm thực sự lưu ký tự sau khi được thay thế là nhóm xuất hiện 4 lần trở lên.]
Các thách thức
Đưa ra một chuỗi chứa dữ liệu RLE để vẽ một nghệ thuật ASCII (với các hạn chế được đề xuất), hãy viết chương trình / hàm / phương thức ngắn nhất bạn có thể để nén nó như mô tả. Thuật toán phải in / trả về hai chuỗi: chuỗi đầu tiên chứa từ điển được sử dụng để nén và chuỗi thứ hai là chuỗi nén kết quả. Bạn có thể trả về các chuỗi dưới dạng Tuple, một mảng, Danh sách hoặc bất cứ thứ gì, theo thứ tự đã cho.
Lưu ý rằng nếu chuỗi không thể được nén trong bước 2, thuật toán phải trả về một chuỗi trống là giá trị trả về đầu tiên và kết quả của bước 1 là giá trị trả về thứ hai.
Bạn không cần đưa kết quả của bước 1 vào các giá trị đầu ra, tôi chỉ đưa chúng vào các ví dụ cho mục đích làm rõ.
Đây là môn đánh gôn , vì vậy có thể câu trả lời ngắn nhất cho mỗi ngôn ngữ sẽ giành chiến thắng!
Một trường hợp thử nghiệm
Input: 15,15/10$15,15/10"10$10"10$10"10$10"15,15/
Output of step 1: O,O/J$O,O/J"J$J"J$J"J$J"O,O/
Final algorithm output: O,aO/bJ$cJ"d
abcabdcdcdcdab
---
Input: 15,15/10$15,15/10"
Output of step 1: O,O/J$O,O/J"
Final algorithm output: <empty string>
O,O/J$O,O/J"
S,aT bK@c
có lẽ sẽ được lưu trữ như là S,T K@
không có tên rõ ràng các ký tự thay thế có thể được suy luận tầm thường từ đó.