2017-06-12 44 views
-2

你住在Cartesia城,所有道路都布置在一个完美的网格中。你预约时间太早到达十分钟,所以你决定抓紧机会去散步。这个城市为其公民提供了一个在手机上的Walk Generating App - 每次按下按钮时,它会向您发送一组代表行走方向的单字母字符串(例如['n','s','w', 'E'])。你知道它需要你花一分钟来遍历一个城市街区,所以创建一个函数,如果你的应用程序给你带来的将会带你十分钟(你不想早点或晚点!),当然,回到你的起点。否则返回false。Codewars步行10分钟

这里是我的代码:

def isValidWalk(walk) 
    vertical = 0 
    horizontal = 0 

# walk.each { 
#  |x| 
#  if x = 'n' 
#  vertical = vertical + 1 
#  elsif x = 's' 
#  vertical = vertical - 1 
#  elsif x = 'w' 
#  horizontal = horizontal + 1 
#  elsif x = 'e' 
#  horizontal = horizontal - 1 
#  end 

# } 

    for each in walk do 
    if walk = 'n' 
     vertical = vertical + 1 
    elsif walk = 's' 
     vertical = vertical - 1 
    elsif walk = 'w' 
     horizontal = horizontal + 1 
    elsif walk = 'e' 
     horizontal = horizontal - 1 
    end 
    end 

    count = walk.length 

    if vertical == 0 && horizontal == 0 && count == 10 
     return true 
    else 
     return false 
    end 


end 

程序失败的条件:“如果一个有效的散步返回true”任何想法为什么?并且关于当前代码或注释部分哪一个更好的建议?

任何帮助将不胜感激,在此先感谢。

回答

2

您尝试执行each块的尝试都有语法问题。

您的第一个(注释掉)尝试(walk.each)通常被认为是Ruby中的首选语法。但是您使用=而不是==,这就是为什么它不起作用。你应该写:

walk.each do |x| 
    if x == 'n' 
    vertical = vertical + 1 
    elsif x == 's' 
    # ... 
    end 
end 

=赋值,而==查询两个值是否相等(和返回true/false)。

您的第二次尝试也使这===错误,此外,您还使用了错误的变量。你可以写这就像:

for value in walk do 
    if value == 'n' 
    vertical = vertical + 1 
    # ... 
    end 
end 

最后要注意的是,你可以通过编写如稍有简化代码:

vertical += 1 

下面是代码的一个完整的,简化的版本:

def valid_walk?(walk) 
    vertical = 0 
    horizontal = 0 

    walk.each do |x| 
    if x == 'n' 
     vertical += 1 
    elsif x == 's' 
     vertical -= 1 
    elsif x == 'w' 
     horizontal += 1 
    elsif x == 'e' 
     horizontal -= 1 
    end 
    end 

    count = walk.length 
    vertical == 0 && horizontal == 0 && count == 10 
end 

您可以通过使用保护子句进一步改进它(检查数组在之前有效循环,以便更好地执行ance!)并使用case声明。但如果您有兴趣,我会将其作为练习留给您。

+0

工作完美!非常感谢你这么详细的回复! – StopReadingThisUsername