脱初心者向け！プログラミング勉強の参考に！

# 何を勉強すればいいのか分からない
後輩(新人さん)からあった質問の中に、「プログラミングの勉強ってどうすればいいですか？」というものがありました。
個人的にプログラミングの勉強には2種類の選択肢があると思っています。

1. アプリなど実際に動くものを作って学ぶ
主にフレームワークの使い方などをメインとした学習です。作りながら覚える方が達成感もあるので、長続きしやすいと思います。作りたいものがなかったりすると「何を作ればいいのか分からない…」と足踏みしてしまうこともありますが、フレームワークのチュートリアルをとりあえず進めるとかでもいいと思います。スポーツで言えば試合形式の練習でしょうか。
2. コーディング力を鍛える
こちらは、よりマクロな視点で、問題解決のための処理(アルゴリズム)をどう書くか、どういう処理が効率的なのかということに重きをおいた学習です。作りたいものがないけど勉強したい、地固めしたいという場合はこちらがおすすめです。スポーツで言えば基礎練習になります。

質問をしてくる人は、だいたい作りたいものがなかったりする(けどスキルアップはしたい)人なので、必然「2」をおすすめすることになります。ただし、地味だし自己満足の世界です…

# 少しでも楽しく コーディング力を鍛えるために
コーディング力を鍛えると言っても、じゃあどうすればいいのかという話になってくると思います。
中級者以上であれば、ライブラリの中身を読んでみる！といった方法をおすすめしますが、脱初心者帯の人には苦行でしかありません。そもそも何かいてあるのか分からなくて挫折してしまうでしょう。
何事も楽しく学ぶことが大切です。そこでおすすめしたいのが競技プログラミングです。

# 競技プログラミングとは
競技プログラミングとは、プログラミングのスキルを競い合う形式のコンペティションやイベントのことです。
参加者は与えられた問題を解決するために、アルゴリズムやデータ構造を駆使してプログラムを作成し、その正確性や効率性を競います。
また、競技プログラミングのコンテストでは、通常時間が決められていることが多く、アルゴリズムの構築速度も鍵になります。
有名なのは[AtCoder](https://atcoder.jp/)になりますが、ちょっと敷居が高く感じるかもしれません。「`世界最高峰の競技プログラミングサイト`」なんて書いてありますし…

もっとカジュアルにやりたいと言う人は[Paizaのプログラミングスキルチェック](https://paiza.jp/challenges/info)に挑戦してみるといいと思います。
出された課題を解決するプログラムを書いて提出すると、自動採点が行われてスコアがつきます。

ランクBをやってみた結果がこんな感じです。

![スクリーンショット 2025-01-31 18.53.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3639915/69ffa68c-e002-aba6-5bbf-6fda76dc7565.png)

片手間にやっていたので時間は平均値の倍以上掛かってますが、スコアは93点。平均値が64.76点なのでかなり良い方でしょうか？
正解率が24%台なので、つるかめ算のプログラムを作るのが難しい(苦戦する人が多い)ことが分かりますね。
鶴と亀ではありえない匹数や足の本数(小数点とか負の数)のパターンを正しく弾く必要があるので、この辺りが苦戦する人の多い理由でしょうか。

本来は自己のスキルをPRして転職活動につなげるというサービスですが、コーディング能力の向上のために登録して問題にチャレンジするのもありかと思っています。将来の転職に繋がる可能性もありますし、セーフです。

「`プログラミング学習ゲーム`」というものも公開されていて、今は[『電脳少女プログラミング2088-壊レタ君を再構築-』](https://ppg.paiza.jp/denno2088)が開催されています。こちらは、`2025年2月10日`までの期間限定ですね。

![スクリーンショット 2025-01-31 16.53.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3639915/9552e1ee-c3c4-5a9f-7718-9fe6030b4740.png)

# やってみた
ここから先は実のある話はないです。先程のゲームがどんな雰囲気かな～という紹介。
冒頭オープニングとなるアニメーション映像が流れます。
戦争のためにサイボーグ化され、スクラップの状態で見つかった幼馴染をプログラミング能力を駆使して修復していく？的なお話。

ストーリーが重すぎる！

プログラミングで体パーツを再構築して、SQLで記憶の再構築をしていくと。
SQLで記憶っていうのが妙なリアル感ですね。

重めのストーリー展開だと思ったけど、ゲーム自体は体パーツや性格を自由に選択して組み合わせられ…

大丈夫かな、このゲーム。

「いろんな性格を試しながら、僕の記憶の中にあるレイミの性格に近づけていくんだ。」

大丈夫かな、このゲー…。

難易度はS,A,B,C,D,Eの6段階で別れていて、Eは選択問題らしい。
下の難易度から順番に進めていけば良さそうです。

とりあえずDランクのプログラミングの問題。
```
以下の形式で、出力してください。
値切りの戦略はまず半額を希望しそれが駄目な場合に半額から 100 増やした値段を伝えることにしました。
この戦略で半額の希望が駄目だった場合の額を出力してください。
末尾に改行を入れ、余計な文字、空行を含んではいけません。

・300 ≦ n ≦ 10,000
・n は 10 の倍数
```

回答欄は右上から言語を選択すると、
![スクリーンショット 2025-01-31 18.11.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3639915/e04da598-507f-e336-972d-7ceed4582f9a.png)

ベースとなるプログラムが与えられる感じですね。選択したのは`JavaScript`。
![スクリーンショット 2025-01-31 18.10.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3639915/909e51de-3ff5-5e47-ebb6-1e8196c1252b.png)

`reader.on('line', (line) => {`で一行ずつ読み込みイベントが実行されて、`reader.on('close', () => {`で読み込み完了イベントが発火する流れかな？
今回の問題は普通にclose内で処理すれば良さそうです。

とりあえず回答とおもったら、ベースとなるプログラムが半角スペース2文字でインデントなのに、改行した際のオートインデントがタブ文字(しかも幅4)なのが地味に嫌(愚痴)。

回答を記述して、

```
process.stdin.resume();
process.stdin.setEncoding('utf8');
// 自分の得意な言語で
// Let's チャレンジ！！
var lines = [];
var reader = require('readline').createInterface({
  input: process.stdin,
  output: process.stdout
});
reader.on('line', (line) => {
  lines.push(line);
});
reader.on('close', () => {
  const result = (lines[0] / 2) + 100;
  console.log(result);
});
```

簡易動作テストから、提出へ。

提出前に簡易動作テストができ、提出後にはしっかりテストコードを通されて結果が返ってきます。
動作テストは例題のパラメーターだけのテストかな？提出後のテストは境界値等しっかりとテストが行われるようですね。

無事、正解だったようです。
さすがにDランクの敷居は低めで、プログラミング初心者から楽しめるようになっていますね。
[プログラミングスキルチェック](https://paiza.jp/challenges/info)の方では、Aランクで回答時間の中央値が80分とかだったりするので、上位の問題は歯ごたえがある課題だと思います。

# おわりに
脱初心者向け！ということで競技プログラミングの紹介でした。
勉強の方法は一つじゃありません。ただ、自分が楽しく続けられる勉強法が一番だと思います。
好きこそ物の上手なれ！エンジョイ、アルゴリズム！