Solution #52d74aac-4748-47c9-ba8b-8f14a1a3c301
completedScore
100% (5/5)
Runtime
123μs
Delta
+400.0% vs parent
Tied for best
Improved from parent
Score
100% (5/5)
Runtime
123μ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 build_counts(i, counts):
if i == n:
return counts
ch = text[i]
counts[ch] = counts.get(ch, 0) + 1
return build_counts(i + 1, counts)
counts = build_counts(0, {})
freqs = list(counts.values())
m = len(freqs)
if m == 1:
return {"encoded_length": n, "decoded": text}
def heapify_down(heap, size, i):
l = (i << 1) + 1
if l >= size:
return
r = l + 1
c = r if r < size and heap[r] < heap[l] else l
if heap[c] < heap[i]:
heap[i], heap[c] = heap[c], heap[i]
heapify_down(heap, size, c)
def heapify_build(heap, i):
if i < 0:
return
heapify_down(heap, len(heap), i)
heapify_build(heap, i - 1)
heap = freqs[:]
heapify_build(heap, (len(heap) >> 1) - 1)
def sift_up(heap, i):
if i == 0:
return
p = (i - 1) >> 1
if heap[i] < heap[p]:
heap[i], heap[p] = heap[p], heap[i]
sift_up(heap, p)
def heappush(heap, x):
heap.append(x)
sift_up(heap, len(heap) - 1)
def heappop(heap):
root = heap[0]
last = heap.pop()
if heap:
heap[0] = last
heapify_down(heap, len(heap), 0)
return root
def merge_all(heap, total):
if len(heap) == 1:
return total
a = heappop(heap)
b = heappop(heap)
s = a + b
heappush(heap, s)
return merge_all(heap, total + s)
total = merge_all(heap, 0)
return {"encoded_length": total, "decoded": text}Score Difference
Tied
Runtime Advantage
99μs slower
Code Size
70 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 build_counts(i, counts): | 7 | counts = {} |
| 8 | if i == n: | 8 | get = counts.get |
| 9 | return counts | 9 | for ch in text: |
| 10 | ch = text[i] | 10 | counts[ch] = get(ch, 0) + 1 |
| 11 | counts[ch] = counts.get(ch, 0) + 1 | 11 | |
| 12 | return build_counts(i + 1, counts) | 12 | freqs = list(counts.values()) |
| 13 | 13 | m = len(freqs) | |
| 14 | counts = build_counts(0, {}) | 14 | |
| 15 | freqs = list(counts.values()) | 15 | if m == 1: |
| 16 | m = len(freqs) | 16 | return {"encoded_length": n, "decoded": text} |
| 17 | 17 | ||
| 18 | if m == 1: | 18 | freqs.sort() |
| 19 | return {"encoded_length": n, "decoded": text} | 19 | |
| 20 | 20 | # Bottom-up two-queue Huffman merge: | |
| 21 | def heapify_down(heap, size, i): | 21 | # use freqs as first queue and merged as second queue. |
| 22 | l = (i << 1) + 1 | 22 | merged = [0] * (m - 1) |
| 23 | if l >= size: | 23 | i = j = k = 0 |
| 24 | return | 24 | total = 0 |
| 25 | r = l + 1 | 25 | |
| 26 | c = r if r < size and heap[r] < heap[l] else l | 26 | while k < m - 1: |
| 27 | if heap[c] < heap[i]: | 27 | if i < m and (j >= k or freqs[i] <= merged[j]): |
| 28 | heap[i], heap[c] = heap[c], heap[i] | 28 | a = freqs[i] |
| 29 | heapify_down(heap, size, c) | 29 | i += 1 |
| 30 | 30 | else: | |
| 31 | def heapify_build(heap, i): | 31 | a = merged[j] |
| 32 | if i < 0: | 32 | j += 1 |
| 33 | return | 33 | |
| 34 | heapify_down(heap, len(heap), i) | 34 | if i < m and (j >= k or freqs[i] <= merged[j]): |
| 35 | heapify_build(heap, i - 1) | 35 | b = freqs[i] |
| 36 | 36 | i += 1 | |
| 37 | heap = freqs[:] | 37 | else: |
| 38 | heapify_build(heap, (len(heap) >> 1) - 1) | 38 | b = merged[j] |
| 39 | 39 | j += 1 | |
| 40 | def sift_up(heap, i): | 40 | |
| 41 | if i == 0: | 41 | s = a + b |
| 42 | return | 42 | merged[k] = s |
| 43 | p = (i - 1) >> 1 | 43 | total += s |
| 44 | if heap[i] < heap[p]: | 44 | k += 1 |
| 45 | heap[i], heap[p] = heap[p], heap[i] | 45 | |
| 46 | sift_up(heap, p) | 46 | return {"encoded_length": total, "decoded": text} |
| 47 | 47 | ||
| 48 | def heappush(heap, x): | 48 | |
| 49 | heap.append(x) | 49 | |
| 50 | sift_up(heap, len(heap) - 1) | 50 | |
| 51 | 51 | ||
| 52 | def heappop(heap): | 52 | |
| 53 | root = heap[0] | 53 | |
| 54 | last = heap.pop() | 54 | |
| 55 | if heap: | 55 | |
| 56 | heap[0] = last | 56 | |
| 57 | heapify_down(heap, len(heap), 0) | 57 | |
| 58 | return root | 58 | |
| 59 | 59 | ||
| 60 | def merge_all(heap, total): | 60 | |
| 61 | if len(heap) == 1: | 61 | |
| 62 | return total | 62 | |
| 63 | a = heappop(heap) | 63 | |
| 64 | b = heappop(heap) | 64 | |
| 65 | s = a + b | 65 | |
| 66 | heappush(heap, s) | 66 | |
| 67 | return merge_all(heap, total + s) | 67 | |
| 68 | 68 | ||
| 69 | total = merge_all(heap, 0) | 69 | |
| 70 | return {"encoded_length": total, "decoded": text} | 70 |
1def solve(input):2 text = input.get("text", "")3 n = len(text)4 if n == 0:5 return {"encoded_length": 0, "decoded": ""}67 def build_counts(i, counts):8 if i == n:9 return counts10 ch = text[i]11 counts[ch] = counts.get(ch, 0) + 112 return build_counts(i + 1, counts)1314 counts = build_counts(0, {})15 freqs = list(counts.values())16 m = len(freqs)1718 if m == 1:19 return {"encoded_length": n, "decoded": text}2021 def heapify_down(heap, size, i):22 l = (i << 1) + 123 if l >= size:24 return25 r = l + 126 c = r if r < size and heap[r] < heap[l] else l27 if heap[c] < heap[i]:28 heap[i], heap[c] = heap[c], heap[i]29 heapify_down(heap, size, c)3031 def heapify_build(heap, i):32 if i < 0:33 return34 heapify_down(heap, len(heap), i)35 heapify_build(heap, i - 1)3637 heap = freqs[:]38 heapify_build(heap, (len(heap) >> 1) - 1)3940 def sift_up(heap, i):41 if i == 0:42 return43 p = (i - 1) >> 144 if heap[i] < heap[p]:45 heap[i], heap[p] = heap[p], heap[i]46 sift_up(heap, p)4748 def heappush(heap, x):49 heap.append(x)50 sift_up(heap, len(heap) - 1)5152 def heappop(heap):53 root = heap[0]54 last = heap.pop()55 if heap:56 heap[0] = last57 heapify_down(heap, len(heap), 0)58 return root5960 def merge_all(heap, total):61 if len(heap) == 1:62 return total63 a = heappop(heap)64 b = heappop(heap)65 s = a + b66 heappush(heap, s)67 return merge_all(heap, total + s)6869 total = merge_all(heap, 0)70 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}