jollheef / henhouse

Scoreboard for jeopardy-style CTFs

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Не описана формула пересчёта очков

DEIGHD opened this issue · comments

Нет описания формулы пересчёта очков для заданий.

А что тебе из кода не понятно?

Влияет этот участок конфигурационного файла:

[TaskPrice]
# use non linear function for calculate teams base
use_non_linear = false
# for correct work with small amount of teams
use_teams_base = false
teams_base = 20
# 500 if percent of solve less than value
p500 = 10
p400 = 15
p300 = 30
# 200 if percent of solve less than value
p200 = 50
# other 100

Само значения ценности таска вычисляется:

func (g *Game) taskPrice(database *sql.DB, taskID int) (price int, err error) {

	count, err := db.GetSolvedCount(database, taskID)

	fprice := float64(count) / g.TaskPrice.TeamsBase

	if fprice <= g.TaskPrice.P500 {
		price = 500
	} else if fprice <= g.TaskPrice.P400 {
		price = 400
	} else if fprice <= g.TaskPrice.P300 {
		price = 300
	} else if fprice <= g.TaskPrice.P200 {
		price = 200
	} else {
		price = 100
	}

	return
}

Базовое значение количества команд равно либо количеству команд, либо заданному значению teams_base при use_teams_base = true в конфигурационном файле, либо в случае use_non_linear = true:

func CalcTeamsBase(database *sql.DB) (z float64, err error) {

	teams, err := db.GetTeams(database)
	if err != nil {
		return
	}

	flags, err := db.GetFlags(database)
	if err != nil {
		return
	}

	k := []int{}
	for _, t := range teams {
		solvedCount := 0
		for _, f := range flags {
			if f.TeamID == t.ID {
				solvedCount++
			}
		}
		k = append(k, solvedCount)
	}

	max := 1
	for _, ki := range k {
		if ki > max {
			max = ki
		}
	}

	for _, ki := range k {
		z += math.Sqrt(float64(ki) / float64(max))
	}

	if z < 21 {
		z = 21
	}

	return
}