Go 言語で「基礎プログラミング演習 I 〜100 本ノック中級編」を解いてみる-No.54「最大最小」

はじめに

「基礎プログラミング演習 I 〜100 本ノック中級編」を解いてみます。

取り扱う問題は以下のサイトを引用させていただきました。

検証環境

1
2
3
4
5
6
7
8
9
$ uname -moi
x86_64 unknown GNU/Linux

$ head -n 2 /etc/os-release
PRETTY_NAME="Debian GNU/Linux 10 (buster)"
NAME="Debian GNU/Linux"

$ go version | head -n 1
go version go1.16.3 linux/amd64

問題

No. 54 最大最小

まずデータの個数を入力させ、次にデータの個数だけ整数値を入力させる。この入力データの中で最大値と最小値を求め表示するプログラムを作成せよ。データの個数は 100 個までとする。なお、データの個数とデータはファイルからリダイレクトで入力させればよいので、入力のためのメッセージは不要である(実行例を参照すること)。

1
2
3
4
5
6
7
8
9
# 【実行例、データファイルは下のリンクから取得せよ】
$ ./knock54 < small.data
最小値 = 128, 最大値 = 962

$ ./knock54 < middle.data
最小値 = 20, 最大値 = 988

$ ./knock54 < large.data
最小値 = 5, 最大値 = 996

回答

knock54.go

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
package main

import (
	"fmt"
	"io/ioutil"
	"log"
	"os"
	"strconv"
	"strings"

	"github.com/wesovilabs/koazee"
)

func main() {
	data, err := ioutil.ReadAll(os.Stdin)

	if err != nil {
		log.Fatal(err)
	}

	nums := koazee.StreamOf(
		strings.Split(string(data), "\n"),
	).Filter(func(val string) bool {
		return len(val) > 0
	}).Sort(func(v1, v2 string) int {
		n1, _ := strconv.Atoi(v1)
		n2, _ := strconv.Atoi(v2)
		return n1 - n2
	})

	fmt.Printf("最小値 = %v, 最大値 = %v\n", nums.First().Val(), nums.Last().Val())
}

実行

事前にデータファイルをダウンロードしておきます。

1
2
3
$ curl -O http://www.cc.kyoto-su.ac.jp/~mmina/bp1/small.data
$ curl -O http://www.cc.kyoto-su.ac.jp/~mmina/bp1/middle.data
$ curl -O http://www.cc.kyoto-su.ac.jp/~mmina/bp1/large.data
1
2
3
4
5
6
7
8
$ go run knock54.go < small.data
最小値 = 10, 最大値 = 962

$ go run knock54.go < middle.data
最小値 = 20, 最大値 = 988

$ go run knock54.go < large.data
最小値 = 5, 最大値 = 996

ひとこと

データ量が非常に少ないため、メモリ効率は一切考慮せずゴリ押ししました。

すべてをメモリ上に乗せて処理しています。