所以我正在解决一些coderbyte问题,其中一个问题是检查字符串是否包含a和b恰好相隔3个空格。我最终得到了正确的答案,但我想知道为什么foirstcode不起作用。有人可以帮助一个红宝石菜鸟吗?
错误的代码:
def ABCheck(str)
# code goes here
str1 = str.downcase.split("")
a_count = str1.find_all{|i| i == 'a'}
b_count = str1.find_all{|i| i == 'b'}
a_idx = []
b_idx = []
str1.each_with_index do|letter,idx|
if letter == 'a'
a_idx << idx
elsif letter == 'b'
b_idx << idx
end
end
a_idx.each do|i|
if b_idx.include?(i + 4)
return true
elsif b_idx.include?(i - 4)
return true
else
return false
end
end
end
正确的代码:
def ABCheck(str)
str1 = str.downcase.split("")
a_count = str1.find_all{|i| i == 'a'}
b_count = str1.find_all{|i| i == 'b'}
a_idx = []
b_idx = []
c = []
d = []
str1.each_with_index do|letter,idx|
if letter == 'a'
a_idx << idx
elsif letter == 'b'
b_idx << idx
end
end
a_idx.each do|i|
c << i + 4
d << i - 4
end
compare1 = c & b_idx
compare2 = d & b_idx
if compare1 != []
return true
elsif compare2 != []
return true
else
return false
end
end
答案 0 :(得分:2)
这是一个紧凑的替代答案,但可能需要一些解释:
def ab_check(s)
!!(s =~ /a...b|b...a/)
end
首先,字符串s
与正则表达式匹配。第一部分a...b
表示检查a
后跟任意三个字符,然后检查b
。 |
是正则表达式中的逻辑OR。最后一部分b...a
检查相反的结果:b
后跟任意三个字符,然后是a
。正则表达式匹配返回索引或nil,但您需要true或false。所以我通过使用一元!
强制一个真/假答案(由于优先权需要parens)。现在这与我们想要的相反(当不匹配时为真),因此我们必须使用第二个!
。
答案 1 :(得分:0)
代码的最后一部分应为:
a_idx.each do |i|
if b_idx.include?(i + 4)
return true
elsif b_idx.include?(i - 4)
return true
end
end
false
为我工作。