我最初试图做的是在给定的数组中找到元素的相应索引并将它们连接起来。我的代码是
class ResistorColorDuo
COLORS = %w{black brown red orange yellow green blue violet grey white}
def self.value(colors_arry)
colors_arry.map { |color| COLORS.index(color) }.join.to_i
end
end
puts ResistorColorDuo.value(["brown", "orange"])
puts ResistorColorDuo.value(["black", "brown"])
puts ResistorColorDuo.value(["orange", "brown", "red"])
puts ResistorColorDuo.value(["orange", "brown", "red", "yellow"])
#13
#1
#312
#3124
查找和连接它们似乎没有问题,但真正的目标是只从前两个元素中获得结果,而忽略后面的元素。例如,当传递["orange", "brown", "red", "yellow"]
时,我应该得到31
而不是3124
。有什么办法我能做到吗?
谢谢。
只包括.first(2(也删除.to_i,如果0在开头,它将删除:
class ResistorColorDuo
COLORS = %w{black brown red orange yellow green blue violet grey white}
def self.value(colors_arry)
colors_arry.first(2).map { |color| COLORS.index(color) }.join
end
end
puts ResistorColorDuo.value(["brown", "orange"])
puts ResistorColorDuo.value(["black", "brown"])
puts ResistorColorDuo.value(["orange", "brown", "red"])
puts ResistorColorDuo.value(["orange", "brown", "red", "yellow"])
输出将是:
13
01
31
31
如果您将输出转换为Integer,那么如果它先出现,则0索引将消失。
class ResistorColorDuo
COLORS = %w{black brown red orange yellow green blue violet grey white}
def self.value(colors_arry)
colors_arry.map { |color| COLORS.index(color) }.join.chars.shift(2).join
end
end
p ResistorColorDuo.value(["brown", "orange"])
p ResistorColorDuo.value(["black", "brown"])
p ResistorColorDuo.value(["orange", "brown", "red"])
p ResistorColorDuo.value(["orange", "brown", "red", "yellow"])
输出
"13"
"01"
"31"
"31"
您可以通过Array#[]
:从数组中提取前两个元素
ary = ["orange", "brown", "red"]
ary[0, 2] #=> ["orange", "brown"]
其中0
是起始索引,2
是元素的数量。
我注意到您使用的是单类方法来计算电阻器的值。由于Ruby是关于对象的,所以使用实例并将value
转换为实例方法似乎是合理的。这种方法还允许将计算拆分一位,例如:
class Resistor
COLORS = %i[black brown red orange yellow green blue violet grey white].freeze
attr_accessor :color_bands
def initialize(*color_bands)
@color_bands = color_bands
end
def digits
color_bands[0, 2].map { |color| COLORS.index(color) }
end
def value
digits.join.to_i
end
end
Resistor.new(:brown, :orange).value #=> 13
Resistor.new(:black, :brown).value #=> 1
当使用3或4个色带时,您可以将乘数作为一种单独的方法来考虑:
class Resistor
# ...
def multiplier
case color_bands.size
when 1, 2 then 1
when 3, 4 then 10 ** COLORS.index(color_bands[2])
end
end
def value
digits.join.to_i * multiplier
end
end
Resistor.new(:orange, :brown, :red).value #=> 3100
在上面的代码中,我还将字符串更改为符号,并使用splat运算符*
,这样您就可以简单地传递颜色列表。(无需将它们封装在阵列中(