diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 00000000..d3a8d3b9 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,86 @@ +# CLAUDE.md + +This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository. + +## プロジェクト概要 + +マルチ言語・マルチAIによる競技プログラミング学習リポジトリ。各問題に対して**2社 × Nモデル × 3言語 × 3ドキュメント階層**で成果物を生成する。 + +## 開発コマンド + +```bash +# セットアップ +make setup # venv + Jupyterカーネル設定 +make install # pip + bun install + +# テスト +make test # pytest + vitest 両方実行 +bunx vitest run # JS/TSテストのみ +bunx vitest run path/to/file.test.ts # 単一テスト + +# リント・フォーマット +make lint # ruff + black + prettier + eslint +make fmt # ruff --fix + black + prettier +bunx prettier -c . # prettier チェックのみ +bunx prettier -w . # prettier 修正 + +# 実行 +bunx tsx path/to/file.ts # TypeScript実行 +make lab # JupyterLab起動 +``` + +パッケージマネージャは**Bun**。`npm`ではなく`bun install`を使用。 + +## アーキテクチャ + +### 6階層ディレクトリ構造 + +``` +{Domain}/{Subcategory}/{Platform}/{Problem}/{AIProvider}/{Artifact} +``` + +- **Domain**: `Algorithm/`, `DataStructures/`, `Mathematics/`, `SQL/`, `Shell/`, `Concurrency/` +- **Platform**: `leetcode/`, `hackerrank/`, `atcoder/`, `codeforces/` +- **AIProvider**: `Claude Sonnet 4.5/`, `Claude Code Sonnet 4.6 extended/`, `gpt-4o/` など +- **Artifact**: `*.py`, `*.ts`, `*.js`, `README.md`, `README.html`, `README_react.html` + +**例外**: `JavaScript/` ディレクトリは LeetCode 30-Day JS Challenge 専用で、上記6階層に従わない。`SQL/` ドメインはAIプロバイダーが`gpt/`単一フォルダで`.ipynb`形式。 + +### デュアルAI実装哲学 + +- **Claude実装**: 競技最適化、型アノテーション信頼、単一メソッド、50-150 LOC +- **GPT実装**: 本番堅牢性、ランタイム検証、複数メソッド、80-200 LOC + +### 3階層ドキュメントシステム + +| ファイル | スタック | 用途 | +| ------------------- | ------------------------------- | ------------------------------------------------------------------------------------ | +| `README.md` | 純粋Markdown | 5セクション構造(Overview / Algorithm / Complexity / Implementation / Optimization) | +| `README.html` | Prism.js + Tailwind CSS | ステップコントロールUI、SVGフローチャート | +| `README_react.html` | React 18 UMD + Babel Standalone | リアルタイム入力操作、AI比較 | + +### コード構造パターン + +**Python** (Claude): `class Solution: def methodName(self, ...) -> ReturnType:` +**TypeScript**: `function functionName(...): ReturnType { ... }` +**JavaScript**: `var functionName = function(...) { ... }; module.exports = { functionName };` + +## 依存関係ポリシー + +- **Algorithm/DataStructures/Mathematics**: 標準ライブラリのみ(`typing`, `collections`, `itertools`, `math`, `heapq`)。外部ライブラリ禁止 +- **JS/TS実装**: ビルトインのみ。lodash等の外部ライブラリ禁止 +- **SQLドメインのみ**: Pandas/NumPy許可(`.ipynb`形式) + +## コードスタイル + +- **TypeScript**: `strict: true`, `noImplicitAny: true`, target ES2022 +- **Prettier**: semi, singleQuote, tabWidth: 4, printWidth: 100 +- **Python**: ruff + black + +## SVGフローチャートガイドライン + +`.agent/workflows/svg_flowchart_guidelines.md` に詳細あり。主要ポイント: + +- `refX` はarrowhead長未満に設定(arrowheadがノードに隠れる問題を防止) +- viewBoxに30-50pxのpadding追加 +- Prism.jsコピーボタンはTailwindのpreflightで消えるため `!important` オーバーライドが必要 diff --git a/JavaScript/2629. Function Composition/Claude Code Sonnet 4.6 extended/FunctionComposition_TS.ipynb b/JavaScript/2629. Function Composition/Claude Code Sonnet 4.6 extended/FunctionComposition_TS.ipynb new file mode 100644 index 00000000..6ed100f5 --- /dev/null +++ b/JavaScript/2629. Function Composition/Claude Code Sonnet 4.6 extended/FunctionComposition_TS.ipynb @@ -0,0 +1,117 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "a7571108", + "metadata": {}, + "source": [ + "## 1. 問題の分析\n", + "\n", + "**競技プログラミング視点**\n", + "- 配列を右から左へ1パスするだけで解決可能。`reduceRight` が最適。\n", + "- 追加メモリ不要(クロージャで `x` を畳み込む)。\n", + "\n", + "**業務開発視点**\n", + "- 空配列 → 恒等関数という仕様を型安全に表現できる。\n", + "- `readonly` 修飾子で入力配列の不変性を保証。\n", + "\n", + "**TypeScript特有の考慮点**\n", + "- `F = (x: number) => number` という型エイリアスがすでに与えられているため、ジェネリクス不要。\n", + "- `reduceRight` の型推論が自然に効く。\n", + "\n", + "---\n", + "\n", + "## 2. アルゴリズムアプローチ比較\n", + "\n", + "| アプローチ | 時間計算量 | 空間計算量 | TS実装コスト | 型安全性 | 可読性 | 備考 |\n", + "|---|---|---|---|---|---|---|\n", + "| `reduceRight` | O(n) | O(1) | 低 | 高 | 高 | 最もシンプル |\n", + "| `for` ループ(右→左) | O(n) | O(1) | 低 | 高 | 中 | 命令的 |\n", + "| 再帰 | O(n) | O(n) | 中 | 高 | 中 | スタックオーバーフローリスク |\n", + "\n", + "---\n", + "\n", + "## 3. 選択したアルゴリズムと理由\n", + "\n", + "- **選択**: `reduceRight`\n", + "- **理由**:\n", + " - 数学的な「右から左への関数合成」を宣言的に表現でき、可読性・意図の明確さが最高。\n", + " - O(n) / O(1) で計算量も最適。\n", + " - TypeScriptの型推論が自然に効き、型注釈の追加が不要。\n", + "\n", + "---\n", + "\n", + "## 4. 実装コード" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "implementation", + "metadata": {}, + "outputs": [], + "source": [ + "// Analyze Complexity\n", + "// Runtime 56 ms\n", + "// Beats 55.84%\n", + "// Memory 56.88 MB\n", + "// Beats 46.50%\n", + "type F = (x: number) => number;\n", + "\n", + "/**\n", + " * 関数配列の右から左への合成を返す\n", + " * @param functions - 合成する関数の配列\n", + " * @returns 合成された関数。空配列の場合は恒等関数\n", + " * @complexity Time: O(n), Space: O(1)\n", + " */\n", + "function compose(functions: readonly F[]): F {\n", + " return function (x: number): number {\n", + " return functions.reduceRight(\n", + " (acc: number, fn: F): number => fn(acc),\n", + " x\n", + " );\n", + " };\n", + "}\n", + "\n", + "// 動作確認\n", + "const fn1 = compose([x => x + 1, x => x * x, x => 2 * x]);\n", + "console.log(\"Example 1 (x=4): 2*4=8 -> 8*8=64 -> 64+1=65 :\", fn1(4));\n", + "\n", + "const fn2 = compose([x => 10 * x, x => 10 * x, x => 10 * x]);\n", + "console.log(\"Example 2 (x=1): 10 -> 100 -> 1000 :\", fn2(1));\n", + "\n", + "const fn3 = compose([]);\n", + "console.log(\"Example 3 (x=42): 42 :\", fn3(42));\n", + "\n", + "// Interactive checks\n", + "compose([x => x + 1, x => 2 * x])(4)" + ] + }, + { + "cell_type": "markdown", + "id": "points", + "metadata": {}, + "source": [ + "**ポイント:**\n", + "- `functions` を `readonly F[]` とすることで入力配列の不変性を型レベルで保証。\n", + "- `reduceRight` の初期値 `x` が空配列時の恒等関数の役割を自然に担うため、空配列の特別処理が不要。\n", + "- コールバック内の引数 `acc`・`fn` に型注釈を付与し、strict mode 下でも型推論が確実に機能。" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "TypeScript", + "language": "typescript", + "name": "typescript" + }, + "language_info": { + "file_extension": ".ts", + "mimetype": "text/typescript", + "name": "typescript", + "version": "5.9.3" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/JavaScript/2629. Function Composition/Claude Code Sonnet 4.6 extended/README.md b/JavaScript/2629. Function Composition/Claude Code Sonnet 4.6 extended/README.md new file mode 100644 index 00000000..6d6a240e --- /dev/null +++ b/JavaScript/2629. Function Composition/Claude Code Sonnet 4.6 extended/README.md @@ -0,0 +1,201 @@ +# Function Composition - Right-to-Left Pipeline via reduceRight + +## 目次(Table of Contents) + +- [概要](#overview) +- [アルゴリズム要点(TL;DR)](#tldr) +- [図解](#figures) +- [正しさのスケッチ](#correctness) +- [計算量](#complexity) +- [TypeScript 実装](#impl) +- [TypeScript / V8 最適化ポイント](#typescript-v8) +- [エッジケースと検証観点](#edgecases) +- [FAQ](#faq) + +--- + +
+ 関数の配列を受け取り、右から左へ順に適用する合成関数を返す。
+ reduceRight による O(n)
+ パイプライン実装。
+
+ 関数の配列
+ functions = [f1, f2, ..., fn]
+ を受け取り、
+ 右から左へ順に適用する合成関数を返す。
+
-1000 ≤ x ≤ 1000
+ 0 ≤ functions.length ≤ 1000
+ reduceRight の初期値
+ x が、
+ 空配列時に恒等関数として自然に機能する。特別な分岐が不要。
+
+ 例:
+ functions = [x=>x+1, x=>x*x, x=>2*x], x = 4
+
type F = (x: number) => number;
+
+/**
+ * 関数配列の右から左への合成を返す。
+ * 空配列の場合は恒等関数を返す。
+ *
+ * @param functions - 合成する関数の配列(右端から順に適用)
+ * @returns 合成された関数
+ * @complexity Time: O(n) per call, Space: O(1)
+ */
+function compose(functions: readonly F[]): F {
+ // reduceRight の初期値 x が空配列時の恒等関数を自然に実現する
+ return function (x: number): number {
+ return functions.reduceRight(
+ (acc: number, fn: F): number => fn(acc),
+ x
+ );
+ };
+}
+
+/**
+ * const fn = compose([x => x + 1, x => x * x, x => 2 * x]);
+ * fn(4); // 65 (2*4=8 → 8²=64 → 64+1=65)
+ *
+ * const id = compose([]);
+ * id(42); // 42 (恒等関数)
+ */
+
+ フロー解説:
+ 1.
+ compose
+ が呼ばれると即座にクロージャを返す(O(1))
+ 2. 返された関数
+ fn(x)
+ が呼ばれたとき実際の計算が始まる(O(n))
+ 3. 空配列の場合は reduceRight の初期値 x
+ がそのまま返る → 恒等関数
+ 4. 要素がある場合は右端から fn を順に acc に適用し、最終 acc を返す
+
| + アプローチ + | ++ 時間計算量 + | ++ 空間計算量 + | ++ 型安全性 + | ++ 可読性 + | +
|---|---|---|---|---|
| reduceRight ✓ | +O(n) | +O(1) | +⭐⭐⭐ | +⭐⭐⭐ | +
| for ループ(右→左) | +O(n) | +O(1) | +⭐⭐⭐ | +⭐⭐ | +
| 再帰 | +O(n) | +O(n) | +⭐⭐ | +⭐⭐ | +