嗨我有一个方法XO
返回 true
如果x比o更多,则返回 false ,反之亦然
返回 true 。
这些应该是正确的测试:
XO("ooxx") => true
XO("xooxx") => false
XO("ooxXm") => true
XO("zpzpzpp") => true // when no 'x' and 'o' is present should return true
XO("zzoo") => false
出于某种原因,我的方法总是返回true,我不明白为什么。
def XO(str)
x = str.count("o" "O")
y = str.count ("x" "X")
if x == y
true
elsif
str.split.select { |x| !x.include?("o" "O") && !x.include?("x" "X") }
true
else
false
end
end
我是ruby的新手,为我的破旧代码道歉。
答案 0 :(得分:3)
您的代码存在的问题是这一行:
str.split.select { |x| !x.include?("o" "O") && !x.include?("x" "X") }
在字符串没有'x'或'o'的情况下,将返回一个空数组[]
。在Ruby中,任何数组都被认为是真实的,甚至是空的数组。所以你的代码总是在这里返回true
。您可以通过检查数组是否为空来修复它:
def XO(str)
x = str.count("o" "O")
y = str.count ("x" "X")
if x == y
true
elsif
str.split.select { |x| !x.include?("o" "O") && !x.include?("x" "X") }.empty?
true
else
false
end
end
此代码可以正常运行并执行您想要的操作。但是,它太复杂了!如果你看看你的要求:
当没有x和没有o时,你可以说实际上有0 x和0 o,这意味着有'x>和'o'的相同数量。这意味着你可以这样做:
def XO(str)
x = str.count("o" "O")
y = str.count ("x" "X")
x == y
end
在没有'x'或'o'的情况下,你会0 == 0
返回true,就像你想要的那样。
答案 1 :(得分:2)
直接等效测试将满足您的所有条件。
[httpd]
bind_address = 0.0.0.0
为缩进使用两个空格,为方法名称使用小写。注意更紧凑的def xo str
str.count("oO") == str.count("xX")
end
xo "ooxx" #=> true
xo "xooxx" #=> false
xo "ooxXm" #=> true
xo "zpzpzpp" #=> true
xo "zzoo" #=> false
参数。