Lý lịch
Biến đổi di chuyển về phía trước (MTF) là một thuật toán mã hóa dữ liệu được thiết kế để cải thiện hiệu suất của các kỹ thuật mã hóa entropy.
Trong thuật toán nén bzip2 , nó được áp dụng sau khi biến đổi Burrows của Wheeler (như được thấy trong Burrows, Wheeler và Back ), với mục tiêu biến các nhóm ký tự lặp lại thành các số nguyên không âm nhỏ, dễ nén.
Định nghĩa
Với mục đích của thử thách này, chúng tôi sẽ xác định phiên bản ASCII có thể in của MTF như sau:
Cho một chuỗi đầu vào s , lấy một mảng trống r , chuỗi d của tất cả các ký tự ASCII có thể in (0x20 đến 0x7E) và lặp lại các điều sau cho mỗi ký tự c của s :
Nối chỉ số của c trong d vào r .
Di chuyển c đến phía trước của d , nghĩa là xóa c khỏi d và đưa nó vào phần còn lại.
Cuối cùng, chúng tôi lấy các phần tử của r làm chỉ mục trong d gốc và tìm nạp các ký tự tương ứng.
Ví dụ từng bước
INPUT: "CODEGOLF"
0. s = "CODEGOLF"
d = " !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~"
r = []
1. s = "ODEGOLF"
d = "C !\"#$%&'()*+,-./0123456789:;<=>?@ABDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~"
r = [35]
2. s = "DEGOLF"
d = "OC !\"#$%&'()*+,-./0123456789:;<=>?@ABDEFGHIJKLMNPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~"
r = [35 47]
3. s = "EGOLF"
d = "DOC !\"#$%&'()*+,-./0123456789:;<=>?@ABEFGHIJKLMNPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~"
r = [35 47 37]
4. s = "GOLF"
d = "EDOC !\"#$%&'()*+,-./0123456789:;<=>?@ABFGHIJKLMNPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~"
r = [35 47 37 38]
5. s = "OLF"
d = "GEDOC !\"#$%&'()*+,-./0123456789:;<=>?@ABFHIJKLMNPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~"
r = [35 47 37 38 40]
6. s = "LF"
d = "OGEDC !\"#$%&'()*+,-./0123456789:;<=>?@ABFHIJKLMNPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~"
r = [35 47 37 38 40 3]
7. s = "F"
d = "LOGEDC !\"#$%&'()*+,-./0123456789:;<=>?@ABFHIJKMNPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~"
r = [35 47 37 38 40 3 45]
8. s = ""
d = "FLOGEDC !\"#$%&'()*+,-./0123456789:;<=>?@ABHIJKMNPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~"
r = [35 47 37 38 40 3 45 41]
OUTPUT: "COEFH#MI"
Bài tập
Viết chương trình hoặc hàm thực hiện ASCII MTF có thể in được (như được định nghĩa ở trên).
Các trường hợp thử nghiệm
Input: Programming Puzzles & Code Golf
Output: Prpi"do lp%((uz rnu&3!P/o&$U$(p
Input: NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN BATMAN!
Output: Na! !! !! !! !! !! !! !! !! !! !! !! !! !! !! !!"DDUP"%'
Input: Two more questions and I have bzip2 in less than 100 bytes!
Output: Twp#o"si$sv#uvq(u$(l#o#W!r%w+$pz,xF%#,"x(. #0--'$GG ".z(**:
Quy tắc bổ sung
Bạn không thể sử dụng bất kỳ toán tử tích hợp nào tính toán MTF của chuỗi.
Mã của bạn có thể in một dòng mới theo dõi nếu bạn chọn STDOUT cho đầu ra.
Mã của bạn phải hoạt động cho bất kỳ đầu vào nào có 1000 ký tự ASCII có thể in hoặc ít hơn (0x20 đến 0x7E).
Quy tắc golf tiêu chuẩn áp dụng. Đệ trình ngắn nhất tính bằng byte thắng.