从二进制转换为负二进制


15

给定一个介于0和之间的二进制整数1111111111111111(即16位无符号整数)作为输入,请在negabinary中输出相同的整数。

输入可以采用最适合您的语言的格式;例如,如果程序更容易处理16位数字(例如0000000000000101而不是)的输入,而不是简单地101输入,则可以编写程序以仅接受这种方式的输入。

样品I / O

> 1
1
> 10
110
> 1010
11110
> 110111001111000
11011001110001000
> 1001001
1011001

这是我编写的一个示例程序,该程序可以进行基数转换,包括负数和非整数基数。您可以使用它来检查您的工作。


为了进一步说明,输入和输出必须是二进制的,对吗?我的意思是:0s和1s的字符串。对我来说看起来很清楚,但是一个答案让我
有些

@ M.Joanis输入为二进制,输出为负二进制(看起来与二进制完全相同-一串零和一,但数字的解释方式不同。)
Peter Olson 2012年

2
链接似乎已关闭,这是一个主要的原因,为什么我们需要问题是自包含的,这些天
乔金

Answers:


6

APL,21个字符

'01'[-(16/¯2)⊤-2⊥⍎¨⍞]

我为此使用了Dyalog APL,将其⎕IO设置为0,这使我们可以索引从0而不是1开始的数组。

从右到左的解释:

  • 给我们用户输入的字符向量。
  • ⍎¨将执行功能()应用于每个(¨字符),得到整数1和0的向量。
  • 2⊥ 将向量从2解码为十进制。
  • - 否定结果十进制整数。
  • (16/¯2)⊤将十进制整数编码为基数¯2(负2)。(16/¯2复制¯216次数,我们的负数产生16位数字。)
  • - 取反新编码数字的每个元素(在此之前,它由-1和0组成),以便我们可以使用它来索引字符向量。
  • '01'[ ... ]'01'使用负的负矢量的0和1 索引字符数组()。这样一来,我们可以获得更漂亮的输出。

例:

      '01'[-(16/¯2)⊤-2⊥⍎¨⍞]
10111010001
0001101011010001

4

Ruby,32 31个字符

m=43690
'%b'%(gets.to_i(2)+m^m)

使用负数计算快捷方式


输入不是硬编码的。0xAAAA不是输入,它的掩码将转换输入。0xAAAA等效于1010101010101010,用于XOR操作以将二进制转换成负二进制。输入本身来自gets关键字,该关键字从STDIN获取。
Stefano Diem Benatti

将0xAAAA更改为43690(十进制相同),以减少字符计数1。尽管如此,更难以理解wtf的发生。
Stefano Diem Benatti

啊好吧。我的红宝石不好,所以不确定。对于那个很抱歉。
Rɪᴋᴇʀ

3

GolfScript,34 29 27个字符

n*~]2base{.2%\(-2/.}do;]-1%

一种简单的策略。有趣的是,最短的版本是先转换为数字然后再返回到base -2的版本(至少是我到目前为止所能找到的最短的版本)。但是,关于它的好处是它几乎包含15%%

编辑1:对于基数2,我们可以保存一个模运算,也可以加入两个循环。

编辑2:我发现了一个更短的代码将二进制字符串转换为整数。


3

Haskell,86 83字节

import Data.Bits
import Data.Digits
c n|m<-0xAAAAAAAA=digits 2$xor(unDigits 2 n+m)m

使用c然后是数字的整数数组进行调用,例如

c [1,1]

PS:我是新手,我是否正确提交了?

编辑:感谢莱科尼节省了一些字节,还修复了一些错别字

EDIT2:或者,c ::字符串->字符串:

import Data.Bits
import Data.Digits
c n|m<-0xAAAAAAAA=concatMap show.digits 2$xor(unDigits 2(map(read.(:[]))n)+m)m

114字节(但您使用字符串c:11来调用它)


是的,你做到了!欢迎光临本站!希望你坚持!
Rɪᴋᴇʀ

欢迎来到PPCG!您可以删除括号undigits 2 n,因为函数应用程序比绑定更强+m。您还可以通过绑定m在防护中来保存一些字节:c n|m<-0xAAAAAAAA= ...
Laikoni '17

2

Python(2.x),77个字符

(由于需要手动切换基座,所以不如其他解决方案那么短...)应满足要求。

i=input();d=""
while i:i,r=i//-2,i%-2;i+=r<0;d+=`r+[0,2][r<0]`
print d[::-1]

欢迎提出进一步改进的建议!

用如下起始值来输入: 0b1001001


2

JavaScript,68个字节

function(b){for(r='',n=parseInt(b,2);r=(n&1)+r,n>>=1;n=-n);return r}

在ES6中将为52字节,但这要追溯挑战:

b=>eval(`for(r='',n=0b${b};r=(n&1)+r,n>>=1;n=-n);r`)

2

果冻,4个字节,语言日期挑战

Ḅb-2

在线尝试!

接受输入并产生输出,作为数字列表。

说明

Ḅb-2
Ḅ     Convert binary to integer
 b-2  Convert integer to base -2

这几乎只是规范的直接翻译。


这不是竞争吗?这项挑战来自'11 ...
NoOneIsHere

我错过了。我将在标题中添加注释。

1

k,17个字节 竞争

所使用的某些功能可能会推迟挑战。

1_|2!{_.5+x%-2}\2/

输入是1和0的列表,输出也是1和0的列表。

程序工作的例子。



0

ES8、54B

b=>eval`for(r='',n=0b${b};r=(n&1)+r,n>>=1;n=-n);r`


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.