2月9日~12日に開催した、エンプラ主催・プログラミングコンテンストに参加いただいた皆さま、ありがとうございました。たくさんの応募感謝申し上げます。

今回、各問題ごと優勝者にはAmazonギフト券をプレゼントさせていただきます。

<各問題の優勝者>

【初級問題】Amazonギフト券2000円
大阪大学工学部電子情報工学科 3年  BM様
【中級問題】Amazonギフト券3000円
東京理科大学 理工学部 情報科学科  1年  TM様
【上級問題】Amazonギフト券5000円
千葉大学 融合理工学府 数学情報科学専攻 3年  YW様

 

優勝された皆さん、おめでとうございます!!

では、コンテストの問題の振り返りと解答レビューを行いたいと思います。

スポンサーリンク



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

<初級問題>

タイトル 文字列の組み合わせを作成しよう
コンテストの趣旨・説明 プログラミング言語の文法をきちんと理解できているかを問う問題です。外部からの入力や、文字列の増減はありません。与えられた条件で回答できるか考えて下さい。繰り返し処理などの基本的な文法を理解できていれば回答できるので、是非チャレンジしてみて下さい。
制限時間 30分
言語 C C++ Java C# PHP Ruby Python
問題 アルファベット「A・B・C」を1つずつ組み合わた文字列、全ての組み合わせをコンソール上に表示して下さい。
– インプット特になし(プログラムで文字列を定義してください)
– アウトプット(コンソール上に出力して下さい)ABCACBBACBCACABCBA
難易度 ★ 初級

☆☆☆レビュー☆☆☆
どのプログラミング言語においても、条件分岐・繰り返し処理は基本です。そうした基本が理解できているかどうか、自分なりにプログラムに落とし込めるかを見る意図で出題しました。
ただし、必ずしも条件分岐や繰り返しを使わなくともこの問題は回答できます。問題の抜け道的な意味で、あえて入力は変更しなくて良いという条件を付与しました。プログラムをつくるときは、何が目的なのか?どういった手段が効率的なのか?といった、プログラム以前の部分も注意深く確認しましょう。
例えばPythonプログラムであれば、これだけで十分でした。(あくまで今回の問題に限って、という条件付きです)
print(“ABC”)print(“ACB”)print(“BAC”)print(“BCA”)print(“CAB”)print(“CBA”)

<中級問題>

タイトル プログラマー共通問題!?FizzBuzz問題にチャレンジしよう
コンテストの趣旨・説明 文字列の標準入力・出力 / 関数化による処理の分離 / 繰り返し処理 / 分岐 といったプログラミングに必要な総合的な要素を理解しているか問う問題です。
制限時間  60分
言語  C C++ Java C# PHP Ruby Python
問題  世の中でプログラミングをしている方ならだれしも知っているような問題があります。その1つがFizzBuzz問題です。FizzBuzz問題は、以下の仕様になります。- 1, 2, ….と順番に数字をを出力する- ただし、3で割り切れる場合は「Fizz」を出力する- ただし、5で割り切れる場合は「Buzz」を出力する- ただし、3でも5でも割り切れる場合は、「Fizz Buzz」を出力する
FizzBuzz問題の回答をするプログラムを作成して下さい。ただし、プログラミング言語の総合力を試すために、下記の条件を守ってください。
– インプットコンソールからFizzBuzz問題の最大値を受け取って下さい。(最大値の制限は設けませんが、問題では100までの計算ができればOKです)
例:input max number : 30
– アウトプット(コンソール上に出力して下さい)12Fizz4BuzzFizz7…(略)14FizzBuzz1617…(略)
– 制限事項整数値を1つ受け取って、FizzBuzz問題の回答となる文字列を返す関数(メソッド)を作成して下さい。プログラムでは、その関数を使って回答をしてください。
関数名は自由につけて構いません。
例:Javaの場合public string getFizzBuzzText(int number) { /*処理*/ }
難易度  ★★★ 中級

レビュー☆☆☆
プログラミング初学者向けの問題として有名な、FizzBuzz問題でした。自分一人で開発する場合でも、チームで開発する場合でも、程度が大きくなればなるほど、プログラムの管理が難しくなってきます。そこで、ファイルを分けたり、機能をメソッドとして切り出すことが必要になってきます。比較すると以下のようになります。
[メイン関数に処理をまとめた場合]- ◯:処理がすべて1ファイル・1関数に含まれるので処理が理解しやすい- ×:処理が増えてくると、1つのファイルが肥大化する- ×:同じ処理や似た処理がなんども出現して、修正が難しい- ×:テストが難しい(今回の問題では、データの入力・計算・表示が同時に行う必要があります)
[ファイルやメソッドを分割した場合]- ◯:処理が増えても、ファイルごとに機能を制限して、肥大化を防げる- ◯:基本的には、同じ処理は共通メソッドになるため、修正は1箇所ですむ- ×:ファイルやメソッドに分割するテクニックや、仕組みの理解が必要
例えばJavaで記述すると下記のようになります。
static String getFizzBuzzText(int number) {    if( number%15 == 0 ) {        return “FizzBuzz”;    } else if( number%3 == 0 ) {        return “Fizz”;    } else if( number%5 == 0 ) {        return “Buzz”;    } else {        return String.valueOf(number);    }}

<上級問題>

タイトル 与えられたインプットとアウトプットの関係は???
コンテストの趣旨・説明 与えられた問題に、どういった法則があるか見抜けるかが最大のポイントです。数学的な直感も必要になりますが、きちんとプログラミングができれば、組み合わせからいろいろな計算を行って、パターンを見ぬくこともできます。
制限時間 60分
言語 C C++ Java C# PHP Ruby Python
問題 コンソール上で入力された文字列を整数型配列に変換し、アウトプット例のような整数配列を表示するプログラムを作成して下さい。インプットとアウトプットがどういった法則になっているか、よーく考えてみて下さい。
– インプット5, 8, 13, 19, 7
– アウトプット13832, 8645, 5320, 3640, 9880
難易度 ★★★★★ 上級

レビュー☆☆☆
問題の法則ですが、インプットで与えられた数値の内4つ抜き出した積を並べたものになっています。例えば、先頭の13832は、インプットの数字の先頭を除いた4つの数の積になっています。    13832 = 8 x 13 x 19 x 7    8645  = 5 x 13 x 19 x 7     …
ですので、インプットされた数値の中から順に4つを取り出して数値の積を求めていくプログラムを作成していきます。標準入力の部分は省略しますが、プログラムのメイン部分は下記の用になります。
Rubyの場合
input = [5, 8, 13, 19, 7]output = [](0..input.count-1).each do |i|  input_copy = input.clone  input_copy.delete_at(i)  output << input_copy.inject(:*)end
p output

出題者:田中 智章

学生時代からプログラミングを始める。SIerでキャリアを始め、現職はWebベンチャーでBtoBサービスの開発に携わる。学術的な部分では、統計処理や画像処理を得意としている。エンジニアとしてサービス開発に携わる一方、新卒や若手向けのプログラミング教育などにも関わっている。

■エンジニア実績・金融系帳票自動分類システムの開発・製造業向け帳票管理システムの開発・CMSの構築・運用・各種テスト(単体、結合、システム、TDD)・WordPressのテーマ作成からバックエンド機能開発・スクレイピング機能の開発
■ スキル・Python・C#・Java・C / C++・Ruby・HTML/CSS/JavaScript