如何使用map或使用一些enumarator方法对数组执行自定义操作以获取ruby中的特定结果?

Joh*_*ohn 0 ruby arrays

我有一个数组,late_mark_array:

["yes","yes","yes","yes","yes","yes","no","no","yes","yes","yes","yes","no"]
Run Code Online (Sandbox Code Playgroud)

这些表明员工在特定月份的连续"迟到标记".在这个数组中"yes"表示"迟到"."no"表示"不迟到".我想实现penalties"lates".要计算上面数组中的罚分:

  • 如果有三个连续"yes"标记,那么我想将penalty计数递增一.
  • "yes"在最初的3之后,每次连续惩罚需要加1 .

使用这个逻辑,对penalty上面的员工应该是"6".

我不知道如何为上面的数组实现这个逻辑.

我还有一个要求,其中penalties两个来计算的需求consecutive late marksrandom late marks太.例如,我有一个数组["yes","yes","yes","yes","yes","yes","no","no","yes","no","yes","no","yes","no"].在这个数组的末尾"yes","no"重复交替.作为这三个晚期的标志,不是连续的拉特.一个人employee没有得到penalty这个.在这种情况下,我想penalty以应用于既需要consecutiverandom late marks太.所以在这种情况下penalty,一个employee应该是"5".我怎样才能做到这一点?

Dog*_*ert 6

您可以使用.each_cons(3)然后计算包含所有切片的数量"yes":

irb> input = ["yes","yes","yes","yes","yes","yes","no","no","yes","yes","yes","yes","no"]
=> ["yes", "yes", "yes", "yes", "yes", "yes", "no", "no", "yes", "yes", "yes", "yes", "no"]
irb> input.each_cons(3).count { |slice| slice.all? { |item| item == "yes" } }
=> 6
Run Code Online (Sandbox Code Playgroud)