Skip to content

Commit 34bc30b

Browse files
authored
Merge pull request #251 from myoshi2891/dev-from-macmini
Update notebook metadata and improve documentation for Sleep, Cache, and Memoize
2 parents 06a72c0 + 2fd2e57 commit 34bc30b

7 files changed

Lines changed: 781 additions & 784 deletions

File tree

JavaScript/2621. Sleep/Claude Code Sonnet 4.5/README.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -189,7 +189,7 @@ async def sleep(millis: int) -> None:
189189
raise ValueError("millis must be an integer between 1 and 1000")
190190

191191
# イベントループ取得
192-
loop = asyncio.get_event_loop()
192+
loop = asyncio.get_running_loop() # 実行中のイベントループ取得(Python 3.7+で推奨)
193193

194194
# Future 作成(コルーチンが待機するオブジェクト)
195195
future: asyncio.Future[None] = loop.create_future()
@@ -256,7 +256,7 @@ async def sleep(millis: int) -> None:
256256
MILLIS_TO_SECONDS = 0.001
257257

258258
async def sleep(millis: int) -> None:
259-
await asyncio.sleep(millis * MILLIS_TO_SECONDS) # 除算より乗算が高速
259+
await asyncio.sleep(millis * MILLIS_TO_SECONDS) # 可読性とメンテナンス性の向上
260260
```
261261

262262
### パフォーマンスノート
@@ -354,7 +354,7 @@ async function sleep(millis: number): Promise<void> {
354354

355355
// Python 等価実装
356356
async def sleep(millis: int) -> None:
357-
loop = asyncio.get_event_loop()
357+
loop = asyncio.get_running_loop() # 実行中のイベントループ取得
358358
future = loop.create_future()
359359
loop.call_later(millis / 1000, future.set_result, None)
360360
await future
Lines changed: 154 additions & 154 deletions
Original file line numberDiff line numberDiff line change
@@ -1,155 +1,155 @@
11
{
2-
"cells": [
3-
{
4-
"cell_type": "markdown",
5-
"id": "2aa72022",
6-
"metadata": {},
7-
"source": [
8-
"# TypeScript Sleep関数実装\n",
9-
"\n",
10-
"## 1. 問題の分析\n",
11-
"\n",
12-
"### 競技プログラミング視点での分析\n",
13-
"- **実行速度**: 非同期処理の仕組み上、実行速度は`setTimeout`のブラウザ/Node.jsエンジンの実装に依存\n",
14-
"- **メモリ使用量**: Promise1つとタイマーIDのみで、O(1)の極小メモリ\n",
15-
"- **最適化ポイント**: シンプルな実装が最速(余計な処理を追加しない)\n",
16-
"\n",
17-
"### 業務開発視点での分析\n",
18-
"- **型安全性**: `millis`が正の整数であることの保証、Promise型の明示\n",
19-
"- **エラーハンドリング**: 不正な入力値(負の数、0、非数値)への対応\n",
20-
"- **保守性**: 明確な関数シグネチャとドキュメント\n",
21-
"- **可読性**: 非同期処理の意図が明確\n",
22-
"\n",
23-
"### TypeScript特有の考慮点\n",
24-
"- **型推論**: `Promise<void>`の明示的な型定義\n",
25-
"- **strict mode**: nullチェック、型安全性の確保\n",
26-
"- **async/await**: Promiseラッパーの簡潔な記述\n",
27-
"- **型ガード**: 実行時の入力検証\n",
28-
"\n",
29-
"## 2. アルゴリズムアプローチ比較\n",
30-
"\n",
31-
"| アプローチ | 時間計算量 | 空間計算量 | TS実装コスト | 型安全性 | 可読性 | 備考 |\n",
32-
"|---------|---------|--------|----------|--------|-------|------|\n",
33-
"| setTimeout + Promise | O(1) | O(1) | 低 | 高 | 高 | 標準的で最適 |\n",
34-
"| setInterval + clearInterval | O(1) | O(1) | 中 | 中 | 低 | 不要な複雑性 |\n",
35-
"| busy wait (while loop) | O(n) | O(1) | 低 | 高 | 低 | CPU使用率100%で非推奨 |\n",
36-
"| Promise.race + setTimeout | O(1) | O(1) | 中 | 中 | 中 | 過剰設計 |\n",
37-
"\n",
38-
"## 3. 選択したアルゴリズムと理由\n",
39-
"\n",
40-
"### 選択したアプローチ\n",
41-
"**setTimeout + Promise wrapper**\n",
42-
"\n",
43-
"### 理由\n",
44-
"- **計算量的な優位性**: O(1)の時間・空間計算量で最適\n",
45-
"- **TypeScript環境での型安全性**: Promise型の明確な定義が可能\n",
46-
"- **保守性・可読性**: 非同期処理の標準パターンで理解しやすい\n",
47-
"- **実装の単純性**: コード行数が最小で、バグの混入リスクが低い\n",
48-
"\n",
49-
"### TypeScript特有の最適化ポイント\n",
50-
"- **型推論の活用**: `Promise<void>`で戻り値の型を明示\n",
51-
"- **readonly修飾子**: 入力値の不変性を保証(必要に応じて)\n",
52-
"- **strict nullチェック**: 実行時エラーの防止\n",
53-
"- **エラー型の明示**: TypeErrorによる型レベルでのエラー情報\n",
54-
"\n",
55-
"## 4. 実装コード\n",
56-
"\n",
57-
"```typescript\n",
58-
"// Analyze Complexity\n",
59-
"// Runtime 45 ms\n",
60-
"// Beats 55.94%\n",
61-
"// Memory 53.75 MB\n",
62-
"// Beats 88.64%\n",
63-
"/**\n",
64-
" * 指定されたミリ秒数だけ非同期に待機する関数\n",
65-
" * \n",
66-
" * @param millis - 待機するミリ秒数(正の整数)\n",
67-
" * @returns void を解決するPromise\n",
68-
" * @throws {TypeError} millis が数値でない場合\n",
69-
" * @throws {RangeError} millis が範囲外(1-1000)の場合\n",
70-
" * @complexity Time: O(1), Space: O(1)\n",
71-
" * \n",
72-
" * @example\n",
73-
" * const start = Date.now();\n",
74-
" * await sleep(100);\n",
75-
" * console.log(Date.now() - start); // ~100\n",
76-
" */\n",
77-
"async function sleep(millis: number): Promise<void> {\n",
78-
" // 型ガード: 数値チェック\n",
79-
" if (typeof millis !== 'number' || Number.isNaN(millis)) {\n",
80-
" throw new TypeError('millis must be a valid number');\n",
81-
" }\n",
82-
" \n",
83-
" // 範囲チェック(制約条件: 1 <= millis <= 1000\n",
84-
" if (millis < 1 || millis > 1000) {\n",
85-
" throw new RangeError('millis must be between 1 and 1000');\n",
86-
" }\n",
87-
" \n",
88-
" // 整数チェック(正の整数要件\n",
89-
" if (!Number.isInteger(millis)) {\n",
90-
" throw new RangeError('millis must be an integer');\n",
91-
" }\n",
92-
" \n",
93-
" // Promise でラップした setTimeout による非同期待機\n",
94-
" return new Promise<void>((resolve) => {\n",
95-
" setTimeout(resolve, millis);\n",
96-
" });\n",
97-
"}\n",
98-
"```\n",
99-
"\n",
100-
"### LeetCode提出用の最小実装\n",
101-
"\n",
102-
"問題の制約条件が保証されている場合、エラーハンドリングを省略した最小実装:\n",
103-
"\n",
104-
"```typescript\n",
105-
"// Analyze Complexity\n",
106-
"// Runtime 47 ms\n",
107-
"// Beats 42.89%\n",
108-
"// Memory 55.27 MB\n",
109-
"// Beats 37.58%\n",
110-
"async function sleep(millis: number): Promise<void> {\n",
111-
" return new Promise<void>((resolve) => {\n",
112-
" setTimeout(resolve, millis);\n",
113-
" });\n",
114-
"}\n",
115-
"```\n",
116-
"\n",
117-
"## TypeScript固有の最適化観点\n",
118-
"\n",
119-
"### 型安全性の活用\n",
120-
"\n",
121-
"1. **コンパイル時エラー防止**\n",
122-
" - `Promise<void>`の明示的な型定義により、戻り値の誤用を防止\n",
123-
" - `millis: number`により、文字列などの不正な型の渡し込みを防止\n",
124-
"\n",
125-
"2. **実行時型チェック**\n",
126-
" - `typeof`および`Number.isNaN`による実行時検証\n",
127-
" - `Number.isInteger`による整数チェック\n",
128-
"\n",
129-
"3. **エラー型の明示**\n",
130-
" - `TypeError`: 型の不一致\n",
131-
" - `RangeError`: 値の範囲外\n",
132-
"\n",
133-
"### パフォーマンス特性\n",
134-
"\n",
135-
"- **時間計算量**: O(1) - 定数時間での処理完了\n",
136-
"- **空間計算量**: O(1) - Promise1つとタイマーIDのみ\n",
137-
"- **実行時オーバーヘッド**: 最小限(Promiseラッパーのみ)\n",
138-
"\n",
139-
"### 開発効率と保守性\n",
140-
"\n",
141-
"- **IntelliSense**: 型定義により引数と戻り値が自動補完\n",
142-
"- **リファクタリング安全性**: 型チェックにより変更時のエラーを検出\n",
143-
"- **ドキュメント**: JSDocコメントによる使用方法の明示\n",
144-
"- **テスタビリティ**: async/awaitにより同期的なテストコードが記述可能"
145-
]
146-
}
147-
],
148-
"metadata": {
149-
"language_info": {
150-
"name": "python"
151-
}
152-
},
153-
"nbformat": 4,
154-
"nbformat_minor": 5
155-
}
2+
"cells": [
3+
{
4+
"cell_type": "markdown",
5+
"id": "2aa72022",
6+
"metadata": {},
7+
"source": [
8+
"# TypeScript Sleep関数実装\n",
9+
"\n",
10+
"## 1. 問題の分析\n",
11+
"\n",
12+
"### 競技プログラミング視点での分析\n",
13+
"- **実行速度**: 非同期処理の仕組み上、実行速度は`setTimeout`のブラウザ/Node.jsエンジンの実装に依存\n",
14+
"- **メモリ使用量**: Promise1つとタイマーIDのみで、O(1)の極小メモリ\n",
15+
"- **最適化ポイント**: シンプルな実装が最速(余計な処理を追加しない)\n",
16+
"\n",
17+
"### 業務開発視点での分析\n",
18+
"- **型安全性**: `millis`が正の整数であることの保証、Promise型の明示\n",
19+
"- **エラーハンドリング**: 不正な入力値(負の数、0、非数値)への対応\n",
20+
"- **保守性**: 明確な関数シグネチャとドキュメント\n",
21+
"- **可読性**: 非同期処理の意図が明確\n",
22+
"\n",
23+
"### TypeScript特有の考慮点\n",
24+
"- **型推論**: `Promise<void>`の明示的な型定義\n",
25+
"- **strict mode**: nullチェック、型安全性の確保\n",
26+
"- **async/await**: Promiseラッパーの簡潔な記述\n",
27+
"- **型ガード**: 実行時の入力検証\n",
28+
"\n",
29+
"## 2. アルゴリズムアプローチ比較\n",
30+
"\n",
31+
"| アプローチ | 時間計算量 | 空間計算量 | TS実装コスト | 型安全性 | 可読性 | 備考 |\n",
32+
"|---------|---------|--------|----------|--------|-------|------|\n",
33+
"| setTimeout + Promise | O(1) | O(1) | 低 | 高 | 高 | 標準的で最適 |\n",
34+
"| setInterval + clearInterval | O(1) | O(1) | 中 | 中 | 低 | 不要な複雑性 |\n",
35+
"| busy wait (while loop) | O(n) | O(1) | 低 | 高 | 低 | CPU使用率100%で非推奨 |\n",
36+
"| Promise.race + setTimeout | O(1) | O(1) | 中 | 中 | 中 | 過剰設計 |\n",
37+
"\n",
38+
"## 3. 選択したアルゴリズムと理由\n",
39+
"\n",
40+
"### 選択したアプローチ\n",
41+
"**setTimeout + Promise wrapper**\n",
42+
"\n",
43+
"### 理由\n",
44+
"- **計算量的な優位性**: O(1)の時間・空間計算量で最適\n",
45+
"- **TypeScript環境での型安全性**: Promise型の明確な定義が可能\n",
46+
"- **保守性・可読性**: 非同期処理の標準パターンで理解しやすい\n",
47+
"- **実装の単純性**: コード行数が最小で、バグの混入リスクが低い\n",
48+
"\n",
49+
"### TypeScript特有の最適化ポイント\n",
50+
"- **型推論の活用**: `Promise<void>`で戻り値の型を明示\n",
51+
"- **readonly修飾子**: 入力値の不変性を保証(必要に応じて)\n",
52+
"- **strict nullチェック**: 実行時エラーの防止\n",
53+
"- **エラー型の明示**: TypeErrorによる型レベルでのエラー情報\n",
54+
"\n",
55+
"## 4. 実装コード\n",
56+
"\n",
57+
"```typescript\n",
58+
"// Analyze Complexity\n",
59+
"// Runtime 45 ms\n",
60+
"// Beats 55.94%\n",
61+
"// Memory 53.75 MB\n",
62+
"// Beats 88.64%\n",
63+
"/**\n",
64+
" * 指定されたミリ秒数だけ非同期に待機する関数\n",
65+
" * \n",
66+
" * @param millis - 待機するミリ秒数(正の整数)\n",
67+
" * @returns void を解決するPromise\n",
68+
" * @throws {TypeError} millis が数値でない場合\n",
69+
" * @throws {RangeError} millis が範囲外(1-1000)の場合\n",
70+
" * @complexity Time: O(1), Space: O(1)\n",
71+
" * \n",
72+
" * @example\n",
73+
" * const start = Date.now();\n",
74+
" * await sleep(100);\n",
75+
" * console.log(Date.now() - start); // ~100\n",
76+
" */\n",
77+
"async function sleep(millis: number): Promise<void> {\n",
78+
" // 型ガード: 数値チェック\n",
79+
" if (typeof millis !== 'number' || Number.isNaN(millis)) {\n",
80+
" throw new TypeError('millis must be a valid number');\n",
81+
" }\n",
82+
" \n",
83+
" // 整数チェック(正の整数要件\n",
84+
" if (!Number.isInteger(millis)) {\n",
85+
" throw new RangeError('millis must be an integer');\n",
86+
" }\n",
87+
" \n",
88+
" // 範囲チェック(制約条件: 1 <= millis <= 1000\n",
89+
" if (millis < 1 || millis > 1000) {\n",
90+
" throw new RangeError('millis must be between 1 and 1000');\n",
91+
" }\n",
92+
" \n",
93+
" // Promise でラップした setTimeout による非同期待機\n",
94+
" return new Promise<void>((resolve) => {\n",
95+
" setTimeout(resolve, millis);\n",
96+
" });\n",
97+
"}\n",
98+
"```\n",
99+
"\n",
100+
"### LeetCode提出用の最小実装\n",
101+
"\n",
102+
"問題の制約条件が保証されている場合、エラーハンドリングを省略した最小実装:\n",
103+
"\n",
104+
"```typescript\n",
105+
"// Analyze Complexity\n",
106+
"// Runtime 47 ms\n",
107+
"// Beats 42.89%\n",
108+
"// Memory 55.27 MB\n",
109+
"// Beats 37.58%\n",
110+
"async function sleep(millis: number): Promise<void> {\n",
111+
" return new Promise<void>((resolve) => {\n",
112+
" setTimeout(resolve, millis);\n",
113+
" });\n",
114+
"}\n",
115+
"```\n",
116+
"\n",
117+
"## TypeScript固有の最適化観点\n",
118+
"\n",
119+
"### 型安全性の活用\n",
120+
"\n",
121+
"1. **コンパイル時エラー防止**\n",
122+
" - `Promise<void>`の明示的な型定義により、戻り値の誤用を防止\n",
123+
" - `millis: number`により、文字列などの不正な型の渡し込みを防止\n",
124+
"\n",
125+
"2. **実行時型チェック**\n",
126+
" - `typeof`および`Number.isNaN`による実行時検証\n",
127+
" - `Number.isInteger`による整数チェック\n",
128+
"\n",
129+
"3. **エラー型の明示**\n",
130+
" - `TypeError`: 型の不一致\n",
131+
" - `RangeError`: 値の範囲外\n",
132+
"\n",
133+
"### パフォーマンス特性\n",
134+
"\n",
135+
"- **時間計算量**: O(1) - 定数時間での処理完了\n",
136+
"- **空間計算量**: O(1) - Promise1つとタイマーIDのみ\n",
137+
"- **実行時オーバーヘッド**: 最小限(Promiseラッパーのみ)\n",
138+
"\n",
139+
"### 開発効率と保守性\n",
140+
"\n",
141+
"- **IntelliSense**: 型定義により引数と戻り値が自動補完\n",
142+
"- **リファクタリング安全性**: 型チェックにより変更時のエラーを検出\n",
143+
"- **ドキュメント**: JSDocコメントによる使用方法の明示\n",
144+
"- **テスタビリティ**: async/awaitにより同期的なテストコードが記述可能"
145+
]
146+
}
147+
],
148+
"metadata": {
149+
"language_info": {
150+
"name": "typescript"
151+
}
152+
},
153+
"nbformat": 4,
154+
"nbformat_minor": 5
155+
}

0 commit comments

Comments
 (0)