Builder ranking.

Combines count + box ranking (1:1).

This balances quantity and quality, somewhat.
This commit is contained in:
Auke Kok 2017-11-05 22:55:17 -08:00
parent 708ff344a5
commit bab1a538eb
3 changed files with 102 additions and 0 deletions

1
.gitignore vendored
View File

@ -1 +1,2 @@
itb-ranking
*.json

99
main.go
View File

@ -89,6 +89,17 @@ type Player struct {
}
var players []Player
type Builder struct {
player_id int
name string
combined float64
box_count int
box_count_rank float64
box_rank_avg float64
box_rank_avg_rank float64
}
var builders []Builder
func main() {
if len(os.Args) < 1 {
log.Fatal("Not enough arguments: sqlite_file")
@ -537,6 +548,94 @@ func main() {
of.Write(j)
of.Close();
//
// BUILDER RANKING
//
for i := range boxes {
found := false
for b := range builders {
if builders[b].name == boxes[i].builder {
found = true
s := builders[b].box_rank_avg * float64(builders[b].box_count) + boxes[i].combined
builders[b].box_count += 1
builders[b].box_rank_avg = s / float64(builders[b].box_count)
break
}
}
if found {
continue
}
if (boxes[i].builder == "sofar") || (boxes[i].builder == "nore") {
continue
}
var n Builder
n.name = boxes[i].builder
n.box_count = 1
n.box_rank_avg = boxes[i].combined
builders = append(builders, n)
}
// rank box count
sort.Slice(builders, func (a, b int) bool { return builders[a].box_count > builders[b].box_count })
step = 1.0 / float64(len(builders))
lastrank = 1.0
last = 0
for i := range builders {
c := builders[i].box_count
if c == last {
builders[i].box_count_rank = lastrank
} else {
last = c
lastrank = 1.0 - step * float64(i)
builders[i].box_count_rank = lastrank
}
}
// rank boxes scoring
sort.Slice(builders, func (a, b int) bool { return builders[a].box_rank_avg > builders[b].box_rank_avg })
step = 1.0 / float64(len(builders))
lastrank = 1.0
lastf = .0
for i := range builders {
c := builders[i].box_rank_avg
if c == lastf {
builders[i].box_rank_avg_rank = lastrank
} else {
lastf = c
lastrank = 1.0 - step * float64(i)
builders[i].box_rank_avg_rank = lastrank
}
}
// combine
for i := range builders {
builders[i].combined =
builders[i].box_rank_avg_rank +
builders[i].box_count_rank
}
sort.Slice(builders, func (a, b int) bool { return builders[a].combined > builders[b].combined })
var builder_topranks = make(map[string]string)
for i := range builders {
if i > 30 {
break
}
builder_topranks[fmt.Sprintf("%v", i + 1)] = fmt.Sprintf("%v", builders[i].name)
}
j, err = json.Marshal(builder_topranks)
if err != nil {
log.Fatal(err)
}
// write to disc!
of, err = os.Create("top_builders.json")
if err != nil {
log.Fatal(err)
}
of.Write(j)
of.Close();
defer db.Close()
}

View File

@ -4,6 +4,7 @@ ranks = {}
ranks.player = {}
ranks.boxes = {}
ranks.builder = {}
local wp = minetest.get_worldpath()
@ -41,6 +42,7 @@ end
ranks.fetch = function()
ranks.player = fetch_file(wp .. "/top_players.json", "r")
ranks.box = fetch_file(wp .. "/top_boxes.json", "r")
ranks.builder = fetch_file(wp .. "/top_builders.json", "r")
minetest.after(300, ranks.fetch)
end