将数字转换为二进制…但是也可以使用二进制


20

根据此数字亲密视频中提到的“二进制但带二进制”表示法,编写一个函数,该函数将单个数字作为输入并在允许二进制的“二进制”系统中输出该数字的所有变体。

规则

  • 代码只能是函数/方法,不能是完整程序
  • 输入是作为唯一参数传递给函数的整数
  • 输出是输入数字的所有有效变体,转换为“二进制但带二进制”表示法
  • 输出是函数的返回值,但可以使用任何方便的格式,只要它很明显即可(例如3个整数,3个字符串,逗号/空格分隔的字符串,整数数组等),顺序不重要
  • 万一一种语言碰巧包含一个内置函数来实现结果,这种情况不太可能发生,这是不允许的
  • 以字节为单位的最短代码是赢家

输出说明

例如,如果传递了数字9,则可以将其转换为1001,将其转换为二进制,但如果2在每个位置都允许s,则也可以将其写为201(ie 2*4 + 0*2 + 1*1)或121(ie 1*4 + 2*2 + 1*1),如下表所示:

+----+----+----+----+
| 8s | 4s | 2s | 1s |
+----+----+----+----+
|  1 |  0 |  0 |  1 |
|  0 |  2 |  0 |  1 |
|  0 |  1 |  2 |  1 |
+----+----+----+----+

因此,如果通过9,则您的函数将需要返回三个数字1001201121

格式和顺序是不相关的,只要它是明显的(即[121,201,1001]"0201 0121 1001"("1001","121","201")给出的输入时是有效的结果9)。

例子

  • 2 => 10, 2
  • 9 => 1001, 201, 121
  • 10 => 1010, 210, 202, 1002, 122
  • 23 => 2111, 10111
  • 37 => 100101, 20101, 100021, 20021, 12101, 12021, 11221


1
二?用二进制?这是量子计算吗?
马修·罗

Answers:


10

GolfScript(25字节)/ CJam(19 17字节)

GolfScript:

{:^.*,{3base}%{2base^=},}

这将创建一个匿名函数(请参阅有关匿名函数的允许性的元讨论)。

在线演示

直译成CJam是(与感谢马丁布特内尔剃须几个字符)

{:X_*,3fb{2bX=},}

解剖

{             # Function boilerplate
  :^          # Store parameter as variable ^
  .*          # Square parameter - see detailed explanation below
  ,{3base}%   # Produce an array of 0 to ^*^-1 in ternary
  {2base^=},  # Filter to those which evaluate to ^ in binary
}

进行平方运算的原因是,我们需要迭代到最大可能的值,该值的三进制表示形式(用二进制解释)等于^。由于2 = 10,“”的“正常”二进制表示形式^很重要。如果将其转换为三进制,则会发现“最坏”的情况是2的幂。一种最佳方法是将的参数取为的幂ln 3/ln 2 ~= 1.585,但平方要短得多。


我敢打赌,CJam的翻译量会小很多。
Optimizer

1
@Optimizer继续;-)
约翰·德沃夏克

GolfScript?男人我真是个
菜鸟

8

Python 2(59字节)

S=lambda n,B="":[B][n:]or~n%2*S(n/2-1,"2"+B)+S(n/2,`n&1`+B)

(非常感谢@ grc,@ xnor和@PeterTaylor的帮助)

简单递归,调用S(23)或类似。

说明

一般的想法是,如果n的二进制扩展名以结尾1,那么任何伪二进制(“二进制,但有二进制”)扩展也必须以结尾1。否则,它可能以0或结尾2

因此,我们查看的最后一位n,相应地进行划分和分支。

解剖

S=lambda n,B="":           # Lambda expression
[B][n:]or                  # Short circuit, return [B] if n==0 else what follows
~n%2*                      # Keep next list result if n is even else turn into []
S(n/2-1,"2"+B)             # Add a "2" to B, recurse
+
S(n/2,`n&1`+B)             # Add "0" or "1" to B depending on n's last bit, recurse

变量:

  • n:我们要查找的伪二进制扩展数
  • B:从右到左构建的伪二进制字符串

5

Bash + coreutils,77岁

f()(seq `dc -e2o$1p`|sed '/[3-9]/d;s/.*/&n9P2i&pAi/'|dc|grep -Po ".*(?= $1)")

(这是TABgrep表达式中的一个字符。)

这有点改变了这个规则:

“在一种偶然的情况下,一种语言恰巧包含一个内置函数来实现结果,因此不允许这样做”

事实证明,dc反向的我们所需要内置的。举例来说,如果我们设置的输入基地2和输入与三三两两的二进制数,它会正确地解析它。(类似地,如果输入模式为10为基数,则AF将解析为十进制的“数字” 10-15)。

seq创建一个所有十进制数字的列表,直到n的标准二进制表示形式,解析为十进制。然后,将过滤除{0,1,2}以外的所有数字。然后dc将剩余的数字解析为二进制,以查看哪个计算结果返回n。

Bash函数只能“返回”标量整数0-255。因此,我将打印列表到STDOUT的自由作为“返回”的方式。这对于s​​hell脚本来说是惯用的。

输出:

$ f 2
2   
10  
$ f 9
121 
201 
1001    
$

4

Haskell,82岁

t n=[dropWhile(==0)s|s<-mapM(\_->[0..2])[0..n],n==sum[2^(n-i)*v|(i,v)<-zip[0..]s]]

这只是蛮力解决方案。它的效率很低,因为它有望解决3 ^ n种可能性。


3

果冻,10字节,语言发布日期挑战

ṗ@3Ḷ¤Ḅ=¥Ðf

在线尝试!

暴力破解解决方案,最多等于输入的超比特数(此格式称为“超二进制”)。因此,它在O(3 n)中运行效率极低。

说明

ṗ@3Ḷ¤Ḅ=¥Ðf
ṗ@            Construct all lists with the given length, and elements taken from
  3Ḷ¤         the list [0,1,2]
        Ðf    then take only those elements which
     Ḅ=¥      when interpreted as binary, equal {the original number}

2

PHP,138字节

function p($v,$i=0,$r=""){global$a;if($v==0)$a[]=$r?:0;elseif($v>0)for(;$l<3;)p($v-2**$i*$l,$i+1,+$l++.$r);}p($argv[1]);echo join(",",$a);

分解

function p($v,$i=0,$r=""){
    global$a;
    if($v==0)$a[]=$r?:0;  # fill result array
    elseif($v>0) # make permutations
        for(;$l<3;)
            p($v-2**$i*$l,$i+1,+$l++.$r); #recursive
}
p($argv[1]);
echo join(",",$a); # Output

1

C ++,159个字节

void c(int x,string r){int i,t=0,s=r.size();if(s<8){if(r[0]>48){for(i=0;i<s;i++)t+=(r[s-i-1]-48)*1<<i;if(t==x)cout<<r<<" ";}for(char n=48;n<51;n++)c(x,r+n);}}

在这里测试


1

k,21个字节

使用与Peter Taylor的Golfscript答案相同的方法

{X@&x=2/:'X:3\:'!x*x}

例子:

k) {X@&x=2/:'X:3\:'!x*x}9
(1 2 1;2 0 1;1 0 0 1)
k) {X@&x=2/:'X:3\:'!x*x}10
(1 2 2;2 0 2;2 1 0;1 0 0 2;1 0 1 0)
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.