Skip to content

Instantly share code, notes, and snippets.

@kenju
Last active June 26, 2021 14:45
Show Gist options
  • Save kenju/83d2bef4c766cf68958caf77141c1a66 to your computer and use it in GitHub Desktop.
Save kenju/83d2bef4c766cf68958caf77141c1a66 to your computer and use it in GitHub Desktop.
On-call rota with 7 people for 24/7 with 24 hours per rota
class Rota
def initialize(members, window)
@members = members
@window = window
@enumerator = buid_enumerator
end
def take
@window.times.map {
walk
}
end
private
def walk
@enumerator.peek
@enumerator.next
end
def buid_enumerator
Enumerator.new {|y|
i = 0
loop {
idx = i % @members.length
y << @members[idx]
i += 1
}
}
end
end
def show_rota(weeks, wday_members, wend_members = wday_members)
puts "=================================="
puts "#{weeks} weeks"
puts "Weekday rota: #{wday_members}"
puts "Weekend rota: #{wend_members}"
puts "=================================="
puts "Mon Tue Wed Thu Fri Sat Sun"
weekday_rota = Rota.new(wday_members, 5)
weekend_rota = Rota.new(wend_members, 2)
wend_last = -1
weeks.times {|i|
wday = weekday_rota.take
wend = weekend_rota.take
week = (wday + wend)
comment = ""
if wend_last == wday.first
comment << "<-- Sun/Mon in row!"
end
if wday.last == wend.first
comment << "<-- Fri/Sat in row!"
end
wend_last = wend.last
puts "#{week} #{comment}"
}
end
# with 1 rotation (should conflict)
show_rota(10,
[ 1, 2, 3, 4, 5, 6, 7 ],
)
# with 1 long rotation with different orders
show_rota(10,
[
1, 2, 3, 4, 5, 6, 7,
4, 5, 6, 7, 1, 2, 3,
],
)
# with 2 layers for weekday/weekend with different orders
show_rota(30,
[ 1, 2, 3, 4, 5, 6, 7 ],
[ 1, 2, 3, 4, 5, 6, 7 ],
)
# with 2 layers for weekday/weekend with different orders
show_rota(30,
[ 1, 2, 3, 4, 5, 6, 7 ],
[ 1, 7, 6, 5, 4, 3, 2 ],
)
# with 2 layers for weekday/weekend with reversed orders
show_rota(30,
[ 1, 2, 3, 4, 5, 6, 7 ],
[ 7, 6, 5, 4, 3, 2, 1 ],
)
==================================
10 weeks
Weekday rota: [1, 2, 3, 4, 5, 6, 7]
Weekend rota: [1, 2, 3, 4, 5, 6, 7]
==================================
Mon Tue Wed Thu Fri Sat Sun
[1, 2, 3, 4, 5, 1, 2]
[6, 7, 1, 2, 3, 3, 4] <-- Fri/Sat in row!
[4, 5, 6, 7, 1, 5, 6] <-- Sun/Mon in row!
[2, 3, 4, 5, 6, 7, 1]
[7, 1, 2, 3, 4, 2, 3]
[5, 6, 7, 1, 2, 4, 5]
[3, 4, 5, 6, 7, 6, 7]
[1, 2, 3, 4, 5, 1, 2]
[6, 7, 1, 2, 3, 3, 4] <-- Fri/Sat in row!
[4, 5, 6, 7, 1, 5, 6] <-- Sun/Mon in row!
==================================
10 weeks
Weekday rota: [1, 2, 3, 4, 5, 6, 7, 4, 5, 6, 7, 1, 2, 3]
Weekend rota: [1, 2, 3, 4, 5, 6, 7, 4, 5, 6, 7, 1, 2, 3]
==================================
Mon Tue Wed Thu Fri Sat Sun
[1, 2, 3, 4, 5, 1, 2]
[6, 7, 4, 5, 6, 3, 4]
[7, 1, 2, 3, 1, 5, 6]
[2, 3, 4, 5, 6, 7, 4]
[7, 4, 5, 6, 7, 5, 6]
[1, 2, 3, 1, 2, 7, 1]
[3, 4, 5, 6, 7, 2, 3]
[4, 5, 6, 7, 1, 1, 2] <-- Fri/Sat in row!
[2, 3, 1, 2, 3, 3, 4] <-- Sun/Mon in row!<-- Fri/Sat in row!
[4, 5, 6, 7, 4, 5, 6] <-- Sun/Mon in row!
==================================
30 weeks
Weekday rota: [1, 2, 3, 4, 5, 6, 7]
Weekend rota: [1, 2, 3, 4, 5, 6, 7]
==================================
Mon Tue Wed Thu Fri Sat Sun
[1, 2, 3, 4, 5, 1, 2]
[6, 7, 1, 2, 3, 3, 4] <-- Fri/Sat in row!
[4, 5, 6, 7, 1, 5, 6] <-- Sun/Mon in row!
[2, 3, 4, 5, 6, 7, 1]
[7, 1, 2, 3, 4, 2, 3]
[5, 6, 7, 1, 2, 4, 5]
[3, 4, 5, 6, 7, 6, 7]
[1, 2, 3, 4, 5, 1, 2]
[6, 7, 1, 2, 3, 3, 4] <-- Fri/Sat in row!
[4, 5, 6, 7, 1, 5, 6] <-- Sun/Mon in row!
[2, 3, 4, 5, 6, 7, 1]
[7, 1, 2, 3, 4, 2, 3]
[5, 6, 7, 1, 2, 4, 5]
[3, 4, 5, 6, 7, 6, 7]
[1, 2, 3, 4, 5, 1, 2]
[6, 7, 1, 2, 3, 3, 4] <-- Fri/Sat in row!
[4, 5, 6, 7, 1, 5, 6] <-- Sun/Mon in row!
[2, 3, 4, 5, 6, 7, 1]
[7, 1, 2, 3, 4, 2, 3]
[5, 6, 7, 1, 2, 4, 5]
[3, 4, 5, 6, 7, 6, 7]
[1, 2, 3, 4, 5, 1, 2]
[6, 7, 1, 2, 3, 3, 4] <-- Fri/Sat in row!
[4, 5, 6, 7, 1, 5, 6] <-- Sun/Mon in row!
[2, 3, 4, 5, 6, 7, 1]
[7, 1, 2, 3, 4, 2, 3]
[5, 6, 7, 1, 2, 4, 5]
[3, 4, 5, 6, 7, 6, 7]
[1, 2, 3, 4, 5, 1, 2]
[6, 7, 1, 2, 3, 3, 4] <-- Fri/Sat in row!
==================================
30 weeks
Weekday rota: [1, 2, 3, 4, 5, 6, 7]
Weekend rota: [1, 7, 6, 5, 4, 3, 2]
==================================
Mon Tue Wed Thu Fri Sat Sun
[1, 2, 3, 4, 5, 1, 7]
[6, 7, 1, 2, 3, 6, 5]
[4, 5, 6, 7, 1, 4, 3]
[2, 3, 4, 5, 6, 2, 1]
[7, 1, 2, 3, 4, 7, 6]
[5, 6, 7, 1, 2, 5, 4]
[3, 4, 5, 6, 7, 3, 2]
[1, 2, 3, 4, 5, 1, 7]
[6, 7, 1, 2, 3, 6, 5]
[4, 5, 6, 7, 1, 4, 3]
[2, 3, 4, 5, 6, 2, 1]
[7, 1, 2, 3, 4, 7, 6]
[5, 6, 7, 1, 2, 5, 4]
[3, 4, 5, 6, 7, 3, 2]
[1, 2, 3, 4, 5, 1, 7]
[6, 7, 1, 2, 3, 6, 5]
[4, 5, 6, 7, 1, 4, 3]
[2, 3, 4, 5, 6, 2, 1]
[7, 1, 2, 3, 4, 7, 6]
[5, 6, 7, 1, 2, 5, 4]
[3, 4, 5, 6, 7, 3, 2]
[1, 2, 3, 4, 5, 1, 7]
[6, 7, 1, 2, 3, 6, 5]
[4, 5, 6, 7, 1, 4, 3]
[2, 3, 4, 5, 6, 2, 1]
[7, 1, 2, 3, 4, 7, 6]
[5, 6, 7, 1, 2, 5, 4]
[3, 4, 5, 6, 7, 3, 2]
[1, 2, 3, 4, 5, 1, 7]
[6, 7, 1, 2, 3, 6, 5]
==================================
30 weeks
Weekday rota: [1, 2, 3, 4, 5, 6, 7]
Weekend rota: [7, 6, 5, 4, 3, 2, 1]
==================================
Mon Tue Wed Thu Fri Sat Sun
[1, 2, 3, 4, 5, 7, 6]
[6, 7, 1, 2, 3, 5, 4] <-- Sun/Mon in row!
[4, 5, 6, 7, 1, 3, 2] <-- Sun/Mon in row!
[2, 3, 4, 5, 6, 1, 7] <-- Sun/Mon in row!
[7, 1, 2, 3, 4, 6, 5] <-- Sun/Mon in row!
[5, 6, 7, 1, 2, 4, 3] <-- Sun/Mon in row!
[3, 4, 5, 6, 7, 2, 1] <-- Sun/Mon in row!
[1, 2, 3, 4, 5, 7, 6] <-- Sun/Mon in row!
[6, 7, 1, 2, 3, 5, 4] <-- Sun/Mon in row!
[4, 5, 6, 7, 1, 3, 2] <-- Sun/Mon in row!
[2, 3, 4, 5, 6, 1, 7] <-- Sun/Mon in row!
[7, 1, 2, 3, 4, 6, 5] <-- Sun/Mon in row!
[5, 6, 7, 1, 2, 4, 3] <-- Sun/Mon in row!
[3, 4, 5, 6, 7, 2, 1] <-- Sun/Mon in row!
[1, 2, 3, 4, 5, 7, 6] <-- Sun/Mon in row!
[6, 7, 1, 2, 3, 5, 4] <-- Sun/Mon in row!
[4, 5, 6, 7, 1, 3, 2] <-- Sun/Mon in row!
[2, 3, 4, 5, 6, 1, 7] <-- Sun/Mon in row!
[7, 1, 2, 3, 4, 6, 5] <-- Sun/Mon in row!
[5, 6, 7, 1, 2, 4, 3] <-- Sun/Mon in row!
[3, 4, 5, 6, 7, 2, 1] <-- Sun/Mon in row!
[1, 2, 3, 4, 5, 7, 6] <-- Sun/Mon in row!
[6, 7, 1, 2, 3, 5, 4] <-- Sun/Mon in row!
[4, 5, 6, 7, 1, 3, 2] <-- Sun/Mon in row!
[2, 3, 4, 5, 6, 1, 7] <-- Sun/Mon in row!
[7, 1, 2, 3, 4, 6, 5] <-- Sun/Mon in row!
[5, 6, 7, 1, 2, 4, 3] <-- Sun/Mon in row!
[3, 4, 5, 6, 7, 2, 1] <-- Sun/Mon in row!
[1, 2, 3, 4, 5, 7, 6] <-- Sun/Mon in row!
[6, 7, 1, 2, 3, 5, 4] <-- Sun/Mon in row!
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment