/home/adminに行番号とスコアの2列を持つscores.txtというファイルがあるので、スコアの合計の平均値を「小数点の右側は正確に2桁を使用」して/home/admin/solutionファイルに入れてください、というものです。
VMにbc、Python3、Golang、sqlite3がインストールされているとのことなので、1番使いやすい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桁残すようにしています。
1ans := math.Trunc(average*100) / 100また、 33.1のような場合は 33.10のように0埋めをする必要があるので"%.2f\n"で処理するようにしました。
1fmt.Fprintf(out, "%.2f\n", ans)ansの時点で小数第2位までしか存在しないことが確定しているため、小数第3位での四捨五入は行われません。
なので、小数第2位が0の場合は0が埋められ、それ以外の場合はそのまま出力されますね。
これで無事パスしました。