MATLAB ユーザーコミュニティー

MATLAB & Simulink ユーザーコミュニティー向け日本語ブログ

プログラミングコンテスト in MATLAB EXPO2022!!

皆さんこんにちは、トレーニングチームの遠藤です。

先日関東の梅雨入り宣言が発表されましたね。最近オフィスに出社する機会が多いのですが、家を出る時に雨が降っているとなかなか気が滅入る……。自席についてすぐ MATLAB を起動して暗い気分を晴らす日々が続いております。

 

さて、今回の記事は前回記事に続き、5/25 に行われた MATLAB EXPO 2022 についての記事となります。今年の EXPO は初のハイブリッド開催ということで、オンライン参加も含めて延べ 3000 人以上の方にご参加いただきました。参加いただいた方は様々な講演や展示をご覧いただいたかと思いますが、この記事ではEXPOの現地会場の奥の方でひっそり(?)と行われていた「MATLAB プログラミングコンテスト」について紹介したいと思います!

 

1. MATLAB プログラミングコンテストとは?

MATLAB プログラミングコンテストとは、「MATLAB でいかにきれいなコードを書けるか」を競い合うコンテストになります。

画面左に様々な問題が表示されるので、その答えとなる関数を MATLAB で作っていきます。そして、その関数の “Solution Size” が最も小さい人が得点のゲットできる、というルールです。

 

Solution Size とは、Cody™ でも使われている指標で、コードを解析するときに得られるノードカウントです。コードの長さに近い指標で、例えば次のコードは Solution Size 12 です。

Solution Size 12 のコード:
function y = plus_one(x)
  y = x + 1;
end

これに対し、次のコードは Solution Size 16 になります。

Solution Size 16 のコード:
function y = plus_one(x)
  z = x;
  y = z + 1;
end

どちらも関数からの戻り値は同じですが、後者の方が 1 行処理が多いので、Solution Size が増えています。このように、無駄な処理や冗長な表現があると Solution Size はどんどん増えていくので、ベストな Solution Size を出すには 言語仕様やビルトインの関数を使い、できるだけシンプルにコードを書く必要があります。

 

まとめると、MATLAB の便利機能・関数をうまく使って、できるだけ短いコードで関数を作ろう!」というコンテストですね。

2. 当日のコンテスト結果

当日は27人の MATLAB プログラマーの皆さんに参加いただきました!あらかじめ用意していたPC6台だけでは足りず、予備のPCも出して7人が同時に参加する状態に。

 

 

最終的なコンテスト結果はというと……

午前から問題を怒涛のスピードで解きまくっていた masuさんがダントツのトップ!しかし、上位5人に豪華景品(有償のトレーニングテキスト!)が用意されていたこともあり、終了時間ギリギリまで上位争いが繰り広げられていました!

ちなみに、この masu さんはライトニングトークで発表されていたマスムラさんです。やはりライトニングトークの発表者ともなると、MATLAB プログラミング力も随一ですね!

そして、9 位で 20 点を取っている “ekagaku” さんは、なんと、ライトニングトークとポスターセッションで発表していた e-kagaku アカデミーの小中学生の皆さん!大人顔負けの MATLAB スキルに脱帽です……。

 

※ライトニングトークについては前回の記事もご覧ください。録画動画も YouTube にて随時公開されていく予定ですので、当日見ることができなかった方はお楽しみに!(去年の録画はこちら!)

 

さて、ここからは、プログラミングコンテストで実際に出題された問題とその解答を、少しだけご紹介したいと思います。自分ならどのようなコードを書くか、この記事を読んでいる皆さんもぜひ一緒に考えてみてください!

 

3. 実際の問題を見てみよう!(初級編)

まずは当日最も簡単な難易度として出題された問題を見てみましょう。

 

(ここから始めよう) 和算

N が正の整数の場合、1 から N までの自然数の和を計算する関数

out = wasan(N)

を作成せよ。

 

1 から N までの足し算をする関数を作る問題です。皆さんはこの関数、どのようにプログラムしますか?

繰り返しの足し算ということで、 for ループを思い浮かべた方もいらっしゃるかもしれません。試しに for ループでコードを書いてみましょう。

for ループを使ったコード:
function out = wasan(N)
out = 0;
for i = 1:N
    out = out + i;
end
end

 

こんな感じでしょうか?。このコードで採点してみると……

 

Solution Size は 22。模範解答の 14 よりも大幅にサイズが大きくなってしまいました。for ループは処理が多い分 Solution Size が大きくなりがちです。より小さな Solution Size にするためには、for ループを使わずにコードを書く必要がありそうです。

皆さんはこの問題、どのようなコードを書きますか?

 

 

 

では、模範解答のコードを見てみましょう。

模範解答:
function out = wasan(N)
out = sum(1:N);
end

 

模範解答のコードはわずか1行!ポイントは「ベクトルをうまく使う」という点。1:N で 1 から N までのベクトルを作り、そのすべての要素を sum 関数で合計することで、ループなしで繰り返しの足し算を実装しています。MATLAB はベクトルや行列の扱いに長けていますので、これらを活用すると非常にシンプルにコードが書けますね!

 

 

4. 実際の問題を見てみよう!(中級編)

次は少し難易度の高い問題を見てみましょう。

 

直角三角形の判別

3辺の長さ x を入力としたとき、x=[3 4 5]は直角三角形です。

x = [13 5 12]も直角三角形です。

x = [5 5 5]は直角三角形ではなりません。

3要素のベクトル x を入力としたときに、直角三角形であれば true を、そうでなければ false を返すプログラムを作ってください。

TF = RightTriangle(x)

 

与えられた三角形の3辺の長さから、直角三角形かどうかを判別する問題です。3要素のベクトルのうち最大の要素の2乗が他の要素の2乗和と同じかどうかをチェックすれば、直角三角形かどうかを判別することができます。

……と、言葉にすれば簡単そうですが、実際にコードを書こうとすると意外とうまくいきません。特に難しいのが、辺の長さの順番で並んでいるとは限らないという点。max 関数を使えば最大値は取れますが、今度はそれ以外の要素だけを取り出すのが大変。if 文を使ってどの要素が最大かによって場合分けをする?でもそうするとコードが長くなって Solution Size が……。

 

……だんだん頭が混乱してきました。皆さんはこの問題、キレイにプログラミングできますか?

 

 

 

それでは模範解答を……と言いたいところですが、なんとこの問題、早稲田大学の MATLAB アンバサダーの方が模範解答よりもサイズの短いコードを書いてくれました!その華麗なコードがこちら!

MATLAB アンバサダーの方の解答:
function TF = RightTriangle(x)
TF = (sort(x).^2)*[1;1;-1]==0;
end

 

なんと、この複雑な処理をわずか1行で実装しています、スゴい!早速中身を見てみましょう。

 

まず使っているのが sort 関数。sort 関数はベクトルの要素を小さい順に並び替えることができます。これを使えば先ほどの辺の長さの順番の問題が解決できますね!

そしてその後の計算もお見事。”.^” 演算によって、sort で並び替えたベクトルの各要素を2乗します。MATLAB では、掛け算やべき乗の演算の前に . をつけることで、要素ごとの演算を行うことができます(これを配列演算と呼びます)。あとは各辺の長さの2乗で構成された横ベクトル[x1^2 x2^2 x3^2]と縦ベクトル [1;1;-1] を掛け算することで、x1^2+x2^2-x3^2 を計算します。sort 関数によって x3 が最大値になっているので、直角三角形であればこの計算結果は 0 になるはず。そのため、最後に == 0 によって 0 かどうかを判別すれば、直角三角形かどうかの判定ができる、というわけです。

まさに MATLAB の便利関数と言語仕様を最大限に活かしたコードですね!さすがは MATLAB アンバサダー!

 

 

5. 終わりに

ということで、MATLAB EXPO で開催したプログラミングコンテストの問題を2問ほど紹介しましたが、皆さんはどちらの問題も解けましたか?実際のプログラミングコンテストでは、初級、中級、そしてさらに難しい上級問題も含め、70問以上の問題が用意されています。「自分のMATLAB プログラミングスキルを試したい!」「私が最強のMATLAB エンジニアだ!」という方は、ぜひ来年の MATLAB EXPO は会場にお越しいただき、プログラミングコンテストに挑戦しに来てください!

|
  • print

댓글

댓글을 남기려면 링크 를 클릭하여 MathWorks 계정에 로그인하거나 계정을 새로 만드십시오.