修改 Ruby 方法以将整数分区表示为有序字符串(不平展?



我正在写文章以帮助改进下面的 Ruby 方法,以将表示为 n 个整数数组的整数分区 (11 = [5,1,5]),其中分区的顺序很重要,转换为由 1 和 0 组成的字符串,其中 1 表示单位(或刻度线),0 表示算术分隔符 (+)。返回的最后一个字符串并不意味着在任何位置基本系统中都被视为数字,尽管它可以。

例如,我想将数组 11=[5,1,5] 表示的整数 11 转换为表示 11=(11111)(+)(1)(+)(11111) 或 11 的"1111101011111"。由于顺序很重要,11=[5,5,1] 表示不同的分区,即 "1111101111101"。

与示例中一样,传递给此方法的整数数组未排序,因此方法应按给定的部分顺序使用分隔符返回表示形式。

在下面的方法中,我使用另一个临时数组从给定的分区数组中构建了表示形式,然后在返回中使用了 flatten,并且想知道如何使用 Ruby 更好地处理这个问题。

这是我尝试过的。我希望得到一些帮助来改进此代码。特别是,我希望得到关于我如何扁平化最终数组的反馈,并学习如何避免使用连接并直接构建字符串而无需求助于临时数组。

def partition_to_string(n)
representation = []
n.each_with_index do |partition,index|
if index == n.size - 1 then
representation << [Array.new(partition,"1")]
else 
representation << [Array.new(partition,"1"),"0"]
end
end
return representation.flatten.join
end
puts partition_to_string([11])
#=> "11111111111"
puts partition_to_string([5,1,5])
#=> "1111101011111"
puts partition_to_string([5,5,1])
#=> "1111101111101"

对于将数字分成 1 部分的简单分区,即仅由 1 组成的字符串(例如,11 = [11]),字符串不需要任何零,因为它仅由 1 部分组成,所以我想简单地表示为 [11] = "111111111111"(11 1)。同样,在多个部分的分区中,对于最终的摘要,无需在最后附加额外的 0。也就是说,该方法应返回 [5,1,5] = "1111101011111" 而不是 "11111010111110"。我想我在上面的代码中处理了这些情况,循环遍历数组并使用传递的初始数组的大小检查当前元素。

你可以只使用 Array#map 和 Array#join:

ary.map { |n| "1" * n }.join("0")

所以[5,1,5].map { |n| "1" * n }.join("0") #=> "1111101011111"

考虑到["1"].join("0") #=> "1"

最新更新