Skip to content

Commit 18cea1f

Browse files
authored
Merge pull request #253 from myoshi2891/dev-from-macmini
Add primitive root algorithm and generalize snail traversal
2 parents ee46640 + ede905b commit 18cea1f

5 files changed

Lines changed: 2606 additions & 72 deletions

File tree

JavaScript/2624. Snail Traversal/Claude Code Sonnet 4.5/README.md

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -134,11 +134,12 @@ graph LR
134134

135135
**実装比較**:
136136

137-
| 実装方法 | Runtime\* | Memory | 特徴 |
138-
| ---------------------------- | --------- | ------ | ------------------ |
139-
| 基本版(Array.from) | ~158ms | ~69MB | 可読性高、標準的 |
140-
| 最適化版(ビット演算) | ~140ms | ~68MB | ビット演算で高速化 |
141-
| 高速化版(変数キャッシング) | ~125ms | ~67MB | 更なる高速化 |
137+
| 実装方法 | Runtime\* | Memory | 特徴 |
138+
| ---------------------------- | --------- | ------- | ------------------ |
139+
| 基本版(Array.from) | ~158ms | ~69MB | 可読性高、標準的 |
140+
| 最適化版(ビット演算) | 154ms | 69.54MB | ビット演算で高速化 |
141+
| 高速化版(変数キャッシング) | 158ms | 69.10MB | 更なる高速化 |
142+
| メモリ最優先版 | 148ms | 67.10MB | メモリ効率最大化 |
142143

143144
_\*数値は特定環境での測定例です_
144145

@@ -337,7 +338,7 @@ const lastRow = rows - 1;
337338
5. **空配列**
338339

339340
```typescript
340-
[].snail(0, 0); // → []
341+
[].snail(1, 0); // → [] (入力サイズ 0)
341342
```
342343

343344
6. **標準ケース(偶数列)**
@@ -356,6 +357,7 @@ const lastRow = rows - 1;
356357
```
357358

358359
8. **大きなサイズ**
360+
359361
```typescript
360362
new Array(250)
361363
.fill(0)

JavaScript/2624. Snail Traversal/Claude Code Sonnet 4.5/README_react.html

Lines changed: 49 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,10 @@
66
<title>LeetCode: Snail Traversal - 蛇行パターンで1D→2D配列変換</title>
77

88
<!-- Tailwind CSS -->
9-
<script src="https://cdn.tailwindcss.com"></script>
9+
<script
10+
src="https://cdn.tailwindcss.com/3.4.1"
11+
crossorigin="anonymous"
12+
></script>
1013

1114
<!-- Google Fonts -->
1215
<link rel="preconnect" href="https://fonts.googleapis.com" />
@@ -20,14 +23,20 @@
2023
<link
2124
href="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/themes/prism-tomorrow.min.css"
2225
rel="stylesheet"
26+
integrity="sha384-wFjoQjtV1y5jVHbt0p35Ui8aV8GVpEZkyF99OXWqP/eNJDU93D3Ugxkoyh6Y2I4"
27+
crossorigin="anonymous"
2328
/>
2429
<link
2530
href="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/plugins/line-numbers/prism-line-numbers.min.css"
2631
rel="stylesheet"
32+
integrity="sha384-AnUkTNLI8COlMCRJ0FHIdX76If83145OTCLUx4gQyfnO0gGeO/sD9czGEUBxtkUU"
33+
crossorigin="anonymous"
2734
/>
2835
<link
2936
href="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/plugins/toolbar/prism-toolbar.min.css"
3037
rel="stylesheet"
38+
integrity="sha384-vEUzJ34/1CCeefTGUKLgvA5Z/vYIwi+Jyu8aAaCfFDxfwZ3Xs3OfkkIeegsLRM11"
39+
crossorigin="anonymous"
3140
/>
3241

3342
<style>
@@ -242,44 +251,40 @@ <h3 class="text-xl font-semibold text-teal-800 mt-6 mb-3">戦略のポイント<
242251
TypeScript実装(最適化版)
243252
</h2>
244253

245-
<pre class="line-numbers"><code class="language-typescript">declare global {
246-
interface Array&lt;T&gt; {
247-
snail(rowsCount: number, colsCount: number): number[][];
248-
}
254+
<pre class="line-numbers"><code class="language-typescript">declare interface Array<T> {
255+
snail(rowsCount: number, colsCount: number): T[][];
249256
}
250257

251258
/**
252-
* 1D配列をSnail traversal patternで2D配列に変換(最適化版)
253-
* ビット演算と整数除算でパフォーマンス向上
259+
* 1D配列をSnail traversal patternで2D配列に変換
254260
*
255261
* @param rowsCount - 結果の行数
256262
* @param colsCount - 結果の列数
257263
* @returns 2D配列(Snail pattern)、無効な入力の場合は空配列
258-
* @complexity Time: O(n), Space: O(n)
264+
* @complexity Time: O(n), Space: O(n) where n = this.length
259265
*/
260-
Array.prototype.snail = function(rowsCount: number, colsCount: number): number[][] {
261-
const n = this.length;
262-
263-
// 入力バリデーション(早期リターン)
264-
if (rowsCount * colsCount !== n) return [];
265-
266-
// 1段階での配列初期化(メモリ効率向上)
267-
const result: number[][] = [];
268-
for (let i = 0; i < rowsCount; i++) {
269-
result[i] = [];
266+
Array.prototype.snail = function<T>(rowsCount: number, colsCount: number): T[][] {
267+
// 入力バリデーション
268+
if (rowsCount * colsCount !== this.length) {
269+
return [];
270270
}
271271

272-
// メインループ(最適化)
273-
for (let i = 0; i < n; i++) {
274-
// 列番号を計算(ビットOR演算で整数化、Math.floorより高速)
275-
const col = (i / rowsCount) | 0;
272+
// 結果配列の初期化
273+
const result: T[][] = Array.from({ length: rowsCount }, () =>
274+
new Array(colsCount)
275+
);
276+
277+
// Snail traversal pattern実装
278+
for (let i = 0; i < this.length; i++) {
279+
// 列番号を計算
280+
const col = Math.floor(i / rowsCount);
276281

277282
// 列内での位置
278-
const pos = i % rowsCount;
283+
const positionInCol = i % rowsCount;
279284

280285
// 偶数列: 上から下、奇数列: 下から上
281-
// ビット演算での偶奇判定(col % 2より約2倍高速)
282-
const row = (col & 1) ? rowsCount - 1 - pos : pos;
286+
const row =
287+
col % 2 === 0 ? positionInCol : rowsCount - 1 - positionInCol;
283288

284289
result[row][col] = this[i];
285290
}
@@ -1156,9 +1161,14 @@ <h3 class="text-xl font-semibold text-teal-800 mt-8 mb-4">実装方法の比較<
11561161
></script>
11571162

11581163
<!-- Babel Standalone -->
1159-
<script src="https://unpkg.com/@babel/standalone/babel.min.js"></script>
1164+
<script src="https://unpkg.com/@babel/standalone@7.23.5/babel.min.js" integrity="sha384-1qlE7MZPM2pHD/pBZCU/yB8UCP52RYL8bge/qNdfNBCWToySp8/M+JL2waXU4hjJ" crossorigin="anonymous"></script>
11601165

1161-
<!-- Prism.js -->
1166+
<!-- Prism.js & Plugins (SRI Protected) -->
1167+
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/prism.min.js" integrity="sha384-06z5D//U/xpvxZHuUz92xBvq3DqBBFi7Up53HRrbV7Jlv7Yvh/MZ7oenfUe9iCEt" crossorigin="anonymous"></script>
1168+
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/components/prism-typescript.min.js" integrity="sha384-PeOqKNW/piETaCg8rqKFy+Pm6KEk7e36/5YZE5XO/OaFdO+/Aw3O8qZ9qDPKVUgx" crossorigin="anonymous"></script>
1169+
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/plugins/line-numbers/prism-line-numbers.min.js" integrity="sha384-6QJu8apxMmB9TiPVWzYKF5pRgKcz7snO0/QU+MrWmgBLECQjoa6erxX2VQ5t41Jd" crossorigin="anonymous"></script>
1170+
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/plugins/toolbar/prism-toolbar.min.js" integrity="sha384-jC1G68eGEXJpPwMDNqyIUQsQlcUCdCU+a7GGuoV4TUZvM1gLYTMJUDvqBnxtZLWA" crossorigin="anonymous"></script>
1171+
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/plugins/copy-to-clipboard/prism-copy-to-clipboard.min.js" integrity="sha384-ZdEfx8sYX8i4IVXU1tUbqwOp4PBUCCmnpagpiHchnstXkEczkzPfUd9fvBrntM+F" crossorigin="anonymous"></script>
11621172

11631173
<!-- React Component -->
11641174
<script type="text/babel">
@@ -1287,36 +1297,18 @@ <h3 class="text-xl font-semibold text-teal-800 mt-8 mb-4">実装方法の比較<
12871297
<p className="font-semibold text-emerald-900">
12881298
Snail Traversalパターン:
12891299
</p>
1290-
<ul className="space-y-1 text-slate-700 mt-2">
1291-
<li>
1292-
• 列0: 上から下 [
1293-
{visual.result2d.map((r) => r[0]).join(', ')}]
1294-
</li>
1295-
<li>
1296-
• 列1: 下から上 [
1297-
{[...visual.result2d]
1298-
.reverse()
1299-
.map((r) => r[1])
1300-
.join(', ')}
1301-
]
1302-
</li>
1303-
{visual.result2d[0].length > 2 && (
1304-
<li>
1305-
• 列2: 上から下 [
1306-
{visual.result2d.map((r) => r[2]).join(', ')}]
1307-
</li>
1308-
)}
1309-
{visual.result2d[0].length > 3 && (
1310-
<li>
1311-
• 列3: 下から上 [
1312-
{[...visual.result2d]
1313-
.reverse()
1314-
.map((r) => r[3])
1315-
.join(', ')}
1316-
]
1317-
</li>
1318-
)}
1319-
</ul>
1300+
{visual.result2d[0].map((_, colIdx) => {
1301+
const isEvenCol = colIdx % 2 === 0;
1302+
const colValues = isEvenCol
1303+
? visual.result2d.map(r => r[colIdx])
1304+
: [...visual.result2d].reverse().map(r => r[colIdx]);
1305+
1306+
return (
1307+
<li key={colIdx}>
1308+
• 列{colIdx}: {isEvenCol ? '上から下' : '下から上'} [{colValues.join(', ')}]
1309+
</li>
1310+
);
1311+
})}
13201312
</div>
13211313
</div>
13221314
)}
@@ -1486,12 +1478,6 @@ <h3 class="text-xl font-semibold text-teal-800 mt-8 mb-4">実装方法の比較<
14861478

14871479
useEffect(() => {
14881480
if (isPlaying) {
1489-
if (activeStep > stepsData.length) {
1490-
setIsPlaying(false);
1491-
setActiveStep(1);
1492-
return;
1493-
}
1494-
14951481
timerRef.current = setTimeout(() => {
14961482
if (activeStep === stepsData.length) {
14971483
setActiveStep(1);

JavaScript/2624. Snail Traversal/Claude Code Sonnet 4.5/Snail_Traversal_TS.ipynb

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,7 @@
144144
"1. **Prototype拡張の型定義**\n",
145145
" - `declare global`で型定義を拡張\n",
146146
" - `Array<T>`インターフェースへの安全な追加\n",
147-
" - 戻り値型`number[][]`を明示的に定義\n",
147+
" - 戻り値型`T[][]`を明示的に定義\n",
148148
"\n",
149149
"2. **型推論の活用**\n",
150150
" - `this`が自動的に`T[]`として推論される\n",
@@ -317,8 +317,8 @@
317317
"\n",
318318
"| 項目 | 現在 | 最適化版 | 高速化版 |\n",
319319
"|-----|------|---------|---------|\n",
320-
"| Runtime | 158ms (60%) | ~140ms (75%予想) | ~125ms (85%予想) |\n",
321-
"| Memory | 69.73MB (66%) | ~68MB (75%予想) | ~67MB (80%予想) |\n",
320+
"| Runtime | 158ms (60%) | 154ms | 158ms |\n",
321+
"| Memory | 69.73MB (66%) | 69.54MB | 69.10MB |\n",
322322
"\n",
323323
"## メモリ最優先版(Memory Beats 90%+目標)\n",
324324
"\n",

0 commit comments

Comments
 (0)