Ako ti nisu bitne performanse, uvek ostaje brute force:
Kôd:
# trazi redosled ucenika za koji je moguce napraviti raspored
def rasporedi ucenici, profa, cas
ucenici.keys.permutation.map{|redosled|
poredjaj ucenici, profa, cas, redosled
}.find{|e| e}
end
# za zadati redosled ucenika, odredjuje pocetak i kraj casa
def poredjaj ucenici, profa, cas, redosled
poc = profa.first
redosled.inject({}) do |acc, ime|
poc = [ucenici[ime].first, poc].max
return nil if poc+cas > [profa.last, ucenici[ime].last].min
acc[ime] = [poc, poc+cas]
poc += cas
acc
end
end
ucenici = {
pera: [6,8], # slobodan od 6 do 8
zika: [2,5], # slobodan od 2 do 5
mika: [1,3] # slobodan od 1 do 3
}
profa = [1,8] # slobodan od 1 do 8
p rasporedi ucenici, profa, 1
#=> {:mika=>[1, 2], :zika=>[2, 3], :pera=>[6, 7]}
p rasporedi ucenici, profa, 2
#=> {:mika=>[1, 3], :zika=>[3, 5], :pera=>[6, 8]}