Cho một số nguyên, tính mã Levenshtein của nó


10

Tuyên bố miễn trừ trách nhiệm: Mã hóa Levenshtein hoàn toàn không liên quan đến chỉ số khoảng cách chỉnh sửa Levenshtein .

<Chèn câu chuyện dài về lý do tại sao mã Levenshtein cần được tính toán ở đây.>

Mật mã

Mã hóa Levenshtein là một hệ thống gán mã nhị phân cho các số nguyên không âm, giữ lại một số thuộc tính lạ trong xác suất không phù hợp với thách thức này. Chúng tôi sẽ biểu thị mã này là L ( n ). Wikipedia mô tả đây là một quá trình gồm năm bước:

  1. Khởi tạo biến đếm bước C thành 1.
  2. Viết biểu diễn nhị phân của số mà không dẫn 1đến đầu mã.
  3. Gọi M là số bit được viết ở bước 2.
  4. Nếu M không bằng 0, tăng C , lặp lại từ bước 2 với M là số mới.
  5. Viết các bit C 1 và a 0đến đầu mã.

Tuy nhiên, mã cũng có thể được mô tả đệ quy:

  1. Nếu số là 0, thì mã của nó là 0.
  2. Viết biểu diễn nhị phân của số mà không dẫn 1đến đầu mã.
  3. Gọi M là số bit được viết ở bước 2.
  4. Viết L ( M ) vào đầu mã.
  5. Viết một 1chút vào đầu mã.

Đối với những người thích các ví dụ, đây là quy trình đệ quy cho L (87654321), với biểu thị phép nối:

Các thách thức

Viết chương trình hoặc hàm, cho một số n , xuất ra chuỗi bit L ( n ) ở bất kỳ định dạng hợp lý nào (điều này bao gồm trả về một số có các bit đã nói). Các sơ hở tiêu chuẩn, như mọi khi, không được phép.

Ví dụ

Đầu vào: 5

Đầu ra: 1110001

Đầu vào: 30

Đầu ra: 111100001110

Đầu vào: 87654321

Đầu ra: 111110000101001001110010111111110110001

Đầu vào: 0

Đầu ra: 0

Câu trả lời:


2

Thạch , 13 11 byte

Ḣ;LÑ$;
BÇṀ¡

Hãy thử trực tuyến! hoặc xác minh tất cả các trường hợp thử nghiệm .

Làm thế nào nó hoạt động

Trình bao gồm một cặp các liên kết đệ quy lẫn nhau.

BÇṀ¡    Main link. Argument: n

B       Convert n to binary.
   ¡    Execute...
 Ç        the helper link...
  Ṁ       m times, where m is the maximum of n's binary digits.

Ḣ;LÑ$;  Helper link. Argument: A (array of binary digits)

Ḣ       Head; remove and return the first element of A.
    $   Combine the two links to the left into a monadic chain.
  L       Yield the length (l) of A without its first element.
   Ñ      Call the main link with argument l.
 ;      Concatenate the results to both sides.
     ;  Append the tail of A.

8

Haskell, 70 byte

b 0=[]
b n=b(div n 2)++[mod n 2]
f 0=[0]
f n|1:t<-b n=1:f(length t)++t

Xác định một hàm f : Int -> [Int]. Ví dụ , f 5 == [1,1,1,0,0,0,1].


5

Python, 49 byte

f=lambda n:n and'1%s'%f(len(bin(n))-3)+bin(n)[3:]

Kiểm tra nó trên Ideone .


4

Toán học, 61 byte

f@0={0};f@n_:=Join[{1},f@Length@#,#]&@Rest@IntegerDigits[n,2]

1
Tôi khá chắc chắn rằng bạn có thể lưu một vài byte bằng cách xác định một toán tử đơn nguyên ±thay vì một hàm f.
Martin Ender

3

JavaScript (ES6), 54 52 byte

f=n=>(s=n.toString(2)).replace(1,_=>1+f(s.length-1))
<input type=number oninput=o.textContent=f(+this.value)><pre id=o>

Chỉnh sửa: Đã lưu 2 byte nhờ @Arnauld.


Tôi nghĩ bạn có thể sử dụng một cách an toàn replace(1,...thay vì replace(/1/,...=> 52 byte
Arnauld

2

Bình thường, 12 byte

L&bX1.Bbyslb

Trình diễn

( yCuối cùng là để chạy chức năng kết quả trên đầu vào)

Giải trình:

L&bX1.Bbyslb
L               def y(b):
 &b             If b is 0, return 0. This is returned as an int, but will be cast
                to a string later.
          lb    Take the log of b
         s      Floor
        y       Call y recursively
   X1           Insert at position 1 into
     .Bb        Convert b to binary.

1

SQF, 110

Hàm đệ quy:

f={params[["i",0],["l",[]]];if(i<1)exitWith{[0]};while{i>1}do{l=[i%2]+l;i=floor(i/2)};[1]+([count l]call f)+l}

Gọi như: [NUMBER] call f

Lưu ý rằng điều này không thực sự hoạt động đối với 87654321 hoặc số lượng lớn khác do lỗi trong động cơ ArmA. Mặc dù nó có thể sẽ được sửa sớm, và sẽ hoạt động theo thông số kỹ thuật.

( Vé này ở đây )


0

PHP, 116 114 byte

<?$f=function($i)use(&$f){$b=decbin($i);return!$b?0:preg_replace('/^1/',1 .$f(~~log10($b)),$b);};echo$f($argv[1]);

Cung cấp số làm đối số đầu tiên.

Cập nhật:

  • Đã lưu một byte bằng cách thay thế strlen($b)-1bằng ~~log10($b)(cuối cùng đã hiểu tại sao mọi người khác sử dụng logarit) và một byte khác bằng cách ghép khác nhau.


0

Java 8 (Chương trình đầy đủ), 257 249 byte

interface M{static void main(String[]a)throws Exception{int i=0,j;while((j=System.in.read())>10)i=i*10+j-48;System.out.print(L(i));}static String L(int i){if(i==0)return "0";String s=Integer.toString(i,2);return "1"+L(s.length()-1)+s.substring(1);}}

Phiên bản có thể đọc được w / Giải thích (Chủ yếu chỉ là đệ quy):

interface M {
    static void main(String[]a) throws Exception { // Using Exception is unadvised in real coding, but this is Code Gold
        int i = 0, j; // i stores the input; j is a temporary variable
        while ((j = System.in.read()) > 10) // Read the input to j and stop if it is a newline. Technically this stops for tabulators as well, but we shouldn't encounter any of those...
            i = i * 10 + j - 48; // Looping this step eventually reads the whole number in from System.in without using a reader (those take up a lot of bytes)
        System.out.print(L(i)); // Make a method call
    }

    static String L(int i) { // This gets the actual Levenshtein Code
        if (i == 0)
            return "0"; // The program gets a StackOverflowException without this part
        String s = Integer.toString(i, 2); // Shorter than toBinaryString
        return "1" + L(s.length() - 1) + s.substring(1); // Write in the first character (which is always a one), followed by the next L-code, followed by the rest of the binary string
    }
}

EDIT 1 : Đã lưu 8 byte : Ký tự đầu tiên của chuỗi nhị phân luôn là 1; do đó, thay vì sử dụng s.charAt(0), một lựa chọn tốt hơn chỉ đơn giản là "1".

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.