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

ひとこと

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

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

Posted by genzouw