我是一个绝对的编码初学者,刚刚开始学习ruby。我遇到了一个挑战,我应该检查一个数字是否“丰富多彩”。
当给定一个数时,其子序列中每一位的乘积都不相同,这种数称为彩色数。
例如,“263是一个彩色数字,因为[2,6,3,26,63,263]都是不同的;而236不是彩色的,因为[2,3,6,23,36,236]有两次6。
所以取所有连续的数字子集,取它们的乘积,并确保所有的乘积都是不同的。
在给定的挑战中,我们只接受最多三位数的数字。
因此,由于我是一个初学者,我试图单独编写每个产品。我知道这不是“好”代码,但我仍然想了解为什么它不起作用。我认为它应该......但它没有:)
如果有人能告诉我为什么这不起作用,我会很高兴。我不是在寻找一个更好的解决方案,我真的只想知道为什么我的不起作用。
太感谢你了!
def colorful?(number)
if number.class != Integer
return false
elsif number.to_s.length > 3
return false
elsif number == 0 || 1
return true
end
digits_arr = number.digits.reverse
product_1 = digits_arr[0]*digits_arr[1]
product_2 = digits_arr[1]*digits_arr[2]
product_3 = digits_arr[0]*digits_arr[1]*digits_arr[2]
final_array = digits_arr + product_1 + product_2 + product_3
if final_array.uniq.length == final_array.length
return true
else
return false
end
end
4条答案
按热度按时间r9f1avp51#
你最大的问题在这里:
在Ruby中,
1
总是一个真值,所以这个条件总是满足的,导致return true
的执行,终止你的方法,并返回true
的任何值。一旦你把它替换成
或
你还有一些问题需要解决-下一个问题是
No implicit conversion of Integer into an Array
,当你尝试将数字添加到数组中时。我希望你能自己解决这个问题。:)我们在这里,一些小音符。
在Ruby中我们更喜欢duck-typing而不是strong类型(主要是因为我们没有强类型),所以任何形式的参数类型检查(如
if number.class != Integer
)都会被抛出(更不用说它不会工作得很好,因为你会拒绝大量其他的Numeric
类--如果你必须检查类,使用is_a?
或kind_of?
)。请注意,如果你的方法执行的对象不是一个数字,你确实希望抛出一个异常,而不是让计算继续下去--防止系统进入坏状态要比调试坏状态和猜测你是如何到达那里容易得多。这里可能是个人观点,但
elsif
很糟糕-几乎总是有更好的方法。在这种情况下,因为你在每种情况下都要返回,你可以这样做:1bqhqjot2#
参见Set#add?
我可以通过添加一些
puts
语句并对上面的两个示例整数执行该方法来最好地展示该方法的工作原理。将显示以下内容。
将显示以下内容。
因为发现
products
包含m
(3
),所以返回false
。kfgdxczn3#
所以最后我这样解决了它(我知道有更好的方法,但仍然,它现在工作(如可以判断一个数字是否是彩色的,如果它不超过3位数):
2ul0zpep4#
所以这段代码对我很有用。我也是一个初学者,呵呵,刚刚结束了编码训练营