您居住在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。”有什么想法吗?关于当前代码或注释部分哪个更好的建议?
任何帮助将不胜感激,提前感谢。
答案 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
语句。但如果您对此感兴趣,我会将此作为练习留给您。