実質の参加者数は? (EPOCH@まつやま - 本選 5)
はじめに
前回までに EPOCH@まつやまの例題として以下の問題を解いてきました。
- AWK Users JP :: EPOCH@まつやまの例題を解いてみる
- AWK Users JP :: 友愛数 (EPOCH@まつやま - 本選 1)
- AWK Users JP :: 素因数分解 (EPOCH@まつやま - 本選 2)
- AWK Users JP :: 2 人の相性度は? (EPOCH@まつやま - 本選 3)
- AWK Users JP :: 欠席者を探せ (EPOCH@まつやま - 本選 4)
問題には傾向と対策というものがあり、「EPOCH@まつやま」では基本的な部分を押さえた上で複合的な処理ができるか、考えることができるかを試すような良問が多かったと思います。 問題の解答を考えてみるだけではなく、実際に解いてみると傾向と対策がはっきり分かってきます。 このあたりは学校の入試の傾向と対策と同じだと言えるでしょう。
さて、「EPOCH@まつやま」の問題を解くのも今回を最後にしたいと思います。 本選第 1 ステージの問題 (PDF) の 5 問目になります。
方針
問題の日本語が長いのですが、考えなければならないのは、以下のようなことでしょうか。
- 何行目に何がどういうフォーマットで書かれてあるのか。
- フィールドの分割 (awk の場合は自動ですね) をどうするか。
- 集計をどのようにするか。あとで使いまわすことを考えなければならないのか。
ここでは各フィールドの要素を持つ配列をインクリメントすることでカウントを行い、1 以上であれば 1 人としてカウントしています。 すなわち再利用は念頭に入れていません。
作成
難しいものではないので、以下のように書けます。
#! /usr/local/bin/gawk -f
# epoch_problem_H5.awk
# 実質の参加者数は?
# usage: gawk -f epoch_problem_H5.awk file
# 参加登録人数
NR == 1 {
num = $0;
}
# 1 日目
NR == 2 {
for (i = 1; i <= NF; i++) {
is_entry[$i]++;
}
}
# 2 日目
NR == 3 {
for (i = 1; i <= NF; i++) {
is_entry[$i]++;
}
for (i = 1; i <= num; i++) {
if (is_entry[i] > 0) {
count++;
}
}
print count;
}
特に難しいところはないでしょう。
チェック
動作確認をしてみます。
$ cat epoch_problem_H5.txt 10 2 7 4 8 10 1 2 1 3 6 7 9 8 4 $ gawk -f epoch_problem_H5.awk epoch_problem_H5.txt 9
実行例のとおりに動作していることが確認できました。
おわりに
今回「方針」「作成」「チェック」と書いたのは、いわゆる PDCA です。 最近、複雑なことをやる場合はもちろん、比較的簡単なことを行うのも PDCA のサイクルで Wiki などに記載することが多くなりました。 PDCA じゃなくて今やアジャイルの方がメジャーなのかもしれませんが、ものづくり大国日本を作り上げた製造業のこうしたやり方は、プログラムの分野でも十分に使えます。
「EPOCH@まつやま」に参加される方も試してみてはいかがでしょうか。
え、「アクション」がない? それはあなたが作るのです。




