kg-icon
sadservers - "Lhasa": Easy Math
2025-08-24

問題

/home/adminに行番号とスコアの2列を持つscores.txtというファイルがあるので、スコアの合計の平均値を「小数点の右側は正確に2桁を使用」して/home/admin/solutionファイルに入れてください、というものです。

やったこと

VMにbc、Python3、Golang、sqlite3がインストールされているとのことなので、1番使いやすいGoで簡単なスクリプトを書きました。

go
1package main
2
3import (
4	"bufio"
5	"fmt"
6	"math"
7	"os"
8	"strconv"
9	"strings"
10)
11
12func main() {
13	file, err := os.Open("scores.txt")
14	if err != nil {
15		panic(err)
16	}
17	defer file.Close()
18
19	scanner := bufio.NewScanner(file)
20
21	var count int
22	var sum float64 = 0
23
24	for scanner.Scan() {
25		score, err := strconv.ParseFloat(strings.Fields(scanner.Text())[1], 64)
26		if err != nil {
27			panic(err)
28		}
29		sum += score
30		count++
31	}
32
33	if err := scanner.Err(); err != nil {
34		panic(err)
35	}
36
37	average := sum / float64(count)
38	ans := math.Trunc(average*100) / 100
39
40	out, err := os.Create("solution")
41	if err != nil {
42		panic(err)
43	}
44
45	defer out.Close()
46
47	fmt.Fprintf(out, "%.2f\n", ans)
48}

ポイントは以下で、平均値に100をかけて「2桁」の小数点を残した上で、他は全て切り捨てし、それを100で割って正確に2桁残すようにしています。

go
1ans := math.Trunc(average*100) / 100

また、 33.1のような場合は 33.10のように0埋めをする必要があるので"%.2f\n"で処理するようにしました。

go
1fmt.Fprintf(out, "%.2f\n", ans)

ansの時点で小数第2位までしか存在しないことが確定しているため、小数第3位での四捨五入は行われません。

なので、小数第2位が0の場合は0が埋められ、それ以外の場合はそのまま出力されますね。

これで無事パスしました。