2017年9月24日~26日 プログラミングコンテストを実施しました。
今回はオープニング開催ということで試験的な意味合いもあり、参加いただいた学生の皆さんにアンケートも実施しました。

様々なご意見をいただきましたが、1番の課題は、実施スケジュールのスタート時間が合わなくて参加できないという意見。今後は期間を設定し、いつでも都合の良い時間でチャレンジできるように仕様を変更したいと思います。

次回開催の際はまた改めてご案内させていただきます。ご参加いただいた皆さん、ありがとうございました!!

スポンサーリンク



今回のコンテストの問題と解答レビュー

<初級問題>

タイトル あいさつプログラム
コンテストの趣旨・説明 コンソールからの入力とコンソールへの出力、条件分岐について理解を深める。
制限時間 30分
言語 C言語, Python, Ruby, Java
問題 下記を順番通りに実行するプログラムを作成しなさい。

①コンソールで名前を入力し、Enterを押すと”Hello, 名前 !”とコンソールに出力する。「名前」にはコンソールから入力した文字列が入る。
②コンソールに「Are you a man or woman ?」と出力する。
③コンソールから入力した文字列に応じて出力する文字列を変える。

man, woman⇒OK !
man, woman以外⇒I cannot understand.

難易度 ★ 初級

レビュー:
Hello, worldプログラムを少し改造した問題+文字列比較処理に対応できるかどうかを見る意図で出題しました。

文字列比較では、比較元と比較先を何とするか、そして比較するときの方法として何を選択するのか?も重要となります。==演算子やequals()関数などを使うとコードを読んで直感的に理解しやすいですが、strcmp()関数の戻り値を比較する場合は直感的には理解しづらいです。こういう場合は一言、何をする処理なのかをコメントしておくとよいでしょう。

例えば以下のようなコメントです。(Pythonの場合)
print(“Hello World”) // Hello Worldと画面に出力する

<中級問題>

タイトル 眼科の開業時間
コンテストの趣旨・説明 複雑な条件分岐に対応できるようになる。
制限時間 60分
言語 C言語, Python, Ruby, Java
問題 曜日と、午前、午後、夜間のいずれかをコンソールから入力し、眼科が開いているか、休診であるかを表示するプログラムを作成しなさい。
開いているか、休診であるかは次の表に従うとする。曜日の入力と午前or午後or夜間の入力は、次のようなガイドを表示して数値で行う。>0=月曜、1=火曜、2=水曜、3=木曜、4=金曜、5=土曜、6=日曜
>0=午前、1=午後、2=夜間

月曜 火曜 水曜 木曜 金曜 土曜 日曜
午前 休診 休診 休診 休診
午後 休診 休診
夜間 休診 休診 休診 休診
難易度 ★★★ 中級

レビュー:
休診表を扱うプログラムを組むときに、配列の概念を活用できるかをみるという意図で出題しました。
曜日(月~日)と休診時間(午前、午後、夜間)を2次元配列で表現することを想定していました。曜日と休診時間は文字列ではなく、数値で入力するため配列の添え字にも使えます。
例えば、1を休診、0を開診として以下の2次元配列で表現することができます(Pythonの場合、リスト)。このようにデータ化しておくと、休診時間が変わったときにどこを変更すればよいかが明確です。

C言語の場合
int kyushin[][] = {
{1, 0, 0}, //月
{0, 0, 1}, //火
{1, 0, 0}, //水
{0, 0, 1}, //木
{1, 0, 0}, //金
{0, 1, 1}, //土
{1, 1, 1} //日
};

Pythonの場合
kyushin = [[0] * 3 for i in range(7)] //2次元リスト初期化
kyushin[0][0] = 1
kyushin[1][2] = 1
kyushin[2][0] = 1
kyushin[3][2] = 1
kyushin[4][0] = 1
kyushin[5][1] = 1
kyushin[5][2] = 1
kyushin[6][0] = 1
kyushin[6][1] = 1
kyushin[6][2] = 1

<上級問題>

タイトル 紹介の連鎖
コンテストの趣旨・説明 数学的問題をプログラムを使って解決する力を身に付ける。
制限時間 60分
言語 C言語, Python, Ruby, Java
問題 1つの商品をいろんな人に紹介するとき、どのように広がっていくのかをシミュレーションする。
①1人が4人の知り合いや友達などにAという商品を紹介するとします。紹介者と被紹介者の1+4=5人を1単位として、これを「チーム」と呼ぶ。
②1人から始まって1チームを作る期間は3か月以内とする。つまり、3か月以内に4人の知り合いや友達に商品を紹介し、買ってもらうことになる。

必ず3か月以内にチームができると仮定し、Xか月後にはチームが何個できているのか?を求めるプログラムを作りなさい。
プログラムでは、コンソールからXの値を入力させ、Xか月後にできているチーム数をコンソールに表示させる。

下の図で言うと、A, B, C, D, Eのチームができるまでが3か月、B, B1, B2, B3, B4のチームとC, C1, C2, C3, C4のチーム、Dを含むチーム、Eを含むチームができるまでが6か月となる。

A—B ———————-B1
 ∟C———–C1  ∟B2
 ∟D–略   ∟ C2    ∟B3
 ∟E–略 ∟ C3    ∟B4
                  ∟ C4
難易度 ★★★★ 上級

レビュー:
マーケティングにおいては、紹介の連鎖が大事になってきます。そういった現実的な部分と数学を絡めた問題として出題しました。
重要なのは、問題の中から「べき乗」を読み取れるかどうかです。日本語で書かれている問題であっても、それを抽象化することでよりシンプルにすることができます。今回の問題は3か月ごとに5のべき乗でチーム数が増えていくことになりますので、シンプルな回答例としては、以下のようなものがあります。

(1) Rubyの場合
x = int(input())//3
print (5**x)

(2) C言語の場合
#include <stdio.h>
#include <math.h>
int main(){
int num;
scanf(“%d”,&num);
printf(“%d”,(int)(pow(5,num/3));
return 0;
}

また、プログラム全体の中から部分を取って部品化することも重要です。特に大きなプログラムを1つの関数だけで作ることはデバッグを考慮すると現実的ではありません。以下は回答例の抜粋ですが、数字かどうかをチェックする機能を部品化していて良いと思います。

Pythonの場合
def is_int(num_str):
try:
int(num_str)
return True
except ValueError:
return False

出題者:吉田 純

フリーランスエンジニア・テクニカルライター・教育ベンチャー企業共同経営者
プログラミング、ライティングなどを行う一方、認識技術という新技術を応用活用した新しい組織づくりにも取り組んでいる。

■エンジニア実績
・携帯電話UI仕様検討
・組込みLinuxソフト開発
・マイコンソフト(医療系)開発
・I2Cドライバ開発
・Linuxドライバ開発
・ストリーミング/Webサーバ構築、メンテナンス
・データベース(SQL Server, HBase)
・各種テスト(単体、結合、システム)
・CLIP STUDIOフィルタプラグインのカスタマイズ
・ソフト開発プロジェクトのLineHead(進行管理・タスク管理)業務
・WordPressでのHP更新
・スクレイピングソフト開発(Google Apps Script)
・HPデザイン作成(html/css)

■ スキル
・Python
・C
・C++
・Ruby
・SQL Server
・Linux、Apache
・HTML/CSS
・JavaScript
・Google Apps Script