Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
<title>Best Divisor - √n約数列挙+桁和比較</title>

<!-- Tailwind CSS -->
<script src="https://cdn.tailwindcss.com" crossorigin="anonymous"></script>
<script src="https://cdn.tailwindcss.com"></script>

<!-- Google Fonts -->
<link rel="preconnect" href="https://fonts.googleapis.com" />
Expand All @@ -20,20 +20,14 @@
<link
href="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/themes/prism-tomorrow.min.css"
rel="stylesheet"
integrity="sha512-vswe+cgvic/XBoF1OcM/TeJ2FW0OofqAVdCZiEYkd6dwGXthvkSFWOoGGJgS2CW70VK5dQM5Oh+7ne47s74VTg=="
crossorigin="anonymous"
/>
<link
href="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/plugins/line-numbers/prism-line-numbers.min.css"
rel="stylesheet"
integrity="sha512-cbQXwDFK7lj2Fqfkuxbo5iD1dSbLlJGXGpfTDqbggqjHJeyzx88I3rfwjS38WJag/ihH7lzuGlGHpDBymLirZQ=="
crossorigin="anonymous"
/>
<link
href="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/plugins/toolbar/prism-toolbar.min.css"
rel="stylesheet"
integrity="sha512-Dqf5696xtofgH089BgZJo2lSWTvev4GFo+gA2o4GullFY65rzQVQLQVlzLvYwTo0Bb2Gpb6IqwxYWtoMonfdhQ=="
crossorigin="anonymous"
/>

<style>
Expand Down Expand Up @@ -83,7 +77,7 @@
>
<h1 class="text-[2.5rem] font-bold text-teal-800 mb-2">Best Divisor</h1>
<p class="text-xl text-cyan-700 font-semibold mt-2">
√n約数列挙+桁和比較 による O(√n) 実装
√n約数列挙+桁和比較 による O(√n + d·log n) 実装
</p>
<nav class="flex flex-wrap gap-4 mt-6">
<a
Expand Down Expand Up @@ -171,8 +165,8 @@ <h3 class="text-xl font-bold text-teal-800 mt-6 mb-3">戦略</h3>
<h3 class="text-xl font-bold text-teal-800 mt-6 mb-3">主要ポイント</h3>
<ul class="list-disc list-inside space-y-2 text-slate-700 ml-4">
<li>
<strong>時間計算量:</strong> O(√n) - √n までのループ + O(d log d)
の桁和計算(d は約数の個数)
<strong>時間計算量:</strong> O(√n + d·log n) - √n までのループ +
各約数の桁和計算 O(log n)
</li>
<li><strong>空間計算量:</strong> O(d) - 約数リストの保存</li>
<li>
Expand Down Expand Up @@ -1085,10 +1079,10 @@ <h3 class="text-lg font-bold text-slate-700 mb-3">📖 フローチャートの
<td class="border-2 border-slate-200 px-4 py-3">
<span
class="px-3 py-1 bg-emerald-100 text-emerald-800 rounded-full font-mono font-bold"
>O(√n)</span
>O(√n + d·log n)</span
>
<div class="text-sm text-slate-600 mt-1">
√n までループ + O(d log d) 桁和計算
√n までループ + 各約数の桁和計算 O(log n)
</div>
</td>
<td class="border-2 border-slate-200 px-4 py-3">
Expand Down Expand Up @@ -1214,31 +1208,11 @@ <h3 class="text-xl font-bold text-teal-800 mt-8 mb-3">具体例での計算量</
<script src="https://unpkg.com/@babel/standalone/babel.min.js"></script>

<!-- Prism.js -->
<script
src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/prism.min.js"
integrity="sha512-7Z9J3l1+EYfeaPKcGXu3MS/7T+w19WtKQY/n+xzmw4hZhJ9tyYmcUS+4QqAlzhicE5LAfMQSF3iFTK9bQdTxXg=="
crossorigin="anonymous"
></script>
<script
src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/components/prism-python.min.js"
integrity="sha512-AKaNmg8COK0zEbjTdMHJAPJ0z6VeNqvRvH4mfRRWDO9CMxRqi0BlcjWXELn7AbfCvLsZ/SBv8kNEGZOJVdWRCQ=="
crossorigin="anonymous"
></script>
<script
src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/plugins/line-numbers/prism-line-numbers.min.js"
integrity="sha512-BttltKXFyWnGZQcRWj6osIg7lbizJchuAMotOkdLxHxwt/Hyo+cl47bZU0QADg+Qt5DJwni3SbYGXeGMB5cBcw=="
crossorigin="anonymous"
></script>
<script
src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/plugins/toolbar/prism-toolbar.min.js"
integrity="sha512-st608h+ZqzliahyzEpETxzU0f7z7a9acN6AFvYmHvpFhmcFuKT8a22TT5TpKpjDa3pt3Wv7Z3SdQBCBdDPhyWA=="
crossorigin="anonymous"
></script>
<script
src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/plugins/copy-to-clipboard/prism-copy-to-clipboard.min.js"
integrity="sha512-/kVH1yrq7ajXhLpvjMxXJqPp6R9w7bqCjW5xhPjGAJTo9JTlx2NjQnM4+Q8dWmjJoMTaYVm7/ZqfqbWLGz+CIQ=="
crossorigin="anonymous"
></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/prism.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/components/prism-python.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/plugins/line-numbers/prism-line-numbers.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/plugins/toolbar/prism-toolbar.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/plugins/copy-to-clipboard/prism-copy-to-clipboard.min.js"></script>

<!-- React Component -->
<script type="text/babel">
Expand Down Expand Up @@ -1967,6 +1941,19 @@ <h3 class="text-xl font-bold text-teal-800 mt-8 mb-3">具体例での計算量</
viewBox="0 0 600 250"
style={{ maxWidth: '100%', height: 'auto', marginTop: '20px' }}
>
<defs>
<marker
id="step-arrow"
markerWidth="10"
markerHeight="10"
refX="9"
refY="3"
orient="auto"
markerUnits="strokeWidth"
>
<path d="M0,0 L0,6 L9,3 z" fill="#64748b" />
</marker>
</defs>
{/* Input */}
<rect
x="50"
Expand Down Expand Up @@ -2131,7 +2118,7 @@ <h3 class="text-xl font-bold text-teal-800 mt-8 mb-3">具体例での計算量</
return () => {
if (timerRef.current) clearTimeout(timerRef.current);
};
}, [isPlaying, activeStep, stepsData.length]);
}, [isPlaying, activeStep]);

const handlePlay = () => {
if (isPlaying) return;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -112,23 +112,26 @@
" status = \"✓\" if result == expected else \"✗\"\n",
" print(f\"{status} n={n}: expected={expected}, got={result}\")\n",
"\n",
"# 詳細デバッグ用\n",
"print(\"\\n=== n=12 の詳細 ===\")\n",
"n = 12\n",
"divisors = []\n",
"i = 1\n",
"while i * i <= n:\n",
" if n % i == 0:\n",
" divisors.append(i)\n",
" if i != n // i:\n",
" divisors.append(n // i)\n",
" i += 1\n",
"\n",
"print(f\"約数: {sorted(divisors)}\")\n",
"for d in sorted(divisors):\n",
" digit_sum = sum(int(digit) for digit in str(d))\n",
" print(f\" {d} → 桁和 = {digit_sum}\")\n",
"print(f\"最良約数: {findBestDivisor(n)}\")"
"# 詳細デバッグ用(n=12 の例)\n",
"def show_divisor_details(n):\n",
" \"\"\"約数とその桁和を表示するヘルパー関数\"\"\"\n",
" divisors = []\n",
" i = 1\n",
" while i * i <= n:\n",
" if n % i == 0:\n",
" divisors.append(i)\n",
" if i != n // i:\n",
" divisors.append(n // i)\n",
" i += 1\n",
" \n",
" print(f\"\\n=== n={n} の詳細 ===\")\n",
" print(f\"約数: {sorted(divisors)}\")\n",
" for d in sorted(divisors):\n",
" digit_sum = sum(int(digit) for digit in str(d))\n",
" print(f\" {d} → 桁和 = {digit_sum}\")\n",
" print(f\"最良約数: {findBestDivisor(n)}\")\n",
"\n",
"show_divisor_details(12)"
Comment on lines +115 to +134

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick | 🔵 Trivial

約数列挙ロジックが findBestDivisor と重複しています(DRY違反)

show_divisor_details 内の約数列挙(Lines 118-125)は findBestDivisor(Lines 68-78)と同一のロジックです。アルゴリズム変更時に両方を更新する必要があり、不整合のリスクがあります。

約数列挙を共通ヘルパーに抽出するか、少なくとも最良約数の出力には既存の findBestDivisor を再利用することを検討してください。現状 Line 132 では findBestDivisor(n) を呼んでいますが、約数リスト自体も共有できます。

♻️ リファクタ案
+def get_divisors(n):
+    """nの約数リストを返すヘルパー関数"""
+    divisors = []
+    i = 1
+    while i * i <= n:
+        if n % i == 0:
+            divisors.append(i)
+            if i != n // i:
+                divisors.append(n // i)
+        i += 1
+    return divisors
+
 def show_divisor_details(n):
     """約数とその桁和を表示するヘルパー関数"""
-    divisors = []
-    i = 1
-    while i * i <= n:
-        if n % i == 0:
-            divisors.append(i)
-            if i != n // i:
-                divisors.append(n // i)
-        i += 1
+    divisors = get_divisors(n)
 
     print(f"\n=== n={n} の詳細 ===")
     print(f"約数: {sorted(divisors)}")
     for d in sorted(divisors):
         digit_sum = sum(int(digit) for digit in str(d))
         print(f"  {d} → 桁和 = {digit_sum}")
     print(f"最良約数: {findBestDivisor(n)}")
🤖 Prompt for AI Agents
In `@Mathematics/Fundamentals/HackerRank/Claude/Easy/Best`
Divisor/BestDivisor.ipynb around lines 115 - 134, Extract the
divisor-enumeration logic from show_divisor_details into a shared helper (e.g.,
get_divisors) and have both findBestDivisor and show_divisor_details call that
helper; specifically, move the loop that builds divisors (the logic using i, i*i
<= n, n % i == 0, appending i and n//i) into get_divisors(n) and replace the
inline loop in show_divisor_details with a call to get_divisors(n), and modify
findBestDivisor to call get_divisors(n) instead of duplicating the logic so the
divisor list is computed once and reused.

]
},
{
Expand Down