Builder ranking.
Combines count + box ranking (1:1). This balances quantity and quality, somewhat.
This commit is contained in:
parent
708ff344a5
commit
bab1a538eb
1
.gitignore
vendored
1
.gitignore
vendored
@ -1 +1,2 @@
|
|||||||
itb-ranking
|
itb-ranking
|
||||||
|
*.json
|
||||||
|
99
main.go
99
main.go
@ -89,6 +89,17 @@ type Player struct {
|
|||||||
}
|
}
|
||||||
var players []Player
|
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() {
|
func main() {
|
||||||
if len(os.Args) < 1 {
|
if len(os.Args) < 1 {
|
||||||
log.Fatal("Not enough arguments: sqlite_file")
|
log.Fatal("Not enough arguments: sqlite_file")
|
||||||
@ -537,6 +548,94 @@ func main() {
|
|||||||
of.Write(j)
|
of.Write(j)
|
||||||
of.Close();
|
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()
|
defer db.Close()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4,6 +4,7 @@ ranks = {}
|
|||||||
|
|
||||||
ranks.player = {}
|
ranks.player = {}
|
||||||
ranks.boxes = {}
|
ranks.boxes = {}
|
||||||
|
ranks.builder = {}
|
||||||
|
|
||||||
local wp = minetest.get_worldpath()
|
local wp = minetest.get_worldpath()
|
||||||
|
|
||||||
@ -41,6 +42,7 @@ end
|
|||||||
ranks.fetch = function()
|
ranks.fetch = function()
|
||||||
ranks.player = fetch_file(wp .. "/top_players.json", "r")
|
ranks.player = fetch_file(wp .. "/top_players.json", "r")
|
||||||
ranks.box = fetch_file(wp .. "/top_boxes.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)
|
minetest.after(300, ranks.fetch)
|
||||||
end
|
end
|
||||||
|
Loading…
x
Reference in New Issue
Block a user