New settings to only count bad submissions
This commit is contained in:
parent
b887288c78
commit
cd73622cae
9 changed files with 61 additions and 18 deletions
|
|
@ -15,17 +15,24 @@ var SubmissionCostBase = 0.5
|
|||
// SubmissionUniqueness don't count multiple times identical tries.
|
||||
var SubmissionUniqueness = false
|
||||
|
||||
// CountOnlyNotGoodTries don't count as a try when one good response is given at least.
|
||||
var CountOnlyNotGoodTries = false
|
||||
|
||||
func exoptsQuery(whereExo string) string {
|
||||
tries_table := "exercice_tries"
|
||||
if SubmissionUniqueness {
|
||||
tries_table = "exercice_distinct_tries"
|
||||
}
|
||||
|
||||
if CountOnlyNotGoodTries {
|
||||
tries_table += "_notgood"
|
||||
}
|
||||
|
||||
return `SELECT S.id_team, S.time, E.gain AS points, coeff, S.reason, S.id_exercice FROM (
|
||||
SELECT id_team, id_exercice, MIN(time) AS time, ` + fmt.Sprintf("%f", FirstBlood) + ` AS coeff, "First blood" AS reason FROM exercice_solved GROUP BY id_exercice UNION
|
||||
SELECT id_team, id_exercice, time, coefficient AS coeff, "Validation" AS reason FROM exercice_solved
|
||||
) S INNER JOIN exercices E ON S.id_exercice = E.id_exercice ` + whereExo + ` UNION ALL
|
||||
SELECT id_team, MAX(time) AS time, (FLOOR(COUNT(*)/10 - 1) * (FLOOR(COUNT(*)/10)))/0.2 + (FLOOR(COUNT(*)/10) * (COUNT(*)%10)) AS points, ` + fmt.Sprintf("%f", SubmissionCostBase * -1) + ` AS coeff, "Tries" AS reason, id_exercice FROM ` + tries_table + ` S ` + whereExo + ` GROUP BY id_exercice, id_team`
|
||||
) S INNER JOIN exercices E ON S.id_exercice = E.id_exercice ` + whereExo + ` UNION ALL
|
||||
SELECT id_team, MAX(time) AS time, (FLOOR(COUNT(*)/10 - 1) * (FLOOR(COUNT(*)/10)))/0.2 + (FLOOR(COUNT(*)/10) * (COUNT(*)%10)) AS points, ` + fmt.Sprintf("%f", SubmissionCostBase*-1) + ` AS coeff, "Tries" AS reason, id_exercice FROM ` + tries_table + ` S ` + whereExo + ` GROUP BY id_exercice, id_team`
|
||||
}
|
||||
|
||||
func teamptsQuery() string {
|
||||
|
|
@ -59,11 +66,11 @@ func (t Team) ScoreGrid() (grid []map[string]interface{}, err error) {
|
|||
}
|
||||
|
||||
grid = append(grid, map[string]interface{}{
|
||||
"reason": reason,
|
||||
"reason": reason,
|
||||
"id_exercice": exercice,
|
||||
"time": time,
|
||||
"points": points,
|
||||
"coeff": coeff,
|
||||
"time": time,
|
||||
"points": points,
|
||||
"coeff": coeff,
|
||||
})
|
||||
}
|
||||
}
|
||||
|
|
@ -75,7 +82,7 @@ func (t Team) ScoreGrid() (grid []map[string]interface{}, err error) {
|
|||
// EstimateGain calculates the amount of point the Team has (or could have, if not already solved) won.
|
||||
func (e Exercice) EstimateGain(t Team, solved bool) (float64, error) {
|
||||
var pts float64
|
||||
err := DBQueryRow("SELECT SUM(A.points * A.coeff) AS score FROM (" + exoptsQuery("WHERE S.id_team = ? AND S.id_exercice = ?") + ") A GROUP BY id_team", t.Id, e.Id, t.Id, e.Id).Scan(&pts)
|
||||
err := DBQueryRow("SELECT SUM(A.points * A.coeff) AS score FROM ("+exoptsQuery("WHERE S.id_team = ? AND S.id_exercice = ?")+") A GROUP BY id_team", t.Id, e.Id, t.Id, e.Id).Scan(&pts)
|
||||
if solved {
|
||||
return pts, err
|
||||
} else {
|
||||
|
|
@ -127,7 +134,6 @@ func GetRank() (map[int64]int, error) {
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
// Attempts
|
||||
|
||||
// GetTries retrieves all attempts made by the matching Team or challenge (both can be nil to not filter).
|
||||
|
|
|
|||
Reference in a new issue