给定一个整数,计算其Levenshtein代码


10

免责声明:Levenshtein编码与Levenshtein编辑距离度量完全无关。

<插入关于为什么需要在此处计算Levenshtein码的长话。>

编码

Levenshtein编码是一种将二进制代码分配给非负整数的系统,该系统保留了一些与该挑战无关的怪异属性。我们将此代码表示为Ln)。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. LM)写入代码的开头。
  5. 1在代码的开头写一点。

对于喜欢示例的人,这里是L(87654321)的递归过程,表示串联:

挑战

编写一个给定数字n的程序或函数,输出位串Ln以任何合理的格式)(这包括用所述位返回一个数字)。与往常一样,不允许出现标准漏洞。

例子

输入: 5

输出: 1110001

输入: 30

输出: 111100001110

输入: 87654321

输出: 111110000101001001110010111111110110001

输入: 0

输出: 0

Answers:


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
马丁·恩德

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>

编辑:由于@Arnauld,节省了2个字节。


我认为您可以安全使用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

请注意,由于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字节

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"

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.