计算数组中的更改

Jos*_* Ng -2 ruby counter

我想算的次数"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)

Ale*_*kin 7

这是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)

  • @SergioTulentsev你说如果a..b`身体你想要一个漂亮干净的`foo?没问题:`input.count {| x | x =="green"if(x =="red")..(x =="green")}` (3认同)

mar*_*dze 6

以下是我认为的解决方案.当然有更多的空间来重构它,你可以从这里开始.

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)

将完成相同的工作,而无需另一个方法调用.