1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222
| using Base, Dates
# on défini les struct
struct Personne
nom::String
prénom::String
end
struct Equipe
indice::Int16
personne_1::Personne
personne_2::Personne
personne_3::Personne
end
struct Année
an::Int16
indice_rotation::Array{Int16}
end
struct tranche_horaire
nom::String
durée::Int16
tranche::String
end
struct Result
indice_équipe::Int16
date::DateTime
indice_horaire::Int16
end
# on personalise l'affichage
Base.show(io::IO, p::Personne) = println(io, " $(p.nom) $(p.prénom) ")
Base.show(io::IO, e::Equipe) = println(io, " Equipe $(e.indice) : $(e.personne_1), $(e.personne_2), $(e.personne_3) ")
Base.show(io::IO, t::tranche_horaire) = println(io, " $(t.nom) $(t.tranche) ")
# on construit l'indice de rotation pour un an
function construire_indice_rotation(nombre_jours_an)
n = 1
r = [1]
for i in 1:1:nombre_jours_an
if n > nombre_jours_an - 1
break
end
push!(r, r[i] + mod(i, 2))
n = n + 1
end
pushfirst!(r, 1)
return r
end
# on utilise la version Julia de l'algorithme
function indice_horaire(indice_équipe, indice_rotation)
return mod(indice_équipe + indice_rotation - 2, 4) + 1
end
function main()
# on défini les tranches horaires
H1 = tranche_horaire("Matin", 8, "de 5 h à 13 h")
H2 = tranche_horaire("Après_midi", 8, "de 13 h à 21 h")
H3 = tranche_horaire("Nuit", 8, "de 21 h à 5 h")
H4 = tranche_horaire("Repos", 0, "toute la journée")
Hn = [H1, H2, H3, H4]
# on défini les équipes
équipe_1 = Equipe(
1,
Personne("Dupond", "Jean"),
Personne("Lagarde", "Hector"),
Personne("Durand", "Henri")
)
équipe_2 = Equipe(
2,
Personne("Dupond", "Pierre"),
Personne("Lagarde", "François"),
Personne("Durand", "Jean Paul")
)
équipe_3 = Equipe(
3,
Personne("Dupond", "Henri"),
Personne("Lagarde", "Jean"),
Personne("Durand", "Hector")
)
équipe_4 = Equipe(
4,
Personne("Dupond", "François"),
Personne("Lagarde", "Jean Paul"),
Personne("Durand", "Pierre")
)
En = [équipe_1, équipe_2, équipe_3, équipe_4]
# le nombre de jour en 2021
days_in_year_2021 = daysinyear(2021)
# on défini l'année 2021
an_2021 = Année(
2021,
construire_indice_rotation(days_in_year_2021)
)
# le premier janvier de 2021
date_2021_1_1 = DateTime(2021, 1, 1)
# exemple, calcul des horaires pour l'équipe 2
let r = []
println("==== Exemple 1 ====")
# on traite les 15 premiers jours de l'année
for k in 1:1:15
push!(r, [date_2021_1_1 + Day(k-1),
indice_horaire(équipe_2.indice, an_2021.indice_rotation[k])])
end
# on affiche le résultat
for k in r
println("$(k[1]) : indice_horaire $(k[2])")
end
#=
2021-01-01T00:00:00 : indice_horaire 2
2021-01-02T00:00:00 : indice_horaire 2
2021-01-03T00:00:00 : indice_horaire 3
2021-01-04T00:00:00 : indice_horaire 3
2021-01-05T00:00:00 : indice_horaire 4
2021-01-06T00:00:00 : indice_horaire 4
2021-01-07T00:00:00 : indice_horaire 1
2021-01-08T00:00:00 : indice_horaire 1
2021-01-09T00:00:00 : indice_horaire 2
2021-01-10T00:00:00 : indice_horaire 2
2021-01-11T00:00:00 : indice_horaire 3
2021-01-12T00:00:00 : indice_horaire 3
2021-01-13T00:00:00 : indice_horaire 4
2021-01-14T00:00:00 : indice_horaire 4
2021-01-15T00:00:00 : indice_horaire 1
=#
end
# exemple, calcul de l'horaire du 2021-11-17 pour l'équipe 2
let date_t = DateTime(2021, 11, 17), day_of_year = dayofyear(date_t)
println("==== Exemple 2 ====")
# indice horaire pour l'équique 2 pour le jour day_of_year/days_in_year_2021
indice_horaire_2 = indice_horaire(équipe_2.indice, an_2021.indice_rotation[day_of_year])
println("$(équipe_2) \n $(date_t) : $(Hn[indice_horaire_2])")
#=
Equipe 2 : Dupond Jean, Lagarde Hector, Durand Henri
2021-11-17T00:00:00 : Après_midi de 13 h à 21 h
=#
end
# exemple, calcul des horaires du 2021-06-01 au 2021-07-15 pour toutes les équipes
let date_t_1 = DateTime(2021, 6, 1),
day_of_year_1 = dayofyear(date_t_1),
date_t_2 = DateTime(2021, 7, 15),
day_of_year_2 = dayofyear(date_t_2)
println("==== Exemple 3 ====")
# r contiendra un array de Result
r = []
for E in En
for D in day_of_year_1:1:day_of_year_2
push!(r, Result(E.indice, date_2021_1_1 + Day(D-1), indice_horaire(E.indice, an_2021.indice_rotation[D])))
end
end
for k in r
println("Equipe $(k.indice_équipe) \n $(k.date) : $(Hn[k.indice_horaire])")
end
#=
Equipe 1
2021-06-01T00:00:00 : Repos toute la journée
Equipe 1
2021-06-02T00:00:00 : Matin de 5 h à 13 h
Equipe 1
2021-06-03T00:00:00 : Matin de 5 h à 13 h
Equipe 1
2021-06-04T00:00:00 : Après_midi de 13 h à 21 h
Equipe 1
2021-06-05T00:00:00 : Après_midi de 13 h à 21 h
Equipe 1
2021-06-06T00:00:00 : Nuit de 21 h à 5 h
...
Equipe 4
2021-07-12T00:00:00 : Repos toute la journée
Equipe 4
2021-07-13T00:00:00 : Repos toute la journée
Equipe 4
2021-07-14T00:00:00 : Matin de 5 h à 13 h
Equipe 4
2021-07-15T00:00:00 : Matin de 5 h à 13 h
=#
end
return
end
@time main() # 0.135841 seconds (282.31 k allocations: 16.842 MiB, 74.41% compilation time) |