Go 言語で「基礎プログラミング演習 I 〜100 本ノック中級編」を解いてみる-No.54「最大最小」
はじめに
「基礎プログラミング演習 I 〜100 本ノック中級編」を解いてみます。
取り扱う問題は以下のサイトを引用させていただきました。
検証環境
$ 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 個までとする。なお、データの個数とデータはファイルからリダイレクトで入力させればよいので、入力のためのメッセージは不要である(実行例を参照すること)。
# 【実行例、データファイルは下のリンクから取得せよ】
$ ./knock54 < small.data
最小値 = 128, 最大値 = 962
$ ./knock54 < middle.data
最小値 = 20, 最大値 = 988
$ ./knock54 < large.data
最小値 = 5, 最大値 = 996
回答
knock54.go
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())
}
実行
事前にデータファイルをダウンロードしておきます。
$ 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
$ go run knock54.go < small.data
最小値 = 10, 最大値 = 962
$ go run knock54.go < middle.data
最小値 = 20, 最大値 = 988
$ go run knock54.go < large.data
最小値 = 5, 最大値 = 996
ひとこと
データ量が非常に少ないため、メモリ効率は一切考慮せずゴリ押ししました。
すべてをメモリ上に乗せて処理しています。
ディスカッション
コメント一覧
まだ、コメントがありません