Ruby 如何基于1'的数字创建给定二进制数数组的子数组;什么是红宝石?

Ruby 如何基于1'的数字创建给定二进制数数组的子数组;什么是红宝石?,ruby,hammingweight,Ruby,Hammingweight,例如: 以下是二进制数数组: a=[001、010、100、011、101、110、111、1000、1001、1010] 我希望输出如下所示: [[0010101001000],[0111011101001010],[111] 谁能帮我用ruby实现它 我假设您使用的是字符串(“001”),而不是十进制/八进制文本(001)。如果不是这样的话,我强烈建议你使用字符串来让事情变得更容易 我们可以使用x.count('1')计算字符串x中的个数。然后我们可以获取一个字符串列表,并使用a.group

例如:

以下是二进制数数组:

a=[001、010、100、011、101、110、111、1000、1001、1010]

我希望输出如下所示:

[[0010101001000],[0111011101001010],[111]


谁能帮我用ruby实现它

我假设您使用的是字符串(
“001”
),而不是十进制/八进制文本(
001
)。如果不是这样的话,我强烈建议你使用字符串来让事情变得更容易

我们可以使用
x.count('1')
计算字符串
x
中的个数。然后我们可以获取一个字符串列表,并使用
a.group\u by(…)
按此值对其进行组织。这会产生一个散列,因此如果您只需要值(如建议的输出所示),那么只需获取它的

a.group_by { |x| x.count('1') }.values
正如@Silvio所做的那样,使用
Enumerable#group_by
,似乎是解决这个问题的最直接的方法,但这里有几个其他方法可以使用

a = "001, 010, 100, 011, 101, 110, 111, 1000, 1001, 1010".split(', ')
  #=> ["001", "010", "100", "011", "101", "110", "111", "1000", "1001", "1010"]
构造一个散列,其键
k
是一个数,其值是包含原始数组中的元素的数组,其one1的数目等于
k

a.each_with_object({}) { |s,h| (h[s.count('1')] ||= []) << s }.values
  #=> [["001", "010", "100", "1000"], ["011", "101", "110", "1001", "1010"], ["111"]]

考虑表达式,
(h[s.count('1')]| |=[])这就是数组的字面外观还是由字符串组成的?因为如果是文字数字,那么它们实际上不是二进制的,事情会有点尴尬。带前导的
0
的数字会被解释为八进制数字,所以
010
8
。你遇到的代码是什么?你的代码有什么问题?你收到错误信息了吗?错误消息是什么?你得到的结果不是你期望的结果吗?你期望得到什么样的结果?为什么?你会得到什么样的结果?两者有什么不同?你观察到的行为是否不是期望的行为?期望的行为是什么?为什么?观察到的行为是什么?它们有什么不同?请提供一个。你能提供你想要发生的事情的精确说明吗,包括任何和所有规则、这些规则的例外情况、拐角情况、特殊情况、边界情况和边缘情况?您能否提供示例输入和输出,以演示在正常情况下,以及在所有异常、拐角情况、特殊情况、边界情况和边缘情况下,您预期会发生什么?请同时提供一个例子:“有谁能帮助我如何在ruby中实现它吗?”——你可以通过编写一个程序来实现它。如果您的程序有问题,请仔细阅读您正在使用的所有方法、类、模块和库的文档,为您的程序编写测试,用笔和纸跟踪执行情况,在调试器中单步执行,然后对其进行休眠,从头开始,再次休眠,然后,也只有到那时,才能将你的问题缩小到一个简洁、集中、简单、简短、可重复的范围,并提出一个集中、狭窄的问题。谢谢@silvio。我已经转换成了字符串,并且像上面那样做了,它工作了。如果你使用整数,例如
a=[0b001,0b010,…]
,你可以用类似的方式找到设置位数:
a.group\u by{n | n.digits(2).count(1)}.values
注意@Stefan提供的解决方案使用了需要Ruby 2.4的
整数#数字。
{1=>["001", "010", "100", "1000"], 2=>["011", "101", "110", "1001", "1010"], 3=>["111"]}
cnt = s.count('1')
(h[cnt] = h[cnt] || []) << s
(h[cnt] = []) << s
h[cnt] << s
a.sort_by { |s| s.count('1') }.slice_when { |s1,s2| s1.count('1') < s2.count('1') }.to_a
  #=> [["001", "010", "100", "1000"], ["011", "101", "110", "1001", "1010"], ["111"]]