レースゲームの最終順位を決めよう
締め切りが 2018/01/05 10:00 AM なので,その 1 分後に投稿されるように予約
あなたはレースゲームの開発に携わっており、プレイヤーの最終順位を決めるアルゴリズム開発を任されました。
そのゲームは、複数のレースを行い、各レースの順位から最終順位を決めるのですが、順位はそのまま合計したり、算術平均してもおかしな結果になってしまいます。
これは、順位は大小には意味があっても、間隔には意味はないため、1位+2位が3位を意味しないように、足し算引き算が成立しないことに起因します。
そこで、ひとまず「調和平均」を用いて、解決してみることにしました。
求められるプログラムの前提条件は、以下の通りとなります。
・ 標準入力から、各レースの順位(スペース区切り)が、次のようにプレイヤーの人数分複数行送られる
(プレイヤー1) 1回目のレースの順位 2回目のレースの順位 3回目のレースの順位 ...
(プレイヤー2) 1回目のレースの順位 2回目のレースの順位 3回目のレースの順位 ...
:
:
・ 入力されるテキストの行番号をプレイヤーの番号とみなす
・ プレイヤーの人数は、2人以上12人以下とする
・ レースの回数は、2回以上4回以下とする
・ 各レースにおける順位に、重複や欠落はないものとする
・ 最終順位は、プレイヤーごとの全レースの順位の調和平均(Wikipediaへのリンク)が低い順に求める
・ このとき調和平均が同じプレイヤー同士は、同じ順位とし、下の順位に合わせる。
例えば、プレイヤーが3人で、上位2人が同じ調和平均の場合、2位が2名、3位が1名となる
・ 求めた最終順位をプレイヤーの番号順に、改行区切りで標準出力に送ること
そして 以下が、入力と出力例になります。
No. 入力例 出力例
1 2 4 3 4 3
1 1 2 1 1
3 2 1 2 2
4 3 4 3 4
2 1 2 1
2 5 3
3 4 5
4 3 5
5 1 2
上記の1番目の例の場合、各プレイヤーの順位の調和平均は、小数点第5位以下切捨てで、次のようになります。
3.0000
1.1428
1.7142
3.4285
この数字が小さいほど上位となるので、プレイヤーの番号順に 3位 1位 2位 4位となるわけですね。
この最終順位は、直観的にも納得がいく結果ではないでしょうか。
実際のゲームでは順位を 1位→15pts、2位→12pts、3位→10pts という風にポイントに換算し、
ポイントの合計で最終順位を決めるのが一般的です。
ただ順位という数字を通じて、平均にもいろんな種類があり、適材適所で活用できることに気づいていただけたら幸いです。
【問題】
標準入力から、レースゲームにおける各レースの順位が、プレイヤーの人数分複数行送られます。
全レースの順位の調和平均から、各プレイヤーの最終順位を求め、その結果を標準出力に返してください。
====================================================================
f = function(s) {
n = length(s)
score = numeric(n)
for (i in 1:n) {
score[i] = 1/mean(1/as.numeric(unlist(strsplit(s[i], " "))))
}
cat(sprintf("%i\n", rank(score, ties.method="max")), sep="")
}
# f(readLines(file("stdin", "r")))
f(c("2 4 3 4", "1 1 2 1", "3 2 1 2", "4 3 4 3")) # 3,1,2,4
f(c("1 2", "2 5", "3 4", "4 3", "5 1")) # 1,3,5,5,2
最新の画像[もっと見る]
- 算額(その1387) 22時間前
- 算額(その1384) 2日前
- 算額(その1383) 2日前
- 算額(その1382) 2日前
- 算額(その1380) 3日前
- 算額(その1379) 4日前
- 算額(その1378) 4日前
- 算額(その1377) 4日前
- 算額(その1376) 4日前
- 算額(その1375) 4日前
※コメント投稿者のブログIDはブログ作成者のみに通知されます