二进制二进制扩展


9

通常,我们通过将数字的2的幂分配给每个项,系数为01,将数字分解为二进制数:

25 = 1*16 + 1*8 + 0*4 + 0*2 + 1*1

0and 的选择1...不是很二进制。我们将通过以2的幂进行扩展,但系数为或来执行真正的二进制扩展:1-1

25 = 1*16 + 1*8 + 1*4 - 1*2 - 1*1

现在,这个看起来二进制文件。

给定任何正数,看到以下内容应该是微不足道的:

  • 每个奇数都有无限多个真实的二进制展开
  • 每个偶数都没有真正的二进制扩展

因此,为了使真正的二进制扩展定义良好,我们要求扩展最小,即长度最短。


给定任何正整数n,将返回其真正的二进制扩展,从最高有效数字到最低有效数字(或相反的顺序)。

规则:

  • 因为这是 ,您应力争以尽可能短的字节数进行此操作。允许内置。
  • 任何可以表示和列出系数的输出都是可接受的:数组,带分隔符的系数字符串等。
  • 适用标准高尔夫漏洞。
  • 您的程序应能在您语言的标准整数大小范围内使用值。

测试用例

25 -> [1,1,1,-1,-1]
47 -> [1,1,-1,1,1,1]
1 -> [1]
3 -> [1,1]
1234567 -> [1,1,-1,-1,1,-1,1,1,-1,1,-1,1,1,-1,1,-1,-1,-1,-1,1,1]

相关但完全不同。
朱塞佩

4
简单算法:转换为基数2,将0替换为-1,将LSD放在前面。
Josiah Winslow

Voile:我并没有解释过低票,我只是概述了针对使用其语言进行基本转换命令的用户的算法。
乔西亚·温斯洛

由于您非常热衷于真正的二进制,因此我们可以将值作为具有常规位置值但对这两种状态的新解释的打包位返回吗?也就是说,在电气上它只是高压或低压(或其他任何电压),如果标准调试器打印0而不是-1低压状态,这不是我的错。接收这些位的调用方知道它们的含义。(这仍然是不平凡的位操作,因为旋转权仅在具有32个有效位的情况下才有效。例如,一个5位数字需要旋转宽度为5。)
Peter Cordes'17

输出是否需要包含分隔符?是111-1-1有效的输出25吗?
奥利弗

Answers:


7

Japt,6个字节

¤é r0J

在线尝试!

说明:

¤é r0J  // Test input:                  25
¤       // Binary the input:            11001
 é      // Rotate 1 chars to the right: 11100
   r0J  // Replace 0s with -1:          111-1-1

1
啊,旋转;就是为什么它对我不起作用。
毛茸茸的

2
旋转??? dagnabbit。
朱塞佩

3

Pyth 12  11字节

|R_1.>jQ2 1

在这里尝试!


怎么样?

| R_1。> jQ2 1完整程序。

      jQ2将输入转换为二进制列表。
     。> 1将上面的列表向右循环旋转1个位置。
| R_1用-1替换0。
               隐式输出。

首先,我们注意到任务只是“用0s 代替二进制写法中的-1s,并向右移1位”。—那正是我们应该做的!二进制转换为我们提供了0s和1s 的列表。我们在这里要做的就是找到一种转换0为的高尔夫球方式-1。按位运算符|(按位或)是我们的朋友。在二进制表示的地图上移|-1。如果当前数字为0,则将其转换为-1


我认为没有更好的方法。;)
Josiah Winslow

@JosiahWinslow我知道了...试图找到它
Xcoder先生17年

嗯?该算法似乎是最优的,也许是因为我不了解Pyth。
乔西亚·温斯洛

@JosiahWinslow找到了更好的方法。语法上更好的方法,而不是算法上更好的方法。
Xcoder先生17年

@ Mr.Xcoder现在对我而言至少没有任何东西。
暴民埃里克(Erik the Outgolfer)'17年


3

JavaScript(ES6),35 34字节

f=n=>n?[...f(n>>=1),!n|n%2||-1]:[]

测试片段


2

Perl 6,72个字节

当然有更好的方法,但这就是我所拥有的...

->$a {grep {$a==[+] @^a.reverse Z+< ^∞},[X] (1,-1)xx $a.base(2).chars}

在线尝试!

说明:这是一个带有一个参数(->$a)的函数。我们首先获得所需的系数数($a.base(2).chars=以2为基数的字符数),然后使该对数具有笛卡尔积(X(1,-1)。(这[X]意味着:用来减少以下列表X。)因此,我们获得了1和-1的所有可能组合的列表。然后我们grep只过滤()编码给定数字的列表$a。只有一个,所以我们得到一个包含系数的列表。

grep块执行此操作:将其参数用作列表(@^a),将其取反并0,1,2,...使用“左移”运算符将其压缩为无限列表+<。短列表耗尽后,压缩就会停止(对我们有好处!),然后我们将所有结果相加并将其与给定的数字进行比较。我们必须使用,.reverse因为OP要求系数的顺序为从最高有效到最低有效。




1

J,11个字节

1-~2*_1|.#:

在线尝试!

感谢@JosiahWinslow的算法。

关于缩短转换时间有什么想法吗?我的想法是使用!.-fit(nvm,它只是改变了转换的容忍度)。

使用{-take长1个字符。

_1 1{~_1|.#:

1

Java 8,101字节

n->{String s=n.toString(n,2);return(s.charAt(s.length()-1)+s.replaceAll(".$","")).replace("0","-1");}

@Oliver的Japt答案,有多个字节..;)

绝对可以使用数学方法而不是String方法打高尔夫球。

说明:

在这里尝试。

n->{                             // Method with Integer parameter and String return-type
  String s=n.toString(n,2);      //  Convert the Integer to a binary String
  return(s.charAt(s.length()-1)  //  Get the last character of the binary String
    +s.replaceAll(".$","")       //   + everything except the last character
   ).replace("0","-1");          //  Then replace all zeroes with -1, and return the result
}                                // End of method

1

R90 88 46字节

function(n)c((n%/%2^(0:log2(n))%%2)[-1],1)*2-1

在线尝试!

实现Oliver的算法,但以相反的顺序返回数字。由于我们保证n永远不会是偶数,因此最低有效位(第一个)始终是1,因此我们将其删除并1在末尾附加a 来模拟R中的旋转。感谢Shaggy 帮助我修正数学

只需将rev( )函数调用放在页脚中,即可以相同顺序返回值。

原始答案,88个字节:

function(n,b=2^(0:log2(n)))(m=t(t(expand.grid(rep(list(c(-1,1)),sum(b|1))))))[m%*%b==n,]

匿名函数;以相反的顺序返回值,并附加列名。

在线尝试!

说明:

function(n){
 b <- 2^(0:log2(n))         # powers of 2 less than n
 m <- expand.grid(rep(list(c(-1,1)),sum(b|1))) # all combinations of -1,1 at each position in b, as data frame
 m <- t(t(m))               # convert to matrix
 idx <- m%*%b==n            # rows where the matrix product is `n`
 m[idx,]                    # return those rows
}

我认为该输出无效。建议要求挑战作者进行确认。
毛茸茸的

明确允许使用@Shaggy颠倒顺序:from the most significant digit to the least significant digit (or in reversed order).因此应该完全可以接受。
朱塞佩

1
顺序颠倒,没有颠倒的迹象。表示有效输出25,例如[1,1,1,-1,-1][-1,-1,1,1,1]
毛茸茸的

1
@Shaggy啊,你是对的,我只是算错了!应该2*bits - 1代替1-2*bits。谢谢。
朱塞佩




0

Golfscript,14 13 14字节

-1字节,因为我忘记了%存在。 +1字节,因为我也忘记了输入是字符串。

~2base{.+(}%)\

1
如果要假设输入是整数,则应将代码包装成{}一个块。完整的程序只能以字符串形式输入。
彼得·泰勒

嗯什么?我的意思是,数字被推为整数,而不是包含数字的字符串。
Josiah Winslow

在这种情况下,您的答案不是一个完整的程序,因此它必须是一个“函数”,或者对于GolfScript,它是一个块。因此,它是{2base{.+(}%\}15个字节。同样,您的CJam答案。
彼得·泰勒

这是一个完整程序。Golfscript中的输入在程序开始时隐式推入堆栈,并且CJam中的输入在执行之前指定并使用q命令访问。
Josiah Winslow

我确实对GolfScript有一定的了解。(还有CJam)。如果要声明它是一个完整程序,则需要给它加上前缀~
彼得·泰勒
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.