Bir tamsayı verildiğinde Levenshtein kodunu hesaplayın


10

Feragatname: Levenshtein kodlaması, Levenshtein düzenleme mesafesi metriğiyle tamamen ilgisizdir .

<Levenshtein kodlarının neden burada hesaplanması gerektiği hakkında uzun bir hikaye ekleyin.>

Kod

Levenshtein kodlaması , bu zorlukla alakalı olmayan bazı tuhaf özellikleri elinde tutan negatif olmayan tam sayılara ikili kodlar atama sistemidir. Bu kodu L ( n ) olarak göstereceğiz . Wikipedia bunu beş adımlı bir süreç olarak tanımlıyor:

  1. Adım sayısı değişkeni C'yi 1'e başlatın .
  2. 1Kodun başına gitmeden sayının ikili temsilini yazın .
  3. M , 2. adımda yazılan bit sayısı olsun .
  4. Eğer M 0 değildir, artım ile basamak 2'den elde edilen tekrar M yeni numara.
  5. Kodun başına C 1 bitleri ve a yazın 0.

Ancak, kod yinelemeli olarak da açıklanabilir:

  1. Sayı 0 ise, kodu 0.
  2. 1Kodun başına gitmeden sayının ikili temsilini yazın .
  3. M , 2. adımda yazılan bit sayısı olsun .
  4. Kodun başına L ( M ) yazın .
  5. 1Kodun başına biraz yazın .

Örnekleri tercih edenler için, L (87654321) için birleştirmeyi belirten özyinelemeli süreç şöyledir :

Meydan okuma

N sayısı verildiğinde bit dizgisini L ( n ) herhangi bir makul biçimde veren bir program veya işlev yazın (bu, söz konusu bitlerle bir sayının döndürülmesini içerir). Standart boşluklar her zaman olduğu gibi izin verilmez.

Örnekler

Giriş: 5

Çıktı: 1110001

Giriş: 30

Çıktı: 111100001110

Giriş: 87654321

Çıktı: 111110000101001001110010111111110110001

Giriş: 0

Çıktı: 0

Yanıtlar:


2

Jöle , 13 11 bayt

Ḣ;LÑ$;
BÇṀ¡

Çevrimiçi deneyin! veya tüm test senaryolarını doğrulayın .

Nasıl çalışır

Gönderme, karşılıklı olarak yinelenen bir çift bağlantıdan oluşur.

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 bayt

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

Bir işlevi tanımlar f : Int -> [Int]. Örneğin f 5 == [1,1,1,0,0,0,1],.


5

Python, 49 bayt

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

Ideone üzerinde test edin .


4

Mathematica, 61 bayt

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

1
Eminim ±bir fonksiyon yerine tekli bir operatör tanımlayarak birkaç bayt kaydedebilirsiniz f.
Martin Ender

3

JavaScript (ES6), 54 52 bayt

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>

Düzenleme: @Arnauld sayesinde 2 bayt kaydedildi.


=> 52 bayt replace(1,...yerine güvenle kullanabileceğinizi düşünüyorumreplace(/1/,...
Arnauld

2

Pyth, 12 bayt

L&bX1.Bbyslb

gösteri

( ySonunda sonuçta ortaya çıkan işlevi girişte çalıştırmaktır)

Açıklama:

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

Özyinelemeli işlev:

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}

Şu adla arayın: [NUMBER] call f

Bunun aslında ArmA motorundaki bir hata nedeniyle 87654321 veya diğer büyük sayılar için çalışmadığını unutmayın. Her ne kadar muhtemelen yakında düzeltilecek olsa da, spesifikasyonlara göre çalışmalıdır.

( Bu Bilet Burada )


0

PHP, 116 114 bayt

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

İlk argüman olarak sayıyı belirtin.

Güncelleme:

  • Değiştirerek byte Kaydedilen strlen($b)-1ile ~~log10($b)farklı birleştirerek başka (nihayet logaritma kullanılarak neden herkes anladı) ve.


0

Java 8 (Tam Program), 257249 bayt

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

Açıklama ile Okunabilir Sürüm (Çoğunlukla özyineleme):

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
    }
}

DÜZENLEME 1 : Kaydedilen 8 bayt : İkili dizenin ilk karakteri her zaman 1'dir; bu nedenle, kullanmak yerine s.charAt(0), daha iyi bir seçenek basittir "1".

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.