From ab53dcd58ed576ddf74e510b4cab217e48629ddf Mon Sep 17 00:00:00 2001 From: 10756864 <antoine.kryus@etu.utc.fr> Date: Sun, 16 Oct 2022 16:30:27 +0200 Subject: [PATCH] add SWFFactory() --- ia04/comsoc/tieBreak.go | 57 +++++++++++++++++++++++++++++++++-------- 1 file changed, 47 insertions(+), 10 deletions(-) diff --git a/ia04/comsoc/tieBreak.go b/ia04/comsoc/tieBreak.go index 49b6b61..6933c04 100644 --- a/ia04/comsoc/tieBreak.go +++ b/ia04/comsoc/tieBreak.go @@ -22,19 +22,56 @@ func TieBreakFactory(tieBreakAlts []Alternative) func([]Alternative) (Alternativ } } -//func SWFFactory(swf1 func (Profile) (Count, error), tieBreak func ([]Alternative) (Alternative, error)) (swf2 func(Profile) (alts []Alternative, err error)) { -// return func(p Profile) (alts Alternative, err error) { -// alts, _ := maxCount(swf1(p)) -// alt, _ := tieBreak(alts) -// return alt, nil -// il faut trifouiller le count -// } -//} +func SWFFactory(swf1 func (Profile) (Count, error), tieBreak func ([]Alternative) (Alternative, error)) (swf2 func(Profile) (alts []Alternative, err error)) { + return func(p Profile) (alts []Alternative, err error) { + + count, _ := swf1(p) + // winner := -1 + for count != nil { // on cherche les maxcount + bestAlts := maxCount(count) + + for len(bestAlts) > 1 { // tant qu'on a pas départagé les exaequos + winner,_ := tieBreak(bestAlts) + for i, alt := range bestAlts { // départage de tous les exaequos + if alt == winner { + delete(count, winner) + alts = append(alts, winner) + bestAlts = append(bestAlts[:i], bestAlts[i+1:]...) + break + } + } + } + alts = append(alts, bestAlts[0]) + delete(count,bestAlts[0]) + + // au cas où, une autre ébauche + // # on prend la ou les BestAlts du count + // for i,bestAlt := range(bestAlts) { # + // winner, _ := tieBreak(bestAlts) + // for j,bestAltToDelete := range(bestAlts) + // if besAltToDelete == winner { + // keys[i] = -1 # on exclue le winner de la slice pour le prochain tie break + // alts = append(alts, winner) + // break + // } + // } + } + + return alts, nil + } +} func SCFFactory(scf1 func(Profile) ([]Alternative, error), tieBreak func([]Alternative) (Alternative, error)) (scf2 func(Profile) (alt Alternative, err error)) { return func(p Profile) (Alternative, error) { - alts, _ := scf1(p) - alt, _ := tieBreak(alts) + alts, errSCF1 := scf1(p) + if errSCF1 != nil { + return -1, errSCF1 + } + alt, errTB := tieBreak(alts) + if errTB != nil { + return -1, errTB + } + return alt, nil } } -- GitLab