Thực hiện mã hóa thời lượng chạy của bzip2


14

Lý lịch

Sau khi áp dụng BWT (như đã thấy trong Burrows, Wheeler và Back ) và MTF (như đã thấy trong Move to front in ASCII có thể in ), máy nén bzip2 áp dụng một hình thức mã hóa độ dài chạy khá độc đáo.

Định nghĩa

Với mục đích của thử thách này, chúng tôi xác định BRLE chuyển đổi như sau:

Với một chuỗi đầu vào s mà chỉ bao gồm các ký tự ASCII với các điểm mã giữa 0x20 và 0x7A, làm như sau:

  1. Thay thế mỗi lần chạy các ký tự bằng nhau bằng một lần xuất hiện của ký tự và lưu trữ số lần lặp lại sau lần đầu tiên.

  2. Mã hóa số lần lặp lại sau lần xuất hiện đầu tiên của ký tự , sử dụng số 2 cơ sở tính toán và các ký hiệu {}.

    Một số nguyên n không âm được mã hóa thành chuỗi b k lệch b 0 sao cho n = 2 k i (b k ) + Lỗi + 2 0 i (b 0 ) , trong đó i ( {) = 1i ( }) = 2 .

    Lưu ý rằng đại diện này luôn là duy nhất. Ví dụ, số 0 được mã hóa dưới dạng một chuỗi rỗng.

  3. Chèn chuỗi dấu ngoặc nhọn mã hóa số lần lặp lại sau lần xuất hiện duy nhất của ký tự tương ứng.

Ví dụ từng bước

Input:  "abbcccddddeeeeeffffffggggggghhhhhhhh"
Step 1: "abcdefgh" with repetitions 0, 1, 2, 3, 4, 5, 6, 7
Step 2: "" "{" "}" "{{" "{}" "}{" "}}" "{{{"
Step 3: "ab{c}d{{e{}f}{g}}h{{{"

Bài tập

Thực hiện một chương trình hoặc hàm không liên quan đọc một chuỗi từ STDIN hoặc dưới dạng đối số dòng lệnh hoặc hàm và in hoặc trả về BRLE hoặc nghịch đảo của chuỗi đầu vào.

Nếu đầu vào không chứa dấu ngoặc nhọn, hãy áp dụng BRLE. Nếu đầu vào chứa dấu ngoặc nhọn, áp dụng nghịch đảo của nó.

Ví dụ

INPUT:  CODEGOLF
OUTPUT: CODEGOLF

INPUT:  PROGRAMMING
OUTPUT: PROGRAM{ING

INPUT:  PUZ{LES
OUTPUT: PUZZLES

INPUT:  444488888888GGGGGGGGGGGGGGGGWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
OUTPUT: 4{{8{{{G{{{{W{{{{{

INPUT:  y}}}{{
OUTPUT: yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy

Quy tắc bổ sung

  • Bạn không thể sử dụng bất kỳ phần dựng sẵn nào để tính BRLE hoặc nghịch đảo của chuỗi.

  • Bạn có thể sử dụng tích hợp sẵn:

    • Tính toán RLE hoặc RLD của một chuỗi, miễn là số lần lặp lại không được lưu trữ trong cơ sở tính toán-2.

    • Thực hiện chuyển đổi cơ sở của bất kỳ loạ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 trở xuống trong phạm vi từ 0x20 đến 0x7A, cộng với dấu ngoặc nhọn (0x7B và 0x7D).

  • Nếu đầu vào chứa dấu ngoặc nhọn, bạn có thể cho rằng đó là kết quả hợp lệ của việc áp dụng BRLE cho chuỗi.

  • Quy tắc golf tiêu chuẩn áp dụng. Đệ trình ngắn nhất tính bằng byte thắng.


Tại sao các nội dung không được phép?
MilkyWay90

Câu trả lời:


4

CJam, 50 48 byte

l_{}`:T&1${_T#)_(@a?)+}%{(\2b)*}%@e`{(2b1>Tf=}%?

Cảm ơn Dennis vì đã tiết kiệm 2 byte.

Hãy thử trực tuyến.

Giải trình

l_              e# Read and duplicate input.
{}`:T           e# T = "{}"
&               e# If the input has '{ or '}:
    1$          e# Input.
    {           e# For each character:
        _T#)    e# If it is '{ or '}:
            _(  e# Return 0 for '{ or 1 for '}.
            @a  e# Otherwise, convert the character itself to an array (string).
        ?
        )+      e# If it is a number, increment and append to the previous array.
                e# If it is a string with at least 1 character, do nothing.
    }%
    {(\         e# For each character and bijective base 2 number:
        2b)*    e# Repeat the character 1 + that many times.
    }%
                e# Else:
    @           e# Input.
    e`          e# Run-length encoding.
    {(          e# For each character and length:
        2b1>    e# Convert the length to base 2 and remove the first bit.
        Tf=     e# Map 0 to '{ and 1 to '}.
    }%
?               e# End if.

3

Bình thường, 48 50 byte

J`Hs?m*hdi+1xLJtd2tczf-@zTJUz@Jzsm+ed@LJtjhd2rz8

2 byte nhờ @Maltysen.

Trình diễn. Khai thác thử nghiệm.

Giải trình:

J`Hs?m*hdi+1xLJtd2tczf-@zTJUz@Jzsm+ed@LJtjhd2rz8
                                                    Implicit: z = input()
                                                    H is empty dict.
J`H                                                 J = repr(H) = "{}"
   s                                                Print the concatenation of
    ?                        @Jz                    If z and J share any chars:
                     f     Uz                       Filter range(len(z))
                      -@zTJ                         On the absence of z[T] in J.
                   cz                               Chop z at these indices.
                                                    just before each non '{}'.
                  t                                 Remove empty initial piece.
     m*hd                                           Map to d[0] *
         i       2                                  the base 2 number                             
            xLJtd                                   index in J mapped over d[:-1]
          +1                                        with a 1 prepended.
                                             rz8    Otherwise, run len. encode z
                                 m                  map over (len, char)
                                         jhd2       Convert len to binary.
                                        t           Remove leading 1  
                                     @LJ            Map to element of J.
                                  +ed               Prepend char.
                                s                   Concatenate. 

thay vì "{}"bạn có thể sử dụng `H, gắn với CJam :)
Maltysen

@Jakube Xin lỗi vì sự pha trộn.
isaacg

2

Tháng 10, 252

t là hàm thực hiện phép biến đổi.

#load"str.cma"open Str
let rec(!)=group_beginning and
g=function|1->""|x->(g(x/2)^[|"{";"}"|].(x mod 2))and($)i s=if g i=s then i else(i+1)$s and
t s=global_substitute(regexp"\(.\)\1*\([{}]*\)")(fun s->String.make(1$matched_group 2 s)s.[!1]^g(!2- !1))s

Lúc đầu tôi đã nghĩ rằng tôi phải kiểm tra sự hiện diện của niềng răng xoăn, nhưng hóa ra nó không cần thiết. Việc giải mã rõ ràng không có tác dụng đối với các chuỗi đã được giải mã và phần mã hóa tỏ ra vô hại như nhau đối với các chuỗi đã được mã hóa.


the encoding part proved equally harmlessPhải không? Mã hóa 4{{8{{{G{{{{W{{{{{bạn không nhận được 4{{8{}G{{{W{{}?
edc65

@ edc65 Không, tôi nhận được câu trả lời được chỉ định trong các ví dụ. Làm thế nào bạn đang thử nghiệm nó?
feerum

"4 {{8 {{{G {{{W {{{{{" vì đầu vào không phải là một trong những ví dụ. Bạn đã thử nó chưa?
edc65

@ edc65 Đó là nghịch đảo của một trong những ví dụ và tôi đã thử nghiệm cả hai cách. Vâng, tôi đã thử nó, cả trước khi đăng và sau khi nhận xét của bạn.
feerum

Được rồi, tốt lắm. Tôi đã chỉ ra câu được trích dẫn, vì một mã hóa "đơn giản" (như của tôi) sẽ không vô hại với trường hợp thử nghiệm đã cho. Rõ ràng phần mã hóa của bạn thông minh hơn.
edc65

1

JavaScript ( ES6 ), 162

f=s=>
(t=s[R='replace'](/[^{}][{}]+/g,n=>n[0].repeat('0b'+n[R](/./g,c=>c!='{'|0))))==s
?s[R](/(.)\1*/g,(r,c)=>c+r.length.toString(2).slice(1)[R](/./g,c=>'{}'[c])):t

// TEST
out=x=>O.innerHTML += x + '\n';

test=s=>O.innerHTML = s+' -> '+f(s) +'\n\n' + O.innerHTML;

[['CODEGOLF','CODEGOLF']
,['PROGRAMMING','PROGRAM{ING']
,['PUZ{LES','PUZZLES']
,['444488888888GGGGGGGGGGGGGGGGWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW','4{{8{{{G{{{{W{{{{{']
,['y}}}{{','yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy']]
.forEach(v=>{
  w=f(v[0])  
  out('Test ' + (w==v[1]?'OK':'Fail')+'\nInput:    '+v[0]+'\nExpected: '+v[1]+'\nResult:   '+w)
})  
Your test: <input id=I style='width:300px'><button onclick='test(I.value)'>-></button>
<pre id=O></pre>

Một số giải thích

Số n đến BB2 bằng 0 và 1:(n+1).toString(2).slice(1)

Chuỗi trong BB2 thành số: to_number ("0b1" + chuỗi) - nghĩa là thêm một chữ số nhị phân 1 ngoài cùng bên trái và chuyển đổi từ nhị phân (và giảm 1, không cần thiết trong trường hợp cụ thể này).

Biểu thức chính quy để tìm bất kỳ ký tự nào theo sau {hoặc }:/[^{}][{}]+/g

Biểu thức chính quy để tìm các ký tự lặp lại: /(.)\1*/g

Sử dụng regrec đó để thay thế, param đầu tiên là char "lặp lại" (cuối cùng lặp lại chỉ 1 lần), param thứ hai là tổng chuỗi lặp lại, có độ dài là số mà tôi cần mã hóa trong BB2 đã tăng thêm 1

... sau đó đặt tất cả lại với nhau ...

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.