Hacer un horario horario

Entonces ... alguien me pidió recientemente que hiciera un cronograma para ellos y acepté. Cuando me senté para hacerlo, me di cuenta de que era más difícil de lo que pensaba. Es solo un horario para dar turnos a 4 personas, ya sea de día o de noche.

Pensé en algo como esto:

for Monday to Saturday {
  for(i=0;i<people.length;i++){
    if (person[i].available()){
      person.worksDay()
      person is now not available.
    }
  }

  for(i=0;i<people.length;i++){
    if (person[i].available()){
      person[i].worksNight()
      person[i] is now not available.
    }
  }
}

Entonces, la idea detrás de este algoritmo es que para cada día, una persona es asignada a un turno de día o de noche. Una persona está disponible si SOLO no ha trabajado un turno y no está de vacaciones. Es de lunes a sábado. Como probablemente pueda ver, dadas las personas A, B, C, D, la tarea se vería así (si no hay nadie de vacaciones)

Mon A B
Tue C D
Wed A B
Th  C D
Fri A B
Sat C D

Esto funciona, supongo, pero es un poco obvio. La persona que me preguntó quería ver diferentes opciones. ¿Hay una mejor manera de hacer esto para ver más que esta opción? ¿O hay incluso un programa que haga esto por usted?

Respuestas a la pregunta(3)

Su respuesta a la pregunta