60 lines
1.5 KiB
Python
60 lines
1.5 KiB
Python
from typing import List, Dict, Any, Tuple
|
|
|
|
def calc_metrics(numbers: List[int]) -> Dict[str, Any]:
|
|
nums = sorted(numbers)
|
|
s = sum(nums)
|
|
odd = sum(1 for x in nums if x % 2 == 1)
|
|
even = len(nums) - odd
|
|
mn, mx = nums[0], nums[-1]
|
|
rng = mx - mn
|
|
|
|
# 1-10, 11-20, 21-30, 31-40, 41-45
|
|
buckets = {
|
|
"1-10": 0,
|
|
"11-20": 0,
|
|
"21-30": 0,
|
|
"31-40": 0,
|
|
"41-45": 0,
|
|
}
|
|
for x in nums:
|
|
if 1 <= x <= 10:
|
|
buckets["1-10"] += 1
|
|
elif 11 <= x <= 20:
|
|
buckets["11-20"] += 1
|
|
elif 21 <= x <= 30:
|
|
buckets["21-30"] += 1
|
|
elif 31 <= x <= 40:
|
|
buckets["31-40"] += 1
|
|
else:
|
|
buckets["41-45"] += 1
|
|
|
|
return {
|
|
"sum": s,
|
|
"odd": odd,
|
|
"even": even,
|
|
"min": mn,
|
|
"max": mx,
|
|
"range": rng,
|
|
"buckets": buckets,
|
|
}
|
|
|
|
def calc_recent_overlap(numbers: List[int], draws: List[Tuple[int, List[int]]], last_k: int) -> Dict[str, Any]:
|
|
"""
|
|
draws: [(drw_no, [n1..n6]), ...] 오름차순
|
|
last_k: 최근 k회 기준 중복
|
|
"""
|
|
if last_k <= 0:
|
|
return {"last_k": 0, "repeats": 0, "repeated_numbers": []}
|
|
|
|
recent = draws[-last_k:] if len(draws) >= last_k else draws
|
|
recent_set = set()
|
|
for _, nums in recent:
|
|
recent_set.update(nums)
|
|
|
|
repeated = sorted(set(numbers) & recent_set)
|
|
return {
|
|
"last_k": len(recent),
|
|
"repeats": len(repeated),
|
|
"repeated_numbers": repeated,
|
|
}
|