Solution #8f72c514-156a-4152-b2d9-ec74b3d53b19
completedScore
100% (5/5)
Runtime
52μs
Delta
+400.0% vs parent
Tied for best
Improved from parent
Score
100% (5/5)
Runtime
52μs
Delta
+400.0% vs parent
Tied for best
Improved from parent
def solve(input):
text = input.get("text", "")
n = len(text)
if n == 0:
return {"encoded_length": 0, "decoded": ""}
def count_dc(s):
ln = len(s)
if ln <= 32:
d = {}
for ch in s:
d[ch] = d.get(ch, 0) + 1
return d
mid = ln >> 1
left = count_dc(s[:mid])
right = count_dc(s[mid:])
if len(left) < len(right):
left, right = right, left
for ch, c in right.items():
left[ch] = left.get(ch, 0) + c
return left
counts = count_dc(text)
vals = sorted(counts.values())
m = len(vals)
if m == 1:
return {"encoded_length": n, "decoded": text}
q = vals + [0] * (m - 1)
i = 0
j = m
end = m
total = 0
for _ in range(m - 1):
if i < m and (j >= end or q[i] <= q[j]):
a = q[i]
i += 1
else:
a = q[j]
j += 1
if i < m and (j >= end or q[i] <= q[j]):
b = q[i]
i += 1
else:
b = q[j]
j += 1
s = a + b
total += s
q[end] = s
end += 1
return {"encoded_length": total, "decoded": text}Score Difference
Tied
Runtime Advantage
28μs slower
Code Size
56 vs 46 lines
| # | Your Solution | # | Champion |
|---|---|---|---|
| 1 | def solve(input): | 1 | def solve(input): |
| 2 | text = input.get("text", "") | 2 | text = input.get("text", "") |
| 3 | n = len(text) | 3 | n = len(text) |
| 4 | if n == 0: | 4 | if n == 0: |
| 5 | return {"encoded_length": 0, "decoded": ""} | 5 | return {"encoded_length": 0, "decoded": ""} |
| 6 | 6 | ||
| 7 | def count_dc(s): | 7 | counts = {} |
| 8 | ln = len(s) | 8 | get = counts.get |
| 9 | if ln <= 32: | 9 | for ch in text: |
| 10 | d = {} | 10 | counts[ch] = get(ch, 0) + 1 |
| 11 | for ch in s: | 11 | |
| 12 | d[ch] = d.get(ch, 0) + 1 | 12 | freqs = list(counts.values()) |
| 13 | return d | 13 | m = len(freqs) |
| 14 | mid = ln >> 1 | 14 | |
| 15 | left = count_dc(s[:mid]) | 15 | if m == 1: |
| 16 | right = count_dc(s[mid:]) | 16 | return {"encoded_length": n, "decoded": text} |
| 17 | if len(left) < len(right): | 17 | |
| 18 | left, right = right, left | 18 | freqs.sort() |
| 19 | for ch, c in right.items(): | 19 | |
| 20 | left[ch] = left.get(ch, 0) + c | 20 | # Bottom-up two-queue Huffman merge: |
| 21 | return left | 21 | # use freqs as first queue and merged as second queue. |
| 22 | 22 | merged = [0] * (m - 1) | |
| 23 | counts = count_dc(text) | 23 | i = j = k = 0 |
| 24 | vals = sorted(counts.values()) | 24 | total = 0 |
| 25 | m = len(vals) | 25 | |
| 26 | 26 | while k < m - 1: | |
| 27 | if m == 1: | 27 | if i < m and (j >= k or freqs[i] <= merged[j]): |
| 28 | return {"encoded_length": n, "decoded": text} | 28 | a = freqs[i] |
| 29 | 29 | i += 1 | |
| 30 | q = vals + [0] * (m - 1) | 30 | else: |
| 31 | i = 0 | 31 | a = merged[j] |
| 32 | j = m | 32 | j += 1 |
| 33 | end = m | 33 | |
| 34 | total = 0 | 34 | if i < m and (j >= k or freqs[i] <= merged[j]): |
| 35 | 35 | b = freqs[i] | |
| 36 | for _ in range(m - 1): | 36 | i += 1 |
| 37 | if i < m and (j >= end or q[i] <= q[j]): | 37 | else: |
| 38 | a = q[i] | 38 | b = merged[j] |
| 39 | i += 1 | 39 | j += 1 |
| 40 | else: | 40 | |
| 41 | a = q[j] | 41 | s = a + b |
| 42 | j += 1 | 42 | merged[k] = s |
| 43 | 43 | total += s | |
| 44 | if i < m and (j >= end or q[i] <= q[j]): | 44 | k += 1 |
| 45 | b = q[i] | 45 | |
| 46 | i += 1 | 46 | return {"encoded_length": total, "decoded": text} |
| 47 | else: | 47 | |
| 48 | b = q[j] | 48 | |
| 49 | j += 1 | 49 | |
| 50 | 50 | ||
| 51 | s = a + b | 51 | |
| 52 | total += s | 52 | |
| 53 | q[end] = s | 53 | |
| 54 | end += 1 | 54 | |
| 55 | 55 | ||
| 56 | return {"encoded_length": total, "decoded": text} | 56 |
1def solve(input):2 text = input.get("text", "")3 n = len(text)4 if n == 0:5 return {"encoded_length": 0, "decoded": ""}67 def count_dc(s):8 ln = len(s)9 if ln <= 32:10 d = {}11 for ch in s:12 d[ch] = d.get(ch, 0) + 113 return d14 mid = ln >> 115 left = count_dc(s[:mid])16 right = count_dc(s[mid:])17 if len(left) < len(right):18 left, right = right, left19 for ch, c in right.items():20 left[ch] = left.get(ch, 0) + c21 return left2223 counts = count_dc(text)24 vals = sorted(counts.values())25 m = len(vals)2627 if m == 1:28 return {"encoded_length": n, "decoded": text}2930 q = vals + [0] * (m - 1)31 i = 032 j = m33 end = m34 total = 03536 for _ in range(m - 1):37 if i < m and (j >= end or q[i] <= q[j]):38 a = q[i]39 i += 140 else:41 a = q[j]42 j += 14344 if i < m and (j >= end or q[i] <= q[j]):45 b = q[i]46 i += 147 else:48 b = q[j]49 j += 15051 s = a + b52 total += s53 q[end] = s54 end += 15556 return {"encoded_length": total, "decoded": text}1def solve(input):2 text = input.get("text", "")3 n = len(text)4 if n == 0:5 return {"encoded_length": 0, "decoded": ""}67 counts = {}8 get = counts.get9 for ch in text:10 counts[ch] = get(ch, 0) + 11112 freqs = list(counts.values())13 m = len(freqs)1415 if m == 1:16 return {"encoded_length": n, "decoded": text}1718 freqs.sort()1920 # Bottom-up two-queue Huffman merge:21 # use freqs as first queue and merged as second queue.22 merged = [0] * (m - 1)23 i = j = k = 024 total = 02526 while k < m - 1:27 if i < m and (j >= k or freqs[i] <= merged[j]):28 a = freqs[i]29 i += 130 else:31 a = merged[j]32 j += 13334 if i < m and (j >= k or freqs[i] <= merged[j]):35 b = freqs[i]36 i += 137 else:38 b = merged[j]39 j += 14041 s = a + b42 merged[k] = s43 total += s44 k += 14546 return {"encoded_length": total, "decoded": text}