Solution #62082b2d-9da5-46b1-994d-9b75f5adee57
completedScore
100% (5/5)
Runtime
251μs
Delta
No change vs parent
Tied for best
Same as parent
Score
100% (5/5)
Runtime
251μs
Delta
No change vs parent
Tied for best
Same as parent
def solve(input):
text = input.get("text", "")
n = len(text)
if not n:
return {"encoded_length": 0, "decoded": ""}
freq = {}
get = freq.get
for ch in text:
freq[ch] = get(ch, 0) + 1
m = len(freq)
if m == 1:
return {"encoded_length": n, "decoded": text}
class Node:
__slots__ = ("w", "left", "right", "ch")
def __init__(self, w, left=None, right=None, ch=None):
self.w = w
self.left = left
self.right = right
self.ch = ch
heap = [Node(f, None, None, ch) for ch, f in freq.items()]
size = len(heap)
def sift_down(i, size, heap):
item = heap[i]
iw = item.w
while True:
l = (i << 1) + 1
if l >= size:
break
r = l + 1
c = l
cw = heap[l].w
if r < size:
rw = heap[r].w
if rw < cw:
c = r
cw = rw
if cw >= iw:
break
heap[i] = heap[c]
i = c
heap[i] = item
def sift_up(i, heap):
item = heap[i]
iw = item.w
while i:
p = (i - 1) >> 1
pw = heap[p].w
if pw <= iw:
break
heap[i] = heap[p]
i = p
heap[i] = item
for i in range((size >> 1) - 1, -1, -1):
sift_down(i, size, heap)
while size > 1:
a = heap[0]
size -= 1
last = heap[size]
if size:
heap[0] = last
sift_down(0, size, heap)
b = heap[0]
size -= 1
if size:
last = heap[size]
heap[0] = last
sift_down(0, size, heap)
parent = Node(a.w + b.w, a, b, None)
if size < len(heap):
heap[size] = parent
else:
heap.append(parent)
sift_up(size, heap)
size += 1
root = heap[0]
encoded_length = 0
stack = [(root, 0)]
append = stack.append
pop = stack.pop
while stack:
node, depth = pop()
ch = node.ch
if ch is not None:
encoded_length += node.w * depth
else:
nd = depth + 1
append((node.left, nd))
append((node.right, nd))
return {"encoded_length": encoded_length, "decoded": text}Score Difference
Tied
Runtime Advantage
227μs slower
Code Size
102 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 not n: | 4 | if n == 0: |
| 5 | return {"encoded_length": 0, "decoded": ""} | 5 | return {"encoded_length": 0, "decoded": ""} |
| 6 | 6 | ||
| 7 | freq = {} | 7 | counts = {} |
| 8 | get = freq.get | 8 | get = counts.get |
| 9 | for ch in text: | 9 | for ch in text: |
| 10 | freq[ch] = get(ch, 0) + 1 | 10 | counts[ch] = get(ch, 0) + 1 |
| 11 | 11 | ||
| 12 | m = len(freq) | 12 | freqs = list(counts.values()) |
| 13 | if m == 1: | 13 | m = len(freqs) |
| 14 | return {"encoded_length": n, "decoded": text} | 14 | |
| 15 | 15 | if m == 1: | |
| 16 | class Node: | 16 | return {"encoded_length": n, "decoded": text} |
| 17 | __slots__ = ("w", "left", "right", "ch") | 17 | |
| 18 | def __init__(self, w, left=None, right=None, ch=None): | 18 | freqs.sort() |
| 19 | self.w = w | 19 | |
| 20 | self.left = left | 20 | # Bottom-up two-queue Huffman merge: |
| 21 | self.right = right | 21 | # use freqs as first queue and merged as second queue. |
| 22 | self.ch = ch | 22 | merged = [0] * (m - 1) |
| 23 | 23 | i = j = k = 0 | |
| 24 | heap = [Node(f, None, None, ch) for ch, f in freq.items()] | 24 | total = 0 |
| 25 | size = len(heap) | 25 | |
| 26 | 26 | while k < m - 1: | |
| 27 | def sift_down(i, size, heap): | 27 | if i < m and (j >= k or freqs[i] <= merged[j]): |
| 28 | item = heap[i] | 28 | a = freqs[i] |
| 29 | iw = item.w | 29 | i += 1 |
| 30 | while True: | 30 | else: |
| 31 | l = (i << 1) + 1 | 31 | a = merged[j] |
| 32 | if l >= size: | 32 | j += 1 |
| 33 | break | 33 | |
| 34 | r = l + 1 | 34 | if i < m and (j >= k or freqs[i] <= merged[j]): |
| 35 | c = l | 35 | b = freqs[i] |
| 36 | cw = heap[l].w | 36 | i += 1 |
| 37 | if r < size: | 37 | else: |
| 38 | rw = heap[r].w | 38 | b = merged[j] |
| 39 | if rw < cw: | 39 | j += 1 |
| 40 | c = r | 40 | |
| 41 | cw = rw | 41 | s = a + b |
| 42 | if cw >= iw: | 42 | merged[k] = s |
| 43 | break | 43 | total += s |
| 44 | heap[i] = heap[c] | 44 | k += 1 |
| 45 | i = c | 45 | |
| 46 | heap[i] = item | 46 | return {"encoded_length": total, "decoded": text} |
| 47 | 47 | ||
| 48 | def sift_up(i, heap): | 48 | |
| 49 | item = heap[i] | 49 | |
| 50 | iw = item.w | 50 | |
| 51 | while i: | 51 | |
| 52 | p = (i - 1) >> 1 | 52 | |
| 53 | pw = heap[p].w | 53 | |
| 54 | if pw <= iw: | 54 | |
| 55 | break | 55 | |
| 56 | heap[i] = heap[p] | 56 | |
| 57 | i = p | 57 | |
| 58 | heap[i] = item | 58 | |
| 59 | 59 | ||
| 60 | for i in range((size >> 1) - 1, -1, -1): | 60 | |
| 61 | sift_down(i, size, heap) | 61 | |
| 62 | 62 | ||
| 63 | while size > 1: | 63 | |
| 64 | a = heap[0] | 64 | |
| 65 | size -= 1 | 65 | |
| 66 | last = heap[size] | 66 | |
| 67 | if size: | 67 | |
| 68 | heap[0] = last | 68 | |
| 69 | sift_down(0, size, heap) | 69 | |
| 70 | 70 | ||
| 71 | b = heap[0] | 71 | |
| 72 | size -= 1 | 72 | |
| 73 | if size: | 73 | |
| 74 | last = heap[size] | 74 | |
| 75 | heap[0] = last | 75 | |
| 76 | sift_down(0, size, heap) | 76 | |
| 77 | 77 | ||
| 78 | parent = Node(a.w + b.w, a, b, None) | 78 | |
| 79 | if size < len(heap): | 79 | |
| 80 | heap[size] = parent | 80 | |
| 81 | else: | 81 | |
| 82 | heap.append(parent) | 82 | |
| 83 | sift_up(size, heap) | 83 | |
| 84 | size += 1 | 84 | |
| 85 | 85 | ||
| 86 | root = heap[0] | 86 | |
| 87 | encoded_length = 0 | 87 | |
| 88 | stack = [(root, 0)] | 88 | |
| 89 | append = stack.append | 89 | |
| 90 | pop = stack.pop | 90 | |
| 91 | 91 | ||
| 92 | while stack: | 92 | |
| 93 | node, depth = pop() | 93 | |
| 94 | ch = node.ch | 94 | |
| 95 | if ch is not None: | 95 | |
| 96 | encoded_length += node.w * depth | 96 | |
| 97 | else: | 97 | |
| 98 | nd = depth + 1 | 98 | |
| 99 | append((node.left, nd)) | 99 | |
| 100 | append((node.right, nd)) | 100 | |
| 101 | 101 | ||
| 102 | return {"encoded_length": encoded_length, "decoded": text} | 102 |
1def solve(input):2 text = input.get("text", "")3 n = len(text)4 if not n:5 return {"encoded_length": 0, "decoded": ""}67 freq = {}8 get = freq.get9 for ch in text:10 freq[ch] = get(ch, 0) + 11112 m = len(freq)13 if m == 1:14 return {"encoded_length": n, "decoded": text}1516 class Node:17 __slots__ = ("w", "left", "right", "ch")18 def __init__(self, w, left=None, right=None, ch=None):19 self.w = w20 self.left = left21 self.right = right22 self.ch = ch2324 heap = [Node(f, None, None, ch) for ch, f in freq.items()]25 size = len(heap)2627 def sift_down(i, size, heap):28 item = heap[i]29 iw = item.w30 while True:31 l = (i << 1) + 132 if l >= size:33 break34 r = l + 135 c = l36 cw = heap[l].w37 if r < size:38 rw = heap[r].w39 if rw < cw:40 c = r41 cw = rw42 if cw >= iw:43 break44 heap[i] = heap[c]45 i = c46 heap[i] = item4748 def sift_up(i, heap):49 item = heap[i]50 iw = item.w51 while i:52 p = (i - 1) >> 153 pw = heap[p].w54 if pw <= iw:55 break56 heap[i] = heap[p]57 i = p58 heap[i] = item5960 for i in range((size >> 1) - 1, -1, -1):61 sift_down(i, size, heap)6263 while size > 1:64 a = heap[0]65 size -= 166 last = heap[size]67 if size:68 heap[0] = last69 sift_down(0, size, heap)7071 b = heap[0]72 size -= 173 if size:74 last = heap[size]75 heap[0] = last76 sift_down(0, size, heap)7778 parent = Node(a.w + b.w, a, b, None)79 if size < len(heap):80 heap[size] = parent81 else:82 heap.append(parent)83 sift_up(size, heap)84 size += 18586 root = heap[0]87 encoded_length = 088 stack = [(root, 0)]89 append = stack.append90 pop = stack.pop9192 while stack:93 node, depth = pop()94 ch = node.ch95 if ch is not None:96 encoded_length += node.w * depth97 else:98 nd = depth + 199 append((node.left, nd))100 append((node.right, nd))101102 return {"encoded_length": encoded_length, "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}