รับจำนวนเต็มคำนวณรหัส Levenshtein


10

Disclaimer: Levenshtein การเข้ารหัสจะสมบูรณ์ไม่เกี่ยวข้องกับLevenshtein แก้ไขตัวชี้วัดระยะทาง

<แทรกเรื่องยาวเกี่ยวกับสาเหตุที่ต้องคำนวณรหัส Levenshtein ที่นี่>

รหัส

การเข้ารหัส Levenshteinเป็นระบบของการกำหนดรหัสไบนารีให้กับจำนวนเต็มที่ไม่ใช่ค่าลบซึ่งยังคงคุณสมบัติแปลกประหลาดบางอย่างในความน่าจะเป็นซึ่งไม่เกี่ยวข้องกับความท้าทายนี้ เราจะแสดงรหัสนี้เป็นL ( n ) Wikipedia อธิบายว่านี่เป็นกระบวนการห้าขั้นตอน:

  1. เริ่มต้นตัวแปรการนับขั้นตอนCถึง 1
  2. เขียนการเป็นตัวแทนไบนารีของตัวเลขโดยไม่นำ1ไปสู่จุดเริ่มต้นของรหัส
  3. ให้Mเป็นจำนวนบิตที่เขียนในขั้นตอนที่ 2
  4. หากMไม่ใช่ 0 ให้เพิ่มCทำซ้ำจากขั้นตอนที่ 2 ด้วยMเป็นหมายเลขใหม่
  5. เขียนบิตC 1และ a 0ไปยังจุดเริ่มต้นของรหัส

อย่างไรก็ตามรหัสสามารถอธิบายซ้ำ:

  1. ถ้าตัวเลขเป็น 0 0แล้วรหัสของมันคือ
  2. เขียนการเป็นตัวแทนไบนารีของตัวเลขโดยไม่นำ1ไปสู่จุดเริ่มต้นของรหัส
  3. ให้Mเป็นจำนวนบิตที่เขียนในขั้นตอนที่ 2
  4. เขียนL ( M ) ไปยังจุดเริ่มต้นของรหัส
  5. เขียน1บิตไปยังจุดเริ่มต้นของรหัส

สำหรับผู้ที่ต้องการตัวอย่างนี่คือกระบวนการเรียกซ้ำสำหรับL (87654321) โดยมีdenoting concatenation:

ความท้าทาย

เขียนโปรแกรมหรือฟังก์ชั่นที่กำหนดตัวเลขnเอาท์พุทบิตL ( n ) ในรูปแบบที่เหมาะสม (รวมถึงการคืนค่าตัวเลขด้วยบิตที่กล่าว) ช่องโหว่มาตรฐานนั้นไม่อนุญาตเช่นเคย

ตัวอย่าง

การป้อนข้อมูล: 5

เอาท์พุท: 1110001

การป้อนข้อมูล: 30

เอาท์พุท: 111100001110

การป้อนข้อมูล: 87654321

เอาท์พุท: 111110000101001001110010111111110110001

การป้อนข้อมูล: 0

เอาท์พุท: 0

คำตอบ:


2

เยลลี่ , 13 11 ไบต์

Ḣ;LÑ$;
BÇṀ¡

ลองออนไลน์! หรือตรวจสอบกรณีทดสอบทั้งหมด

มันทำงานอย่างไร

การส่งประกอบด้วยลิงค์ซ้ำซ้ำคู่

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 ไบต์

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

f : Int -> [Int]กำหนดฟังก์ชั่น ตัวอย่างเช่นf 5 == [1,1,1,0,0,0,1].



4

Mathematica, 61 ไบต์

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

1
ผมค่อนข้างมั่นใจว่าคุณสามารถบันทึกไม่กี่ไบต์โดยการกำหนดผู้ประกอบการเอกแทนของฟังก์ชั่น± f
Martin Ender

3

JavaScript (ES6), 54 52 ไบต์

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>

แก้ไข: บันทึก 2 ไบต์ขอบคุณ @Arnauld


ฉันคิดว่าคุณสามารถใช้งานได้อย่างปลอดภัยreplace(1,...แทนreplace(/1/,...=> 52 ไบต์
Arnauld

2

Pyth, 12 ไบต์

L&bX1.Bbyslb

สาธิต

( yในตอนท้ายคือการเรียกใช้ฟังก์ชั่นที่เกิดขึ้นกับอินพุต)

คำอธิบาย:

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

ฟังก์ชั่นวนซ้ำ:

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}

โทรเป็น: [NUMBER] call f

หมายเหตุสิ่งนี้ใช้ไม่ได้กับ 87654321 หรือตัวเลขขนาดใหญ่อื่น ๆ เนื่องจากข้อผิดพลาดในเอนจิ้น ArmA แม้ว่ามันอาจจะได้รับการแก้ไขในไม่ช้าและควรทำงานตามสเป็ค

( ตั๋วนี้ที่นี่ )


0

PHP, 116 114 ไบต์

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

ระบุตัวเลขเป็นอาร์กิวเมนต์แรก

ปรับปรุง:

  • บันทึกไบต์ด้วยการแทนที่strlen($b)-1ด้วย~~log10($b)(ในที่สุดก็เข้าใจว่าทำไมคนอื่น ๆ จึงใช้ลอการิทึม) และอีกอันโดยการต่อข้อมูลต่างกัน


0

Java 8 (โปรแกรมเต็มรูปแบบ) 257 249 ไบต์

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

เวอร์ชันที่อ่านได้พร้อมคำอธิบาย (ส่วนใหญ่เป็นเพียงการเรียกซ้ำ):

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

แก้ไข 1 : บันทึกไว้ 8 ไบต์ : อักขระตัวแรกของไบนารีสตริงจะเป็น1 เสมอ ดังนั้นแทนที่จะใช้เป็นตัวเลือกที่ดีก็คือs.charAt(0)"1"

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.