CodeIQ:平均値と中央値

私自身が表題の問題を解いた時のプログラムについて解説します。
問題の詳細は「平均値と中央値」(CodeIQ)を参照してください。

問題の概要

問題を引用します。
【問題】
息抜き時間でできる、簡単なプログラムを書いてみよう!
改行区切りの文字列の各行(最大行数30)は、半角数字のみの整数(最大桁数8)になっています。
この各行の平均値と中央値を求めて下さい。小数点以下は1桁まで出力するものとします(2桁目以降は四捨五入、小数点以下がない場合は0埋め)。最初の行が平均値、次の行が中央値を出力するものとします。

// 入力例
1
23
8

// 出力例
10.7
8.0

私のプログラム

Rubyで解答しています。

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
#!/usr/bin/ruby
 
def ave(inputs)
    sum = inputs.reduce(:+)
    return (sum.to_f / inputs.size).round(1)
end
 
def med(inputs)
    sorted = inputs.sort
    if inputs.size % 2 == 1 then return sorted[inputs.size/2].to_f.round(1)
    else return ((sorted[inputs.size/2] + sorted[inputs.size/2-1]).to_f/2).round(1)
    end
end
 
# main
inputs = []
 
while line = gets
    line.strip!
    next if line.empty?
 
    inputs << line.to_i
end
 
p ave(inputs)
p med(inputs)

解説

息抜きとある通り、簡単な問題です。

考え方

平均値についてはいうことはないでしょう。全部足して要素数で割るだけです。
中央値はソートして真ん中の値を選びます。要素数が偶数の時は真ん中の2つの値の平均になります。

main

入力値を取得し数値に変換して配列inputsに保持します。
ave()で平均値、med()で中央値を求めて印字します。

ave(inputs)

全部足して要素数で割って、小数点以下第二位を四捨五入して返却します。

med(inputs)

ソートして、要素数が奇数なら中央の値、要素数が偶数なら中央2個の値の平均値の小数点以下第二位を四捨五入して返します。

雑感

中央値で要素数が偶数の時どうするかを忘れていたので調べました。
Rubyのround()は四捨五入する桁を指定できるので便利ですね。