MATLABプログラミングコンテスト必勝法

[**MATLAB EXPO 2024 Japan**](https://www.matlabexpo.com/jp/2024.html)に参加しました．
そのイベント中に開催された**MATLABプログラミングコンテスト**に初参加し，**優勝**しました．

この記事では，**MATLABプログラミングコンテスト**に関するお話と，その必勝法を紹介します．

# MATLAB EXPO，MATLABとプログラミングコンテスト
MATLAB EXPOは，MathWorks Japanが主催し，東京お台場で毎年開催されるイベントです．
2024年は，5月30日に開催されました．
去年，[**ポスター発表者として参加したときの記事**](www.timedia.co.jp/tech/20230627-tech/)が参考になるかと思います．


MATLABは，プログラミング言語の1つです．
数値計算に強いプログラミング言語として有名で，多くの大学・政府・企業で活用されています．
MATLABは非常に人気の高いプログラミング言語ですが，他の言語と異なり，多くのケースで利用にお金がかかります．
そのため，**多くのプログラミングコンテストでMATLABが利用できません**．

一方，MATLABプログラミングコンテストは，MATLAB言語しか利用できません．
MATLABを得意とするユーザーが本領を発揮できる場が，MATLABプログラミングコンテストになります．

# MATLABプログラミングコンテスト
MATLABプログラミングコンテスト（以下，コンテスト）は，MATLAB EXPO内で開催されます．
コンテスト開始時間は不明（10時？）ですが，終了時間は16時15分でした．
コンテストは，自分のPCではなく，会場に設置されたPCから参加します．
途中出場，途中退場可能です~~が，休憩や中断は，できないと思ったほうが良いです~~．
設置してあるPCの数が少ないので，時間によっては参加が難しいかもしれません．

問題やコンテストの雰囲気は，[2022年](https://blogs.mathworks.com/japan-community/2022/06/13/programmingcontest-in-matlab-expo2022/?from=jp)，[2023年](https://blogs.mathworks.com/japan-community/2023/08/03/interviewaboutprogrammingcontest2023/?from=jp)のMathWorks社員さんの記事が大変参考になります．

## 優勝者の行動
優勝者（自分）は，10時前に会場入りし，3件の基調講演を聴講しました．
そして，会場の展示を見て回った後，12時から14時半まで150分間コンテストに取り組みました．
立ったまま休憩なしで集中して取り組めるのは，これくらいの時間が限界だと思います．
150分ですべての問題を確認し，自分の知識内で短時間で解けそうな問題だけ解答しました．

![1000000855 (1).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308259/bbf4770b-285e-f1d9-a66d-6abd0539d172.jpeg)

問題を20問くらい解答したと思います．
最終的には2位と100点以上の差をつけて，206点を取って優勝しました．
ちなみに，去年の優勝者は290点，一昨年の優勝者は210点でした．

## コンテスト必勝法
コンテストで優勝するには，コンテスト当日の行動が大事になります．
まず，コンテスト参加は，早ければ早いほど良いです．
そして，他の人も解けそうな簡単な問題から取り組み，最も短いコードを早く提出することが大切になります．これは，以下のルールがあるためです．
* 各問題ごとに、コンテスト参加者の中で最も短いコードで正答した人には、**追加で5倍のポイントが付与されます**（同じ短さだった場合は早い人優先）

問題に正解したときの点数Easy 1点，Medium 2点，Hard 4点に対して，5倍のボーナス点はとても大きいです．
早い者勝ちのボーナス点を多く獲得することが，コンテストに勝つために大事になります．

コンテストで優勝するためには，MATLABプログラミング知識も当然必要です．
自分の勉強法（コンテスト練習法）もここで公開します．

## コンテスト練習法
まず，MathWorksアカウントを作成し，MATLABを実行できる環境を用意します．
MATLAB Onlineも悪くないですが，最新のMATLABデスクトップアプリをインストールして手元で実行できるようにしておくのがお勧めです．

次に，[自己学習形式のオンラインコース](https://matlabacademy.mathworks.com/jp)で勉強をします．
自分は現在16コース修了していますが，コンテストの練習としては，[MATLAB入門](https://matlabacademy.mathworks.com/jp/details/matlab-onramp/gettingstarted)と[MATLAB基礎](https://matlabacademy.mathworks.com/jp/details/matlab-fundamentals/mlbe)に取り組むのが良いと思います．
MATLAB基礎は，[Certified MATLAB Associate](https://jp.mathworks.com/learn/training/certification.html)試験の勉強としても役に立ちます．
MATLAB基礎の修了，Certified MATLAB Associate試験の合格で，[credly](https://info.credly.com/)のバッジを獲得できます．
AWSの資格などと同じく，自分のスキルのアピールに使えます．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308259/a35bcf36-6438-fbd8-85bf-2e073daf88d6.png)

最後に，[Cody](https://jp.mathworks.com/matlabcentral/cody/)の問題をたくさん解きましょう．
Codyの採点形式は，コンテストと同じです．
また，文章が日本語と英語の違いがありますが，コンテストと同一の問題も掲載されています．

例えば，過去に出題されたフィナボッチ数列に関する問題は，[問題12](https://jp.mathworks.com/matlabcentral/cody/problems/12)と同じです．
この問題に取り組み，黄金比と$\sqrt{5}$を利用するやり方を知っていれば，for文，再帰関数，行列演算のやり方しか分からない人より，コンテストで高得点が期待できます．

```matlab:黄金比と$\sqrt{5}$
function f = fib(n)
    f = round(1.61803^n / 2.236);
end
```
```matlab:for文
function f = fib(n)
    f = [1 1];
    for i = 3 : n
        f(i) = f(i-2) + f(i-1);
    end
    f = f(n)
end
```
```matlab:再帰関数
function f = fib(n)
    if n <= 2
        f = 1;
    else
        f = fib(n-2) + fib(n-1);
    end
end
```
```matlab:行列演算
function f = fib(n)
    f = [1 1; 1 0]^n;
    f = f(2);
end
```

[Cody](https://jp.mathworks.com/matlabcentral/cody/)には5千超の問題が掲載されています．
各自で自由に問題を作成・掲載できるため，その内容は増え続けています．
たくさん問題を解けば，それだけコンテスト優勝に近づくと思います．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308259/f344efc1-cd53-0c14-6f02-2f129b02d74f.png)
記事執筆時の自分は，ランク929，問題解答数142，スコア2117，バッジ数16でした．

# まとめ
コンテストで優勝するには，[Cody](https://jp.mathworks.com/matlabcentral/cody/)の問題をたくさん解いて練習するのがbest．
コンテスト当日は，早い時間から参加し，コンテストの問題をたくさん解くのがbest．