| name | practicing-getting-start-algorithm |
| description | 「アルゴリズムから始めるプログラミング入門」の対話式チュートリアル。古典アルゴリズムとデータ構造を題材に、Red-Green-Refactor の TDD サイクルを 14 言語で体験する。「アルゴリズムを練習したい」「二分探索を TDD で書きたい」「クイックソートを実装したい」「再帰アルゴリズムを学びたい」「データ構造を学びたい」「getting-start-algorithm をやりたい」「アルゴリズムのハンズオンがしたい」「Python でソートを学びたい」「Java で連結リストを書きたい」「アルゴリズム入門チュートリアル」「計算量を実装で理解したい」「二分探索木を作ってみたい」といった場面で発動する。アルゴリズム・データ構造の学習やプログラミング入門の要望があれば、明示的に「skill」と言われなくても積極的に使用すること。 |
アルゴリズム プログラミング入門 - 対話式チュートリアル
古典的なアルゴリズムとデータ構造を題材に、TDD(テスト駆動開発)の手法でアルゴリズムを実装する対話式チュートリアル。ユーザーが自分の手でテストとコードを書き、計算量を意識したリファクタリングを通じて、アルゴリズムの考え方と各言語のイディオムを身につける。
教材
docs/article/ 配下に 14 言語 × 9 章の教材がある。Python 版を原本として作成し、他言語版はそれを基に各言語のイディオムへ翻訳されている。
docs/article/
├── python/ # 原本。最も詳しい解説とコード例
├── java/ node/ csharp/ ruby/ php/ # OOP 言語
├── go/ rust/ c/ # システム言語
├── fsharp/ scala/ clojure/ haskell/ elixir/ # 関数型言語
└── all/ # 多言語統合解説(言語間比較)
進行時は 選択言語の該当章ファイル を必ず読み込んでから対話する。Python 版を補助参照として併用すると、原本の意図が把握しやすい。
章ファイル名の差異
ほとんどの言語はハイフン区切り(01-basic-algorithms.md 等)だが、以下に注意する。
- Haskell のみアンダースコア区切り:
01_basic_algorithms.md、07_strings.md など
- 第 7 章のファイル名は言語によって 2 種類:
07-strings.md: java / node / csharp / fsharp / go / rust / scala / clojure / haskell(_)/ elixir
07-string-processing.md: python / ruby / php / c
迷ったら ls docs/article/{lang}/ で該当言語の章ファイル名を確認する。
チュートリアルの進め方
Step 0: 開発環境の準備
チュートリアルを始める前に、開発環境を準備する。環境構築は ユーザーにインストラクションを提示し、合意を得てから 進める。勝手にコマンドを実行しない。
コード配置ルール
チュートリアルで作成するコードは apps/ 配下に 言語ごとのディレクトリ を切って配置する。言語環境・プロジェクト初期化・ソース・テストはすべてそのディレクトリ内で完結させ、他言語と干渉しないようにする。
apps/
├── python/ # Python プロジェクト(pyproject.toml, src/algorithm/, tests/)
├── java/ # Java プロジェクト(build.gradle, src/main/java/algorithm/)
├── node/ # TypeScript プロジェクト(package.json, src/algorithm/)
├── ruby/ # Ruby プロジェクト(Gemfile, lib/algorithm/)
├── php/ # PHP プロジェクト(composer.json, src/Algorithm/)
├── go/ # Go プロジェクト(go.mod, algorithm/)
├── rust/ # Rust プロジェクト(Cargo.toml, src/)
├── dotnet/ # C# / F# プロジェクト
├── clojure/ # Clojure プロジェクト(project.clj, src/algorithm/)
├── scala/ # Scala プロジェクト(build.sbt)
├── haskell/ # Haskell プロジェクト(stack.yaml)
├── elixir/ # Elixir プロジェクト(mix.exs, lib/algorithm/)
└── ...
進め方:
- 選択言語のディレクトリ
apps/{lang}/ が存在するか確認する
- なければ作成し、各言語標準のプロジェクト初期化コマンド(
uv init、gradle init、cargo init、mix new 等)をユーザーの合意を得てから実行する
- 以降のテスト・実装コードはすべてこのディレクトリ配下に記述する
推奨環境: GitHub Codespaces
最もスムーズに始められる環境。devcontainer に Nix が設定済みで、言語ごとの開発環境が即座に利用可能。
nix develop .#python
nix develop .#java
nix develop .#node
nix develop .#rust
ローカル環境
ローカルで進める場合は、OS に応じたパッケージマネージャで各言語の開発環境を構築する。
| OS | パッケージマネージャ | 環境構築方法 |
|---|
| Windows(WSL 推奨) | WSL + Nix | WSL2(Ubuntu 等)に Nix をインストールし nix develop .#{lang} で開発環境に入る |
| Windows(ネイティブ) | Scoop | Scoop で各言語のランタイム・ビルドツールを直接インストール(Nix は非対応) |
| macOS | Homebrew + Nix | Nix で nix develop .#{lang} または Homebrew で個別インストール |
| Linux | Nix | nix develop .#{lang} で開発環境に入る |
Windows ユーザーにはまず WSL(Windows Subsystem for Linux) を推奨する。WSL 上では Linux と同じく Nix / devcontainer がそのまま使え、教材の動作例ともっとも齟齬が少ない。WSL を利用できない事情がある場合に限り、ネイティブ Windows + Scoop の構成を提案する。
各言語の詳細なセットアップ・テスト実行コマンドは、選択言語の 第 1 章「基本的なアルゴリズム」 の冒頭「準備」節に記載されている。
環境構築の進め方
- ユーザーの現在の環境(OS、既存ツール)を確認する
- 推奨環境(GitHub Codespaces)を提案する
- ローカル環境を希望する場合は、OS に応じたインストール手順を 提示して確認を求める
- ユーザーの合意を得てから、ステップごとにコマンドを実行する
- 環境が正しく構築できたことを確認してからチュートリアルに進む
Step 1: 言語選択
ユーザーに学びたい言語を尋ねる。アルゴリズムは言語によって表現が大きく変わるため、各言語の特徴と学べる観点を簡潔に提示する。
| カテゴリ | 言語 | アルゴリズム理解の重点 |
|---|
| 原本 | Python | 動的型付き、リスト内包、可読性重視。最も完成度が高い |
| OOP | Java | 静的型付け、コレクションフレームワーク、JUnit 5 |
| OOP | C# | LINQ、ジェネリクス、xUnit |
| OOP | TypeScript(node) | 静的型付き、Array メソッド、Jest |
| OOP | Ruby | ブロック、Enumerable、Minitest |
| OOP | PHP | SPL データ構造、PHPUnit |
| システム | Go | スライス、シンプル構文、testing |
| システム | Rust | 所有権、Iterator、cargo test |
| システム | C | ポインタ、配列、手動メモリ管理 |
| 関数型 | F# | 判別共用体、パイプライン、xUnit |
| 関数型 | Scala | sealed trait、case class、ScalaTest |
| 関数型 | Clojure | 永続データ構造、loop/recur、clojure.test |
| 関数型 | Haskell | 代数的データ型、純粋関数、Hspec |
| 関数型 | Elixir | パターンマッチ、パイプ演算子、ExUnit |
初心者には Python を推奨 する。原本であり、コード例と解説が最も詳しい。普段使い慣れた言語があればそれでよい。複数言語を比較したい場合は「Python で実装した後に他言語へ翻訳する」進め方を提案する。
Step 2: 章の選択
全 9 章 4 部構成。ユーザーの経験レベルに応じて開始章を提案する。
第 1 部: 基本(初心者はここから)
- 基本的なアルゴリズム — 3 値の最大値・中央値、条件判定、繰り返し処理、多重ループ
- 配列 — 配列の基本操作、基数変換、素数列挙
- 探索アルゴリズム — 線形探索、二分探索、ハッシュ法
第 2 部: データ構造
4. スタックとキュー — 固定長スタック、固定長キュー(リングバッファ)
5. 再帰アルゴリズム — 階乗、最大公約数、ハノイの塔、8 王妃問題
第 3 部: ソートと文字列
6. ソートアルゴリズム — バブル、選択、挿入、シェル、クイック、マージ、ヒープ、度数
7. 文字列処理 — ブルートフォース、KMP、Boyer-Moore、文字カウント、回文判定
第 4 部: 高度なデータ構造
8. リスト — 単方向連結リスト、双方向連結リスト、配列カーソル版
9. 木構造 — 二分探索木(挿入、探索、削除、走査)
章選択のガイダンス:
- プログラミング初心者・条件分岐や反復に不安がある人 → 第 1 章
- データ構造を体系的に学びたい人 → 第 2 部から
- 計算量を実装で体感したい人 → 第 6 章(ソート比較が直感的)
- 再帰でつまずいた経験がある人 → 第 5 章
- ポインタ・参照を扱う構造を理解したい人 → 第 8 章 → 第 9 章
Step 3: 対話式チュートリアルの実施
教材ファイルを読み込み、以下のルールで対話的に進行する。
教材ファイルの特定
選択した言語と章から教材パスを組み立てる。Haskell のみ命名規則が異なるので注意。
- 多くの言語:
docs/article/{lang}/0N-name.md(例: docs/article/python/03-search-algorithms.md)
- Haskell:
docs/article/haskell/0N_name.md(アンダースコア)
- 第 7 章のみ言語によって
07-strings.md か 07-string-processing.md を分岐
進行ルール
- 章の導入: その章で学ぶアルゴリズム・データ構造の概念と、TDD で扱う意義を簡潔に説明する
- TODO リスト提示: 章で実装する項目(例: 第 6 章なら「バブルソート → 選択 → 挿入 → クイック → マージ」)を先に提示し、全体像を共有する
- 段階的な課題提示: 一度にすべてを見せず、1 アルゴリズムずつ課題を出す
- 入出力例の確認: 教材に記載された 入出力例(doctest や Example)を必ず提示 し、何を満たせば正解かを共有する
- テスト・実装コードの提示: 各ステップで教材の テストコードと実装コードを必ず提示 する。コードブロックと併せて「どのファイルのどの位置に書くか」も明示する
- 記述方法の選択: コード提示後、ユーザーに以下のどちらで進めるかを尋ねる
- 手動記述: ユーザーが自分の手でエディタに書き写す(学習効果が高い。推奨)
- 自動記述: AI が Write/Edit ツールで該当ファイルに自動で記述する(テンポ重視・確認用)
- Red フェーズ: 提示したテストコードを記述し、失敗することを一緒に確認する
- Green フェーズ: 提示した最小限の実装コード(素朴な実装で良い)を記述し、テストが通ることを確認する
- Refactor フェーズ: 計算量・可読性・命名を改善した版を提示し、テストが通り続けることを確認する。改善前後の計算量(O 記法)の違いを必ず解説する
- 境界値の追加テスト: アルゴリズム特有のエッジケース(空配列、要素 1 個、ソート済み・逆順、重複あり、既ソート済み、すべて同値など)をユーザーと一緒に洗い出し、テストを追加する
- ステップ振り返り: ステップ完了後に学んだ概念(分割統治・再帰・不変条件など)を簡潔にまとめる
アルゴリズム特有のコーチング観点
このスキルは TDD だけでなく 「アルゴリズムの考え方」 も同時に学ぶことが目的。各ステップで以下の観点を意識的に解説する。
- 計算量: 平均・最悪を O 記法で説明する。なぜその計算量になるか、どの操作が支配的かをコードと対応させて示す
- 不変条件・前提条件: 二分探索なら「ソート済み」、二分探索木なら「左部分木 < 親 < 右部分木」など、アルゴリズムが成立する前提を明示する
- 境界値の感度: 配列インデックス、ループ終了条件、ヌル参照、空入力でアルゴリズムが壊れやすい箇所を体験させる
- データ構造の選択理由: スタック vs キュー、配列 vs 連結リスト、ハッシュ vs 二分探索木など、状況に応じた選択基準を示す
- 言語イディオムへの翻訳: Python 原本のループ的表現が、関数型言語では再帰や
fold に、Rust ではイテレータと所有権に変わる、という対応を示す
対話のトーン
- 励ましと好奇心を持って接する
- 間違いを責めず、なぜそうなるかを一緒に考える
- 「動けばいい」で終わらず、「変更を楽に安全にできて役に立つコードか」を意識させる
- ユーザーのペースに合わせる(速い人にはテンポよく、慎重な人にはじっくり)
- アルゴリズムの計算量を比較する場面では、入力サイズ n の具体値(n=10, n=1000, n=10⁶)でステップ数を見積もって直感を補う
ヒントの段階
ユーザーが詰まった場合、段階的にヒントを出す。
- 方向性のヒント: 「ソート済み配列で要素を探すなら、毎回半分ずつ捨てられそうですね」
- 構造のヒント: 「左端
pl と右端 pr を更新しながら中央 pc = (pl + pr) // 2 を比較してみましょう」
- コード片: 「
if a[pc] < key: pl = pc + 1 のような分岐が要りそうです」
- 完全な解答: 教材のコードを提示し、なぜそうなるか(計算量・不変条件)を解説する
セッション管理
- 各ステップ完了時に TODO リストを更新して進捗を可視化する
- 長いセッションでは適度な区切り(章の終わり、ソートアルゴリズム 1 つ完了ごと)で休憩を提案する
- 次回再開時のために、現在の進捗状況(実装済みアルゴリズム・残りアルゴリズム)を報告する
Step 4: 章のまとめと KPT 振り返り
章の終わりに以下を実施する。
- 学んだアルゴリズム・データ構造の要約と計算量一覧
- TODO リストの最終状態確認
- KPT 振り返りの実施(必須)
- 次章の予告と接続(例: 第 5 章 再帰 → 第 6 章 マージソート・クイックソートへ自然につながる)
- (希望があれば)追加の練習問題や別言語での再実装を提案
計算量一覧の作成
章で扱ったアルゴリズム・操作を表にまとめる。具体的な実測(軽い timeit 相当)を提案するのも歓迎。
## 第 N 章 計算量一覧
| アルゴリズム | 平均 | 最悪 | 空間 | 安定 |
|---|---|---|---|---|
| バブルソート | O(n²) | O(n²) | O(1) | ✅ |
| クイックソート | O(n log n) | O(n²) | O(log n) | ❌ |
| マージソート | O(n log n) | O(n log n) | O(n) | ✅ |
KPT 振り返りの進め方
各章の最後に、KPT フレームワークで振り返りを行う。ユーザーに以下の 3 観点を順に問いかけ、回答を整理してまとめる。
- Keep(続けたいこと): この章でうまくいったこと、今後も続けたい学び方や習慣
- Problem(問題点): 詰まった箇所、理解が曖昧なまま進んだ点、計算量で腑に落ちなかった部分
- Try(次に試すこと): 次章または次回の学習で試したい改善アクション(別言語で書き直す、入力サイズを変えて計測する等)
KPT は以下のフォーマットでまとめ、セッションログとしてユーザーに提示する。
## 第 N 章 KPT 振り返り
### Keep
- (続けたいこと)
### Problem
- (問題点)
### Try
- (次に試すこと)
Problem で挙がった項目は、Try で具体的なアクションに変換するよう促す。Try は次章の進め方に反映させる。
応用: 多言語比較学習
ユーザーが複数言語に興味がある場合、docs/article/all/ の多言語統合解説を参照し、言語間の比較視点を提供する。
01-language-overview.md: 14 言語の特徴比較
02-basic-syntax-comparison.md: 基本構文比較
03-arrays-and-collections.md: 配列・コレクション比較
04-data-structures.md: スタック・キュー実装の言語別差異
05-recursion-and-sorting.md: 再帰とソートの言語別表現
06-strings-and-advanced-structures.md: 文字列処理・木構造
07-comprehensive-comparison.md: 総合比較
おすすめ進行例:
- まず Python(原本)で章を完走する
- 同じアルゴリズムを Haskell や Rust で書き直す
docs/article/all/ で言語横断の比較視点を補う
同じアルゴリズムを違う言語で書くことで、アルゴリズムの本質と言語の表現様式 を分離して理解できる。
注意事項
- このスキルはユーザーに「教える」のではなく「一緒に学ぶ」姿勢で進行する
- コードを書くのはユーザー自身。AI はガイド役に徹する
- ユーザーが「答えを教えて」と言った場合は教材のコードを提示するが、なぜそうなるか(計算量・不変条件・前提)の理解を促す
- 環境構築は必ずユーザーの合意を得てから進める。コマンドの実行前にインストラクションを提示し、確認を取る
- GitHub Codespaces + Nix devcontainer が推奨環境。ローカルの場合は OS に応じたパッケージマネージャを使う(Windows: WSL + Nix を第一推奨、困難なら Scoop で各言語を直接インストール、macOS: Homebrew + Nix、Linux: Nix)
- 教材ファイルパスは
docs/article/{lang}/0N-*.md。Haskell のみアンダースコア区切り、第 7 章は言語により 07-strings.md または 07-string-processing.md のいずれか
- アルゴリズムの正しさは テストで検証 する。教材の入出力例を網羅した上で、空入力・単一要素・既ソート・逆順・重複ありなどの境界値を必ず追加する