Codewars需要10分钟步行路程

时间:2017-06-12 11:20:05

标签: ruby

  

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

这是我的代码:

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。”有什么想法吗?关于当前代码或注释部分哪个更好的建议?

任何帮助将不胜感激,提前感谢。

1 个答案:

答案 0 :(得分:2)

您尝试执行walk.each阻止的两种方法都存在语法问题。

您的第一次(注释掉)尝试(=)通常被认为是ruby中的首选语法。但是您使用的是==而不是walk.each do |x| if x == 'n' vertical = vertical + 1 elsif x == 's' # ... end end ,这就是为什么它不起作用的原因。你应该写:

=

== 分配值,而true 查询两个值是否相等(并返回false / {{1 }})。

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

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

您可以使用一个保护子句进一步改进它(检查数组是否有效循环之前,以获得更好的性能!)并使用case语句。但如果您对此感兴趣,我会将此作为练习留给您。