Ruby-App Academy关于While循环中条件的实践练习

Ruby-App Academy关于While循环中条件的实践练习,ruby,while-loop,conditional-statements,Ruby,While Loop,Conditional Statements,我正在完成第一个编码挑战,对为#8提供的解决方案有一个问题: # Write a method that takes a string in and returns true if the letter # "z" appears within three letters **after** an "a". You may assume # that the string contains only lowercase letters. # # Diffi

我正在完成第一个编码挑战,对为#8提供的解决方案有一个问题:

# Write a method that takes a string in and returns true if the letter
# "z" appears within three letters **after** an "a". You may assume
# that the string contains only lowercase letters.
#
# Difficulty: medium.

def nearby_az(string)
  idx1 = 0
  while idx1 < string.length
    if string[idx1] != "a"
      idx1 += 1
      next
    end

    idx2 = idx1 + 1
    while (idx2 < string.length) && (idx2 <= idx1 + 3)
      if string[idx2] == "z"
        return true
      end

      idx2 += 1
    end

    idx1 += 1
  end

  return false
end

# These are tests to check that your code is working. After writing
# your solution, they should all print true.

puts("\nTests for #nearby_az")
puts("===============================================")
    puts('nearby_az("baz") == true: ' + (nearby_az('baz') == true).to_s)
    puts('nearby_az("abz") == true: ' + (nearby_az('abz') == true).to_s)
    puts('nearby_az("abcz") == true: ' + (nearby_az('abcz') == true).to_s)
    puts('nearby_az("a") == false: ' + (nearby_az('a') == false).to_s)
    puts('nearby_az("z") == false: ' + (nearby_az('z') == false).to_s)
    puts('nearby_az("za") == false: ' + (nearby_az('za') == false).to_s)
puts("===============================================")
#编写一个方法,该方法接收字符串,如果字母
#“z”出现在**和“a”之后的三个字母**内。你可以假设
#字符串仅包含小写字母。
#
#难度:中等。
def附近_az(字符串)
idx1=0
而idx1idx2
)是必需的

它是一种保护,当idx2超出字符串的边界时,可以防止循环的无意义迭代

在字符串长度以外的位置寻址字符将返回nil。
nil
永远不会等于
'z'
。因此,我们最好在到达末尾时停止。这就是这里的检查,优化


在其他情况下,越界访问通常是一种严重的违法行为,并导致各种问题(通常是崩溃)。所以总是这样做是有意义的。

我知道这并不能回答您的确切问题,其他人已经回答了,但与编程的通常情况一样,有一种更好的方法。您可以使用正则表达式轻松解决此问题

def nearby_az(string)
  !(string =~ /a\w{0,3}z/).nil?
end
正则表达式将匹配模式
a
,后面有0到3个字符,然后是a
z
。如果不匹配,则
=~
操作符将返回
nil
,因此
nil?
方法返回
true
,这意味着字符串附近没有az,因此我们使用
来反转布尔值,然后使用
is方法将返回
false

如果有匹配项,
=~
返回第一个字符的索引,它不是
nil
,因此
nil?
返回
false
,我们像前面一样反转它以返回
true


我只是觉得这可能会有帮助。

可以说,这是必需的,因为实现不是非常惯用的Ruby。更惯用的方法可能是基于string#split
def nearby_az(string)
  !(string =~ /a\w{0,3}z/).nil?
end