我有一个方法返回找出哪个给定数字在均匀度上与其他数字不同并返回它的索引(+1).
def iq_test(numbers)
new_array = numbers.split(" ").collect {|n| n.to_i}
x = new_array.select(&:even?)
y = new_array.select(&:odd?)
if x.count > y.count
new_array.split.each_with_index do |value, index|
"#{index + 1}".to_i if value % 3 != 0
else y.count > x.count
"#{index + 1}".to_i if value % 2 == 0
end
end
end
Run Code Online (Sandbox Code Playgroud)
例如iq_test("2 4 7 8 10")应该返回3.
但是,我收到了
语法错误,意外的keyword_else,期待keyword_end
我无法找到我没有关闭一些代码的地方.
这将是部分代码审查和答案.让我们从第一部分开始:
new_array = numbers.split(" ").collect {|n| n.to_i}
x = new_array.select(&:even?)
y = new_array.select(&:odd?)
Run Code Online (Sandbox Code Playgroud)
x和y真evens和odds,不是吗?那些变量名称会更好.split通过对空白默认分裂,所以(" ")是不必要的.partition.map在处理数组中的所有值时使用,并且collect仅在执行从对象数组中提取属性时使用.(换句话说,我map经常使用).(&:to_i)是一个快捷方式{|n| n.to_i}考虑到上述情况重写,这部分可能如下所示:
numbers = input.split.map(&:to_i)
evens, odds = numbers.partition(&:even?)
Run Code Online (Sandbox Code Playgroud)
现在让我们看看其余的:
if x.count > y.count
new_array.split.each_with_index do |value, index|
"#{index + 1}".to_i if value % 3 != 0
else y.count > x.count
"#{index + 1}".to_i if value % 2 == 0
end
end
Run Code Online (Sandbox Code Playgroud)
让我们考虑你得到的错误信息:意外的关键字else; 预期end.这包含了回答问题所需要知道的所有内容(如果您考虑这些问题,您会发现大多数错误消息都会发生).它说它找到了else预期的地方end.而这正是问题所在,您需要end在else关闭do/end块之前放置.此外,您的else部分缺少迭代逻辑.
其他说明:
end的内容并不符合他们的结局.正确的对齐可以帮助捕获这些类型的错误.使用像Rubymine这样的IDE或者支持Ruby的复杂文本编辑器也可以提供帮助.else条款是独立的,你不要在它们之后加上条件.也许你的意思elsif是霍尔格评论."#{}")将表达式转换为字符串.在这里,你将转换index + 1为一个字符串,然后回到一个整数.to_i,取消它,可以这么说.简单地说index + 1会.Array#index 可用于确定值的索引.这是考虑上述情况的版本:
if evens.count > odds.count
odds.map{|n| numbers.index(n) + 1}
elsif odds.count > evens.count
evens.map{|n| numbers.index(n) + 1}
end
Run Code Online (Sandbox Code Playgroud)
如果你喜欢这种东西,请将你的工作代码带到http://codereview.stackexchange.com/!
| 归档时间: |
|
| 查看次数: |
148 次 |
| 最近记录: |