정수가 주어지면 Levenshtein 코드를 계산하십시오.


10

면책 조항 : Levenshtein 코딩은 Levenshtein 편집 거리 메트릭 과 완전히 관련이 없습니다 .

<레 벤슈 테인 코드를 계산해야하는 이유에 대한 긴 이야기를 입력하십시오.>

코드

Levenshtein 코딩 은 바이너리 코드를 음이 아닌 정수에 할당하여이 문제와 관련이없는 이상한 속성을 확률로 유지하는 시스템입니다. 이 코드를 L ( n )으로 표시합니다. Wikipedia는이를 5 단계 프로세스로 설명합니다.

  1. 걸음 수 변수 C 를 1로 초기화하십시오 .
  2. 1코드의 시작으로 이어지지 않고 숫자의 이진 표현을 작성하십시오 .
  3. 하자 M은 2 단계에서 기록 된 비트의 숫자.
  4. M 이 0이 아닌 경우 C를 증가 시키고 M 을 새 숫자로 사용하여 2 단계부터 반복 하십시오.
  5. 코드의 시작 부분에 C 1 비트와 a 0를 씁니다 .

그러나 코드를 재귀 적으로 설명 할 수도 있습니다.

  1. 숫자가 0이면 코드는 0입니다.
  2. 1코드의 시작으로 이어지지 않고 숫자의 이진 표현을 작성하십시오 .
  3. 하자 M은 2 단계에서 기록 된 비트의 숫자.
  4. 코드 시작 부분에 L ( M )을 씁니다 .
  5. 1코드의 시작 부분에 비트를 씁니다 .

예제를 선호하는 사람들을 위해 연결 을 나타내는 L 의 재귀 프로세스는 다음과 같습니다 (87654321) .

도전

숫자 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

하스켈, 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

수학, 61 바이트

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

1
나는 ±함수 대신 단항 연산자 를 정의하여 몇 바이트를 절약 할 수 있다고 확신합니다 f.
Martin Ender

3

자바 스크립트 (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>

편집 : @Arnauld 덕분에 2 바이트가 절약되었습니다.


=> 52 바이트 replace(1,...대신 안전하게 사용할 수 있다고 생각합니다.replace(/1/,...
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

ArmA 엔진의 버그로 인해 87654321 또는 다른 많은 수에서는 실제로 작동하지 않습니다. 아마도 곧 수정 될 것이며 사양에 따라 작동해야합니다.

( 이 티켓은 여기 )


0

PHP, 116114 바이트

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

EDIT 1 : Saved 8 bytes : 이진 문자열의 첫 문자는 항상 1입니다. 따라서보다 s.charAt(0)나은 옵션은을 사용하는 것보다 간단 "1"합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.