首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >可能双元和

可能双元和
EN

Code Golf用户
提问于 2020-12-15 12:35:25
回答 14查看 1.4K关注 0票数 21

这一挑战的灵感来自AoC 2020,第14天-第II部,由埃里克·瓦斯特尔他的团队创建,它要求从位掩码输出可能的二进制值。

假设我们有一个像"10X0X0"这样的位掩码,那么我们必须找到可以通过用01替换X来生成的二进制值。这里我学习了X,当然,除了01之外,任何东西都可以。

因此,可能的二进制文件是["100000", "100010", "101000", "101010"]

当它们中的每一个被转换为十进制时,它们分别是[32, 34, 40, 42]

最后,和是148

测试用例

代码语言:javascript
复制
INPUT: "X"
["0", "1"]
[0, 1]
OUTPUT: 1

INPUT: "0"
OUTPUT: 0

INPUT: "1"
OUTPUT: 1

INPUT: "1X0"
["100", "110"]
[4, 6]
OUTPUT: 10

INPUT: "1X0X1"
["10001", "10011", "11001", "11011"]
[17, 19, 25, 27]
OUTPUT: 88

INPUT: "X0X0X0X"
["0000000", "0000001", "0000100", "0000101", "0010000", "0010001", "0010100", "0010101", 
"1000000", "1000001", "1000100", "1000101", "1010000", "1010001", "1010100", "1010101"]
[0, 1, 4, 5, 16, 17, 20, 21, 64, 65, 68, 69, 80, 81, 84, 85]
OUTPUT: 680

INPUT: "1X1X1X1X1X1X1X1X1X1X1"
OUTPUT: 1789569024

INPUT: "1X01X01X01X01X01X01X01X01X01X01X01X0"
OUTPUT: 201053554790400

INPUT: "X000X000X000X000X000X000X000X000X000X000X000X000"
OUTPUT: 307445734561824768

INPUT: "101"
["101"]
[5]
OUTPUT: 5

INPUT: "XXX"
["000", "001", "010", "011", "100", "101", "110", "111"]
[0, 1, 2, 3, 4, 5, 6, 7]
OUTPUT: 28

规则

  • 保证0 \leq \text{count}(X) \leq 12 1 \leq \text{length(mask)} \leq 48
  • 输入可以是字符串,也可以是字符数组(非空).
  • 我在位掩码中选择了X,但是您可以将它替换为您选择的任何其他字符。
  • 输出将是以十进制表示的二进制数之和。
  • 这是一个密码-高尔夫,所以最少的字节会赢!

沙箱连接

EN

回答 14

Code Golf用户

发布于 2020-12-15 12:49:35

Python 2,61字节

代码语言:javascript
复制
k=n=0
for c in input():n=n*2+-ord(c)%3;k+=c>"1"
print(n<<k)/2

在网上试试!

实现此算法:

  1. 从二进制转换输入,将X视为\frac{1}{2}
  2. 将输入中的每个X的结果加倍。

为什么要这么做?如果X在输入中出现k次数,则将2^k与其二进制值的副本相加。在这些近拷贝中,任何位置上的每一个X都显示为平均\frac{1}{2}的0半倍和1半倍,所以我们可以把X当作数字\frac{1}{2}

在代码中,我们实际上将0,X,1转换为双值0,1,2,然后将结果减半,然后再对X's进行加倍。此外,我们使用_表示X,因为我们可以使用不同的字符--任何具有相同ASCII代码模块3的字符都可以工作,比如数字2

63字节

代码语言:javascript
复制
lambda s:(reduce(lambda n,c:2*n+-ord(c)%3,s,0)<<s.count('_'))/2

在网上试试!

票数 9
EN

Code Golf用户

发布于 2020-12-15 12:50:44

JavaScript (ES6),55字节

代码语言:javascript
复制
f=(s,g=d=>f(s.replace('X',d)))=>1/s?+('0b'+s):g(0)+g(1)

在网上试试!

评论

代码语言:javascript
复制
f = (                   // f is a recursive function
  s,                    // taking the input string s
  g = d =>              // g is a helper function taking a digit d
    f(                  // and doing a recursive call to f
      s.replace('X', d) // with the first 'X' in s replaced with d
    )                   //
) =>                    //
  1 / s ?               // if s looks like a number (i.e. does not contain any 'X'):
    +('0b' + s)         //   convert it from binary to decimal
  :                     // else:
    g(0) +              //   invoke g a 1st time to replace the first 'X' with '0'
    g(1)                //   invoke g a 2nd time to replace the first 'X' with '1'
票数 7
EN

Code Golf用户

发布于 2020-12-15 16:11:32

J,47字节

代码语言:javascript
复制
1#.#.@(]`(_ I.@E.[)`[}"#.[:#:@i.@(**2&^)1#._&=)

在网上试试!

不太满意这个..。

票数 5
EN
页面原文内容由Code Golf提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codegolf.stackexchange.com/questions/216369

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档