我想算的次数"red"之后"green"这个数组中:
["red", "orange", "green", "red", "yellow", "blue", "green"]
Run Code Online (Sandbox Code Playgroud)
如果它是另一种颜色,代码应该忽略它并继续到数组中的下一个项目.
event_type.each_slice(2) do |red, green|
break unless green
count = count + 1
end
p "The count is #{count}"
Run Code Online (Sandbox Code Playgroud)
步骤1:
Look for red
Run Code Online (Sandbox Code Playgroud)
第2步:
IF not last item
Compare with next item on array
ELSE Go to Step 4
Run Code Online (Sandbox Code Playgroud)
第3步:
IF green, count = count + 1
Go to Step 1
ELSE Go to Step 2
Run Code Online (Sandbox Code Playgroud)
第4步:
Print Count
Run Code Online (Sandbox Code Playgroud)
这是Ruby着名的触发器的完美用例:
input = %w[red orange green red yellow blue green]
input.reduce(0) do |count, e|
if (e == "red")..(e == "green") and (e == "green")
count + 1 # inc on right boundary
else
count
end
end
#? 2
Run Code Online (Sandbox Code Playgroud)
也测试了
%w[yellow green green red orange green red yellow blue green red yellow]
Run Code Online (Sandbox Code Playgroud)
FWIW,这是我回答的第二个问题,暗示了一周内的触发器.前一个在这里.
Stefan Pochmann的清洁解决方案
input.count { |x| x == "green" if (x == "red")..(x == "green") }
Run Code Online (Sandbox Code Playgroud)
以下是我认为的解决方案.当然有更多的空间来重构它,你可以从这里开始.
a = ["red", "orange", "green", "red", "yellow", "blue", "green"]
a.reject {|e| !['red', 'green'].include? e }
.each_cons(2)
.select{|e| e == ['red', 'green']}
.size
Run Code Online (Sandbox Code Playgroud)
更具艺术性的版本.
def neither_red_nor_green e
!['red', 'green'].include? e
end
def red_followed_by_green ary
ary == ['red', 'green']
end
a.reject(&method(:neither_red_nor_green))
.each_cons(2)
.select(&method(:red_followed_by_green))
.size
Run Code Online (Sandbox Code Playgroud)
UPDATE
感谢@Stefan提出以下建议.
def either_red_or_green e
['red', 'green'].include? e
end
def red_followed_by_green ary
ary == ['red', 'green']
end
a.select(&method(:either_red_or_green))
.each_cons(2)
.count(&method(:red_followed_by_green))
Run Code Online (Sandbox Code Playgroud)
UPDATE
正如Stefan Pochmann所提出的,
a.select(&method(:either_red_or_green))
.each_cons(2)
.count(['red', 'green'])
Run Code Online (Sandbox Code Playgroud)
将完成相同的工作,而无需另一个方法调用.