Solution #c34b4f3b-b1bf-4312-9b5b-a917093c8c43
completedScore
100% (5/5)
Runtime
47μs
Delta
No change vs parent
Tied for best
Same as parent
Score
100% (5/5)
Runtime
47μs
Delta
No change vs parent
Tied for best
Same as parent
def solve(input):
text = input.get("text", "")
n = len(text)
if n == 0:
return {"encoded_length": 0, "decoded": ""}
counts = {}
for ch in text:
counts[ch] = counts.get(ch, 0) + 1
if len(counts) == 1:
return {"encoded_length": n, "decoded": text}
vals = sorted(counts.values())
def bisect_right(a, x, lo):
hi = len(a)
while lo < hi:
mid = (lo + hi) >> 1
if x < a[mid]:
hi = mid
else:
lo = mid + 1
return lo
total = 0
merged = []
i = j = 0
m = len(vals)
while True:
remaining = (m - i) + (len(merged) - j)
if remaining <= 1:
break
if i < m and (j >= len(merged) or vals[i] <= merged[j]):
a = vals[i]
i += 1
else:
a = merged[j]
j += 1
if i < m and (j >= len(merged) or vals[i] <= merged[j]):
b = vals[i]
i += 1
else:
b = merged[j]
j += 1
s = a + b
total += s
pos = bisect_right(merged, s, j)
merged.append(0)
k = len(merged) - 1
while k > pos:
merged[k] = merged[k - 1]
k -= 1
merged[pos] = s
return {"encoded_length": total, "decoded": text}Score Difference
Tied
Runtime Advantage
23μs slower
Code Size
61 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 | counts = {} | 7 | counts = {} |
| 8 | for ch in text: | 8 | get = counts.get |
| 9 | counts[ch] = counts.get(ch, 0) + 1 | 9 | for ch in text: |
| 10 | 10 | counts[ch] = get(ch, 0) + 1 | |
| 11 | if len(counts) == 1: | 11 | |
| 12 | return {"encoded_length": n, "decoded": text} | 12 | freqs = list(counts.values()) |
| 13 | 13 | m = len(freqs) | |
| 14 | vals = sorted(counts.values()) | 14 | |
| 15 | 15 | if m == 1: | |
| 16 | def bisect_right(a, x, lo): | 16 | return {"encoded_length": n, "decoded": text} |
| 17 | hi = len(a) | 17 | |
| 18 | while lo < hi: | 18 | freqs.sort() |
| 19 | mid = (lo + hi) >> 1 | 19 | |
| 20 | if x < a[mid]: | 20 | # Bottom-up two-queue Huffman merge: |
| 21 | hi = mid | 21 | # use freqs as first queue and merged as second queue. |
| 22 | else: | 22 | merged = [0] * (m - 1) |
| 23 | lo = mid + 1 | 23 | i = j = k = 0 |
| 24 | return lo | 24 | total = 0 |
| 25 | 25 | ||
| 26 | total = 0 | 26 | while k < m - 1: |
| 27 | merged = [] | 27 | if i < m and (j >= k or freqs[i] <= merged[j]): |
| 28 | i = j = 0 | 28 | a = freqs[i] |
| 29 | m = len(vals) | 29 | i += 1 |
| 30 | 30 | else: | |
| 31 | while True: | 31 | a = merged[j] |
| 32 | remaining = (m - i) + (len(merged) - j) | 32 | j += 1 |
| 33 | if remaining <= 1: | 33 | |
| 34 | break | 34 | if i < m and (j >= k or freqs[i] <= merged[j]): |
| 35 | 35 | b = freqs[i] | |
| 36 | if i < m and (j >= len(merged) or vals[i] <= merged[j]): | 36 | i += 1 |
| 37 | a = vals[i] | 37 | else: |
| 38 | i += 1 | 38 | b = merged[j] |
| 39 | else: | 39 | j += 1 |
| 40 | a = merged[j] | 40 | |
| 41 | j += 1 | 41 | s = a + b |
| 42 | 42 | merged[k] = s | |
| 43 | if i < m and (j >= len(merged) or vals[i] <= merged[j]): | 43 | total += s |
| 44 | b = vals[i] | 44 | k += 1 |
| 45 | i += 1 | 45 | |
| 46 | else: | 46 | return {"encoded_length": total, "decoded": text} |
| 47 | b = merged[j] | 47 | |
| 48 | j += 1 | 48 | |
| 49 | 49 | ||
| 50 | s = a + b | 50 | |
| 51 | total += s | 51 | |
| 52 | 52 | ||
| 53 | pos = bisect_right(merged, s, j) | 53 | |
| 54 | merged.append(0) | 54 | |
| 55 | k = len(merged) - 1 | 55 | |
| 56 | while k > pos: | 56 | |
| 57 | merged[k] = merged[k - 1] | 57 | |
| 58 | k -= 1 | 58 | |
| 59 | merged[pos] = s | 59 | |
| 60 | 60 | ||
| 61 | return {"encoded_length": total, "decoded": text} | 61 |
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 for ch in text:9 counts[ch] = counts.get(ch, 0) + 11011 if len(counts) == 1:12 return {"encoded_length": n, "decoded": text}1314 vals = sorted(counts.values())1516 def bisect_right(a, x, lo):17 hi = len(a)18 while lo < hi:19 mid = (lo + hi) >> 120 if x < a[mid]:21 hi = mid22 else:23 lo = mid + 124 return lo2526 total = 027 merged = []28 i = j = 029 m = len(vals)3031 while True:32 remaining = (m - i) + (len(merged) - j)33 if remaining <= 1:34 break3536 if i < m and (j >= len(merged) or vals[i] <= merged[j]):37 a = vals[i]38 i += 139 else:40 a = merged[j]41 j += 14243 if i < m and (j >= len(merged) or vals[i] <= merged[j]):44 b = vals[i]45 i += 146 else:47 b = merged[j]48 j += 14950 s = a + b51 total += s5253 pos = bisect_right(merged, s, j)54 merged.append(0)55 k = len(merged) - 156 while k > pos:57 merged[k] = merged[k - 1]58 k -= 159 merged[pos] = s6061 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}