Skip to content

Commit ba81102

Browse files
authored
Merge pull request #274 from myoshi2891/dev-from-macmini
Add Function Composition solution files
2 parents f1cfce4 + 49675f3 commit ba81102

5 files changed

Lines changed: 1766 additions & 3 deletions

File tree

CLAUDE.md

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
# CLAUDE.md
2+
3+
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
4+
5+
## プロジェクト概要
6+
7+
マルチ言語・マルチAIによる競技プログラミング学習リポジトリ。各問題に対して**2社 × Nモデル × 3言語 × 3ドキュメント階層**で成果物を生成する。
8+
9+
## 開発コマンド
10+
11+
```bash
12+
# セットアップ
13+
make setup # venv + Jupyterカーネル設定
14+
make install # pip + bun install
15+
16+
# テスト
17+
make test # pytest + vitest 両方実行
18+
bunx vitest run # JS/TSテストのみ
19+
bunx vitest run path/to/file.test.ts # 単一テスト
20+
21+
# リント・フォーマット
22+
make lint # ruff + black + prettier + eslint
23+
make fmt # ruff --fix + black + prettier
24+
bunx prettier -c . # prettier チェックのみ
25+
bunx prettier -w . # prettier 修正
26+
27+
# 実行
28+
bunx tsx path/to/file.ts # TypeScript実行
29+
make lab # JupyterLab起動
30+
```
31+
32+
パッケージマネージャは**Bun**`npm`ではなく`bun install`を使用。
33+
34+
## アーキテクチャ
35+
36+
### 6階層ディレクトリ構造
37+
38+
```
39+
{Domain}/{Subcategory}/{Platform}/{Problem}/{AIProvider}/{Artifact}
40+
```
41+
42+
- **Domain**: `Algorithm/`, `DataStructures/`, `Mathematics/`, `SQL/`, `Shell/`, `Concurrency/`
43+
- **Platform**: `leetcode/`, `hackerrank/`, `atcoder/`, `codeforces/`
44+
- **AIProvider**: `Claude Sonnet 4.5/`, `Claude Code Sonnet 4.6 extended/`, `gpt-4o/` など
45+
- **Artifact**: `*.py`, `*.ts`, `*.js`, `README.md`, `README.html`, `README_react.html`
46+
47+
**例外**: `JavaScript/` ディレクトリは LeetCode 30-Day JS Challenge 専用で、上記6階層に従わない。`SQL/` ドメインはAIプロバイダーが`gpt/`単一フォルダで`.ipynb`形式。
48+
49+
### デュアルAI実装哲学
50+
51+
- **Claude実装**: 競技最適化、型アノテーション信頼、単一メソッド、50-150 LOC
52+
- **GPT実装**: 本番堅牢性、ランタイム検証、複数メソッド、80-200 LOC
53+
54+
### 3階層ドキュメントシステム
55+
56+
| ファイル | スタック | 用途 |
57+
| ------------------- | ------------------------------- | ------------------------------------------------------------------------------------ |
58+
| `README.md` | 純粋Markdown | 5セクション構造(Overview / Algorithm / Complexity / Implementation / Optimization) |
59+
| `README.html` | Prism.js + Tailwind CSS | ステップコントロールUI、SVGフローチャート |
60+
| `README_react.html` | React 18 UMD + Babel Standalone | リアルタイム入力操作、AI比較 |
61+
62+
### コード構造パターン
63+
64+
**Python** (Claude): `class Solution: def methodName(self, ...) -> ReturnType:`
65+
**TypeScript**: `function functionName(...): ReturnType { ... }`
66+
**JavaScript**: `var functionName = function(...) { ... }; module.exports = { functionName };`
67+
68+
## 依存関係ポリシー
69+
70+
- **Algorithm/DataStructures/Mathematics**: 標準ライブラリのみ(`typing`, `collections`, `itertools`, `math`, `heapq`)。外部ライブラリ禁止
71+
- **JS/TS実装**: ビルトインのみ。lodash等の外部ライブラリ禁止
72+
- **SQLドメインのみ**: Pandas/NumPy許可(`.ipynb`形式)
73+
74+
## コードスタイル
75+
76+
- **TypeScript**: `strict: true`, `noImplicitAny: true`, target ES2022
77+
- **Prettier**: semi, singleQuote, tabWidth: 4, printWidth: 100
78+
- **Python**: ruff + black
79+
80+
## SVGフローチャートガイドライン
81+
82+
`.agent/workflows/svg_flowchart_guidelines.md` に詳細あり。主要ポイント:
83+
84+
- `refX` はarrowhead長未満に設定(arrowheadがノードに隠れる問題を防止)
85+
- viewBoxに30-50pxのpadding追加
86+
- Prism.jsコピーボタンはTailwindのpreflightで消えるため `!important` オーバーライドが必要
Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
1+
{
2+
"cells": [
3+
{
4+
"cell_type": "markdown",
5+
"id": "a7571108",
6+
"metadata": {},
7+
"source": [
8+
"## 1. 問題の分析\n",
9+
"\n",
10+
"**競技プログラミング視点**\n",
11+
"- 配列を右から左へ1パスするだけで解決可能。`reduceRight` が最適。\n",
12+
"- 追加メモリ不要(クロージャで `x` を畳み込む)。\n",
13+
"\n",
14+
"**業務開発視点**\n",
15+
"- 空配列 → 恒等関数という仕様を型安全に表現できる。\n",
16+
"- `readonly` 修飾子で入力配列の不変性を保証。\n",
17+
"\n",
18+
"**TypeScript特有の考慮点**\n",
19+
"- `F = (x: number) => number` という型エイリアスがすでに与えられているため、ジェネリクス不要。\n",
20+
"- `reduceRight` の型推論が自然に効く。\n",
21+
"\n",
22+
"---\n",
23+
"\n",
24+
"## 2. アルゴリズムアプローチ比較\n",
25+
"\n",
26+
"| アプローチ | 時間計算量 | 空間計算量 | TS実装コスト | 型安全性 | 可読性 | 備考 |\n",
27+
"|---|---|---|---|---|---|---|\n",
28+
"| `reduceRight` | O(n) | O(1) | 低 | 高 | 高 | 最もシンプル |\n",
29+
"| `for` ループ(右→左) | O(n) | O(1) | 低 | 高 | 中 | 命令的 |\n",
30+
"| 再帰 | O(n) | O(n) | 中 | 高 | 中 | スタックオーバーフローリスク |\n",
31+
"\n",
32+
"---\n",
33+
"\n",
34+
"## 3. 選択したアルゴリズムと理由\n",
35+
"\n",
36+
"- **選択**: `reduceRight`\n",
37+
"- **理由**:\n",
38+
" - 数学的な「右から左への関数合成」を宣言的に表現でき、可読性・意図の明確さが最高。\n",
39+
" - O(n) / O(1) で計算量も最適。\n",
40+
" - TypeScriptの型推論が自然に効き、型注釈の追加が不要。\n",
41+
"\n",
42+
"---\n",
43+
"\n",
44+
"## 4. 実装コード"
45+
]
46+
},
47+
{
48+
"cell_type": "code",
49+
"execution_count": null,
50+
"id": "implementation",
51+
"metadata": {},
52+
"outputs": [],
53+
"source": [
54+
"// Analyze Complexity\n",
55+
"// Runtime 56 ms\n",
56+
"// Beats 55.84%\n",
57+
"// Memory 56.88 MB\n",
58+
"// Beats 46.50%\n",
59+
"type F = (x: number) => number;\n",
60+
"\n",
61+
"/**\n",
62+
" * 関数配列の右から左への合成を返す\n",
63+
" * @param functions - 合成する関数の配列\n",
64+
" * @returns 合成された関数。空配列の場合は恒等関数\n",
65+
" * @complexity Time: O(n), Space: O(1)\n",
66+
" */\n",
67+
"function compose(functions: readonly F[]): F {\n",
68+
" return function (x: number): number {\n",
69+
" return functions.reduceRight(\n",
70+
" (acc: number, fn: F): number => fn(acc),\n",
71+
" x\n",
72+
" );\n",
73+
" };\n",
74+
"}\n",
75+
"\n",
76+
"// 動作確認\n",
77+
"const fn1 = compose([x => x + 1, x => x * x, x => 2 * x]);\n",
78+
"console.log(\"Example 1 (x=4): 2*4=8 -> 8*8=64 -> 64+1=65 :\", fn1(4));\n",
79+
"\n",
80+
"const fn2 = compose([x => 10 * x, x => 10 * x, x => 10 * x]);\n",
81+
"console.log(\"Example 2 (x=1): 10 -> 100 -> 1000 :\", fn2(1));\n",
82+
"\n",
83+
"const fn3 = compose([]);\n",
84+
"console.log(\"Example 3 (x=42): 42 :\", fn3(42));\n",
85+
"\n",
86+
"// Interactive checks\n",
87+
"compose([x => x + 1, x => 2 * x])(4)"
88+
]
89+
},
90+
{
91+
"cell_type": "markdown",
92+
"id": "points",
93+
"metadata": {},
94+
"source": [
95+
"**ポイント:**\n",
96+
"- `functions` を `readonly F[]` とすることで入力配列の不変性を型レベルで保証。\n",
97+
"- `reduceRight` の初期値 `x` が空配列時の恒等関数の役割を自然に担うため、空配列の特別処理が不要。\n",
98+
"- コールバック内の引数 `acc`・`fn` に型注釈を付与し、strict mode 下でも型推論が確実に機能。"
99+
]
100+
}
101+
],
102+
"metadata": {
103+
"kernelspec": {
104+
"display_name": "TypeScript",
105+
"language": "typescript",
106+
"name": "typescript"
107+
},
108+
"language_info": {
109+
"file_extension": ".ts",
110+
"mimetype": "text/typescript",
111+
"name": "typescript",
112+
"version": "5.9.3"
113+
}
114+
},
115+
"nbformat": 4,
116+
"nbformat_minor": 5
117+
}

0 commit comments

Comments
 (0)