如果每个循环中的陈述没有给我正确的答案

时间:2014-06-24 01:33:19

标签: ruby

所以我正在解决一些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

2 个答案:

答案 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

为我工作。