Diberikan bilangan bulat, hitung kode Levenshtein-nya


10

Penafian: Pengkodean Levenshtein sama sekali tidak terkait dengan metrik jarak edit Levenshtein .

<Masukkan cerita panjang tentang mengapa kode Levenshtein perlu dihitung di sini.>

Kode

Pengkodean Levenshtein adalah sistem pemberian kode biner ke bilangan bulat tidak negatif yang mempertahankan beberapa properti aneh dalam probabilitas yang tidak relevan untuk tantangan ini. Kami akan menyatakan kode ini sebagai L ( n ). Wikipedia menggambarkan ini sebagai proses lima langkah:

  1. Inisialisasi jumlah langkah variabel C ke 1.
  2. Tulis representasi biner dari nomor tersebut tanpa harus mengarah 1ke awal kode.
  3. Biarkan M menjadi jumlah bit yang ditulis pada langkah 2.
  4. Jika M bukan 0, tambah C , ulangi dari langkah 2 dengan M sebagai angka baru.
  5. Tulis C 1 bit dan a 0ke awal kode.

Namun, kode ini juga dapat dijelaskan secara rekursif:

  1. Jika angkanya 0, maka kodenya adalah 0.
  2. Tulis representasi biner dari nomor tersebut tanpa harus mengarah 1ke awal kode.
  3. Biarkan M menjadi jumlah bit yang ditulis pada langkah 2.
  4. Tulis L ( M ) di awal kode.
  5. Tulis 1sedikit ke awal kode.

Bagi mereka yang lebih suka contoh, di sini adalah proses rekursif untuk L (87654321), dengan menunjukkan gabungan:

Tantangan

Tulis program atau fungsi yang, diberi nomor n , mengeluarkan bitstring L ( n ) dalam format yang masuk akal (ini termasuk mengembalikan nomor dengan bit tersebut). Celah standar, seperti biasa, tidak diizinkan.

Contohnya

Memasukkan: 5

Keluaran: 1110001

Memasukkan: 30

Keluaran: 111100001110

Memasukkan: 87654321

Keluaran: 111110000101001001110010111111110110001

Memasukkan: 0

Keluaran: 0

Jawaban:


2

Jelly , 13 11 byte

Ḣ;LÑ$;
BÇṀ¡

Cobalah online! atau verifikasi semua kasus uji .

Bagaimana itu bekerja

Pengajuan terdiri dari sepasang tautan yang saling rekursif.

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

Menentukan fungsi f : Int -> [Int]. Sebagai contoh 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:]

Uji di Ideone .


4

Mathematica, 61 byte

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

1
Saya cukup yakin Anda dapat menyimpan beberapa byte dengan mendefinisikan operator unary, ±bukan fungsi 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>

Sunting: Disimpan 2 byte berkat @Arnauld.


Saya pikir Anda dapat menggunakan dengan aman replace(1,...alih-alih replace(/1/,...=> 52 byte
Arnauld

2

Pyth, 12 byte

L&bX1.Bbyslb

Demonstrasi

(Itu y pada akhirnya adalah menjalankan fungsi yang dihasilkan pada input)

Penjelasan:

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

Fungsi rekursif:

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}

Panggil sebagai: [NUMBER] call f

Catatan ini tidak benar-benar berfungsi untuk 87654321 atau sejumlah besar lainnya karena bug di mesin ArmA. Meskipun mungkin akan segera diperbaiki, dan harus bekerja sesuai dengan spesifikasi.

( Tiket Ini ke Sini )


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]);

Berikan nomor sebagai argumen pertama.

Memperbarui:

  • Disimpan byte dengan mengganti strlen($b)-1dengan ~~log10($b)(akhirnya mengerti mengapa orang lain adalah dengan menggunakan logaritma) dan lain dengan menggabungkan berbeda.


0

Java 8 (Program Lengkap), 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);}}

Versi yang Dapat Dibaca dengan Penjelasan (Sebagian besar hanya rekursi):

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 : Disimpan 8 byte : Karakter pertama dari string biner selalu 1; karena itu, daripada menggunakan s.charAt(0), pilihan yang lebih baik adalah sederhana "1".

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.