Skip to content

Commit 3487276

Browse files
committed
fix: resolve review comments across multiple solutions and UI components
- LeetCode 83: Add ARIA tab semantics to CodeTabs component in React visualizations - LeetCode 83: Fix NodeVis highlight zero-based indexing - JavaScript 2627 (Debounce): Fix timer creation to be outside lock and use nonlocal in throttle example - SQL 1164 (Product Price): Restore O(N) idxmax approach instead of sorting and add trailing newline
1 parent 6ffa54f commit 3487276

4 files changed

Lines changed: 63 additions & 9 deletions

File tree

Algorithm/Other/leetcode/83. Remove Duplicates from Sorted List/Claude 4.6 extended/README_React.html

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1211,26 +1211,49 @@ <h3 className="mt-0 mb-3 text-teal-800 text-base font-bold outfit">
12111211
if (window.Prism) window.Prism.highlightAll();
12121212
}, [tab]);
12131213

1214+
const handleKeyDown = (e, keys) => {
1215+
const idx = keys.indexOf(tab);
1216+
if (e.key === 'ArrowRight') {
1217+
e.preventDefault();
1218+
const nextIdx = (idx + 1) % keys.length;
1219+
setTab(keys[nextIdx]);
1220+
document.getElementById(`${keys[nextIdx]}-tab`)?.focus();
1221+
} else if (e.key === 'ArrowLeft') {
1222+
e.preventDefault();
1223+
const prevIdx = (idx - 1 + keys.length) % keys.length;
1224+
setTab(keys[prevIdx]);
1225+
document.getElementById(`${keys[prevIdx]}-tab`)?.focus();
1226+
}
1227+
};
1228+
1229+
const keys = Object.keys(codeData);
1230+
12141231
return (
12151232
<div>
1216-
<div className="flex gap-2 mb-4 flex-wrap">
1233+
<div className="flex gap-2 mb-4 flex-wrap" role="tablist">
12171234
{Object.entries(codeData).map(([key, { label }]) => (
12181235
<button
12191236
key={key}
12201237
type="button"
1238+
role="tab"
1239+
aria-selected={tab === key}
1240+
id={`${key}-tab`}
1241+
aria-controls={`${key}-panel`}
1242+
tabIndex={tab === key ? 0 : -1}
12211243
className={[
12221244
'tab-btn outfit px-4 py-1.5 rounded-lg font-bold text-sm border-2 border-slate-200 bg-white transition',
12231245
tab === key
12241246
? 'active'
12251247
: 'text-slate-600 hover:border-emerald-400',
12261248
].join(' ')}
12271249
onClick={() => setTab(key)}
1250+
onKeyDown={(e) => handleKeyDown(e, keys)}
12281251
>
12291252
{label}
12301253
</button>
12311254
))}
12321255
</div>
1233-
<div key={tab} className="fade-slide">
1256+
<div key={tab} className="fade-slide" role="tabpanel" id={`${tab}-panel`} aria-labelledby={`${tab}-tab`}>
12341257
<pre
12351258
className="line-numbers"
12361259
style={{ borderRadius: '12px', fontSize: '13px' }}

JavaScript/2627. Debounce/Claude Code Sonnet 4.5 extended/README.md

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -486,15 +486,23 @@ my_func_debounced = debounce(my_func, 100)
486486

487487
```python
488488
import time
489+
from threading import Lock
490+
489491
# throttle の例(参考)
490492
def throttle(fn: Callable, t: float) -> Callable:
491-
last_call = [0.0]
493+
last_call: float = 0.0
494+
lock = Lock()
492495

493496
def throttled(*args, **kwargs):
497+
nonlocal last_call
494498
now = time.time()
495-
if now - last_call[0] >= t / 1000.0:
496-
last_call[0] = now
497-
fn(*args, **kwargs)
499+
500+
with lock:
501+
if now - last_call >= t / 1000.0:
502+
last_call = now
503+
# 注: fn自体が長時間ブロックする可能性がある場合は
504+
# 別スレッドで実行するか、lockのスコープを狭めるなどの工夫が必要
505+
fn(*args, **kwargs)
498506

499507
return throttled
500508
```

SQL/Leetcode/Intermediate Join/1164. Product Price at a Given Date/Claude Sonnet 4.5 Extended/Product_Price_at_a_Given_Date_pandas.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -220,4 +220,4 @@ def price_at_given_date(products: pd.DataFrame) -> pd.DataFrame:
220220
'product_id': all_products['product_id'],
221221
'price': all_products['product_id'].map(price_mapper).fillna(10).astype(int)
222222
})
223-
```
223+
```

public/Algorithm/Other/leetcode/83. Remove Duplicates from Sorted List/Claude 4.6 extended/README_React.html

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1211,26 +1211,49 @@ <h3 className="mt-0 mb-3 text-teal-800 text-base font-bold outfit">
12111211
if (window.Prism) window.Prism.highlightAll();
12121212
}, [tab]);
12131213

1214+
const handleKeyDown = (e, keys) => {
1215+
const idx = keys.indexOf(tab);
1216+
if (e.key === 'ArrowRight') {
1217+
e.preventDefault();
1218+
const nextIdx = (idx + 1) % keys.length;
1219+
setTab(keys[nextIdx]);
1220+
document.getElementById(`${keys[nextIdx]}-tab`)?.focus();
1221+
} else if (e.key === 'ArrowLeft') {
1222+
e.preventDefault();
1223+
const prevIdx = (idx - 1 + keys.length) % keys.length;
1224+
setTab(keys[prevIdx]);
1225+
document.getElementById(`${keys[prevIdx]}-tab`)?.focus();
1226+
}
1227+
};
1228+
1229+
const keys = Object.keys(codeData);
1230+
12141231
return (
12151232
<div>
1216-
<div className="flex gap-2 mb-4 flex-wrap">
1233+
<div className="flex gap-2 mb-4 flex-wrap" role="tablist">
12171234
{Object.entries(codeData).map(([key, { label }]) => (
12181235
<button
12191236
key={key}
12201237
type="button"
1238+
role="tab"
1239+
aria-selected={tab === key}
1240+
id={`${key}-tab`}
1241+
aria-controls={`${key}-panel`}
1242+
tabIndex={tab === key ? 0 : -1}
12211243
className={[
12221244
'tab-btn outfit px-4 py-1.5 rounded-lg font-bold text-sm border-2 border-slate-200 bg-white transition',
12231245
tab === key
12241246
? 'active'
12251247
: 'text-slate-600 hover:border-emerald-400',
12261248
].join(' ')}
12271249
onClick={() => setTab(key)}
1250+
onKeyDown={(e) => handleKeyDown(e, keys)}
12281251
>
12291252
{label}
12301253
</button>
12311254
))}
12321255
</div>
1233-
<div key={tab} className="fade-slide">
1256+
<div key={tab} className="fade-slide" role="tabpanel" id={`${tab}-panel`} aria-labelledby={`${tab}-tab`}>
12341257
<pre
12351258
className="line-numbers"
12361259
style={{ borderRadius: '12px', fontSize: '13px' }}

0 commit comments

Comments
 (0)