1// Package difficulty defines PuzzleTea's shared Elo difficulty contract.2package difficulty34import "fmt"56type Elo int78const (9 MinElo Elo = 010 SoftCapElo Elo = 300011)1213type Confidence string1415const (16 ConfidenceLow Confidence = "low"17 ConfidenceMedium Confidence = "medium"18 ConfidenceHigh Confidence = "high"19)2021type Metrics map[string]float642223type Report struct {24 TargetElo Elo25 ActualElo Elo26 Confidence Confidence27 Metrics Metrics28}2930func ValidateElo(elo Elo) error {31 if elo < MinElo || elo > SoftCapElo {32 return fmt.Errorf("difficulty elo %d outside supported range %d..%d", elo, MinElo, SoftCapElo)33 }34 return nil35}3637func ClampElo(elo Elo) Elo {38 if elo < MinElo {39 return MinElo40 }41 if elo > SoftCapElo {42 return SoftCapElo43 }44 return elo45}4647func Score01(elo Elo) float64 {48 elo = ClampElo(elo)49 return float64(elo-MinElo) / float64(SoftCapElo-MinElo)50}