package tierscore import ( "fmt" "strings" "github.com/joint-online-judge/JOJ3/internal/stage" ) func (*TierScore) Run(results []stage.ExecutorResult, confAny any) ( []stage.ParserResult, bool, error, ) { conf, err := stage.DecodeConf[Conf](confAny) if err != nil { return nil, true, err } res := make([]stage.ParserResult, 0, len(results)) forceQuit := false for _, result := range results { totalScore := 0 var commentBuilder strings.Builder for i, tier := range conf.Tiers { conditionsMet := true var conditionDesc []string if tier.TimeLessThan > 0 { if result.Time < tier.TimeLessThan { conditionDesc = append( conditionDesc, fmt.Sprintf( "Time < `%d ms`", tier.TimeLessThan/1e6, ), ) } else { conditionsMet = false } } if tier.MemoryLessThan > 0 { if result.Memory < tier.MemoryLessThan { conditionDesc = append( conditionDesc, fmt.Sprintf( "Memory < `%.2f MiB`", float64(tier.MemoryLessThan)/(1024*1024), ), ) } else { conditionsMet = false } } if conditionsMet { totalScore += tier.Score fmt.Fprintf( &commentBuilder, "Tier %d: +%d (meets %s)\n", i, tier.Score, strings.Join(conditionDesc, " and "), ) } else { var required []string if tier.TimeLessThan > 0 { required = append( required, fmt.Sprintf( "Time < `%d ms`", tier.TimeLessThan/1e6, ), ) } if tier.MemoryLessThan > 0 { required = append( required, fmt.Sprintf( "Memory < `%.2f MiB`", float64(tier.MemoryLessThan)/(1024*1024), ), ) } fmt.Fprintf( &commentBuilder, "Tier %d: +0 (requires %s)\n", i+1, strings.Join(required, " and "), ) } } fmt.Fprintf(&commentBuilder, "Final score: %d", totalScore) res = append(res, stage.ParserResult{ Score: totalScore, Comment: commentBuilder.String(), }) } return res, forceQuit, nil }