Solution #b513de2d-45cb-4c37-a6f4-0777c70b7998
completedScore
100% (5/5)
Runtime
210μs
Delta
No change vs parent
Tied for best
Same as parent
Score
100% (5/5)
Runtime
210μ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": ""}
class Node:
__slots__ = ("w", "left", "right")
def __init__(self, w, left=None, right=None):
self.w = w
self.left = left
self.right = right
try:
b = text.encode("latin1")
counts = [0] * 256
for x in b:
counts[x] += 1
nodes = [Node(c) for c in counts if c]
except:
d = {}
get = d.get
for ch in text:
d[ch] = get(ch, 0) + 1
nodes = [Node(c) for c in d.values()]
m = len(nodes)
if m == 1:
return {"encoded_length": n, "decoded": text}
nodes.sort(key=lambda node: node.w)
i = 0
q = []
qi = 0
q_append = q.append
total = 0
def pop_smallest():
nonlocal i, qi
if i < m:
if qi < len(q):
if nodes[i].w <= q[qi].w:
x = nodes[i]
i += 1
return x
x = q[qi]
qi += 1
return x
x = nodes[i]
i += 1
return x
x = q[qi]
qi += 1
return x
remaining = m
while remaining > 1:
a = pop_smallest()
b = pop_smallest()
s = a.w + b.w
total += s
q_append(Node(s, a, b))
remaining -= 1
root = q[-1]
decoded = []
stack = [(root, 0)]
dec_append = decoded.append
while stack:
node, depth = stack.pop()
left = node.left
if left is None:
dec_append(node.w << depth)
else:
stack.append((left, depth + 1))
stack.append((node.right, depth + 1))
return {"encoded_length": total, "decoded": text}Score Difference
Tied
Runtime Advantage
186μs slower
Code Size
79 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 | class Node: | 7 | counts = {} |
| 8 | __slots__ = ("w", "left", "right") | 8 | get = counts.get |
| 9 | def __init__(self, w, left=None, right=None): | 9 | for ch in text: |
| 10 | self.w = w | 10 | counts[ch] = get(ch, 0) + 1 |
| 11 | self.left = left | 11 | |
| 12 | self.right = right | 12 | freqs = list(counts.values()) |
| 13 | 13 | m = len(freqs) | |
| 14 | try: | 14 | |
| 15 | b = text.encode("latin1") | 15 | if m == 1: |
| 16 | counts = [0] * 256 | 16 | return {"encoded_length": n, "decoded": text} |
| 17 | for x in b: | 17 | |
| 18 | counts[x] += 1 | 18 | freqs.sort() |
| 19 | nodes = [Node(c) for c in counts if c] | 19 | |
| 20 | except: | 20 | # Bottom-up two-queue Huffman merge: |
| 21 | d = {} | 21 | # use freqs as first queue and merged as second queue. |
| 22 | get = d.get | 22 | merged = [0] * (m - 1) |
| 23 | for ch in text: | 23 | i = j = k = 0 |
| 24 | d[ch] = get(ch, 0) + 1 | 24 | total = 0 |
| 25 | nodes = [Node(c) for c in d.values()] | 25 | |
| 26 | 26 | while k < m - 1: | |
| 27 | m = len(nodes) | 27 | if i < m and (j >= k or freqs[i] <= merged[j]): |
| 28 | if m == 1: | 28 | a = freqs[i] |
| 29 | return {"encoded_length": n, "decoded": text} | 29 | i += 1 |
| 30 | 30 | else: | |
| 31 | nodes.sort(key=lambda node: node.w) | 31 | a = merged[j] |
| 32 | 32 | j += 1 | |
| 33 | i = 0 | 33 | |
| 34 | q = [] | 34 | if i < m and (j >= k or freqs[i] <= merged[j]): |
| 35 | qi = 0 | 35 | b = freqs[i] |
| 36 | q_append = q.append | 36 | i += 1 |
| 37 | total = 0 | 37 | else: |
| 38 | 38 | b = merged[j] | |
| 39 | def pop_smallest(): | 39 | j += 1 |
| 40 | nonlocal i, qi | 40 | |
| 41 | if i < m: | 41 | s = a + b |
| 42 | if qi < len(q): | 42 | merged[k] = s |
| 43 | if nodes[i].w <= q[qi].w: | 43 | total += s |
| 44 | x = nodes[i] | 44 | k += 1 |
| 45 | i += 1 | 45 | |
| 46 | return x | 46 | return {"encoded_length": total, "decoded": text} |
| 47 | x = q[qi] | 47 | |
| 48 | qi += 1 | 48 | |
| 49 | return x | 49 | |
| 50 | x = nodes[i] | 50 | |
| 51 | i += 1 | 51 | |
| 52 | return x | 52 | |
| 53 | x = q[qi] | 53 | |
| 54 | qi += 1 | 54 | |
| 55 | return x | 55 | |
| 56 | 56 | ||
| 57 | remaining = m | 57 | |
| 58 | while remaining > 1: | 58 | |
| 59 | a = pop_smallest() | 59 | |
| 60 | b = pop_smallest() | 60 | |
| 61 | s = a.w + b.w | 61 | |
| 62 | total += s | 62 | |
| 63 | q_append(Node(s, a, b)) | 63 | |
| 64 | remaining -= 1 | 64 | |
| 65 | 65 | ||
| 66 | root = q[-1] | 66 | |
| 67 | decoded = [] | 67 | |
| 68 | stack = [(root, 0)] | 68 | |
| 69 | dec_append = decoded.append | 69 | |
| 70 | while stack: | 70 | |
| 71 | node, depth = stack.pop() | 71 | |
| 72 | left = node.left | 72 | |
| 73 | if left is None: | 73 | |
| 74 | dec_append(node.w << depth) | 74 | |
| 75 | else: | 75 | |
| 76 | stack.append((left, depth + 1)) | 76 | |
| 77 | stack.append((node.right, depth + 1)) | 77 | |
| 78 | 78 | ||
| 79 | return {"encoded_length": total, "decoded": text} | 79 |
1def solve(input):2 text = input.get("text", "")3 n = len(text)4 if not n:5 return {"encoded_length": 0, "decoded": ""}67 class Node:8 __slots__ = ("w", "left", "right")9 def __init__(self, w, left=None, right=None):10 self.w = w11 self.left = left12 self.right = right1314 try:15 b = text.encode("latin1")16 counts = [0] * 25617 for x in b:18 counts[x] += 119 nodes = [Node(c) for c in counts if c]20 except:21 d = {}22 get = d.get23 for ch in text:24 d[ch] = get(ch, 0) + 125 nodes = [Node(c) for c in d.values()]2627 m = len(nodes)28 if m == 1:29 return {"encoded_length": n, "decoded": text}3031 nodes.sort(key=lambda node: node.w)3233 i = 034 q = []35 qi = 036 q_append = q.append37 total = 03839 def pop_smallest():40 nonlocal i, qi41 if i < m:42 if qi < len(q):43 if nodes[i].w <= q[qi].w:44 x = nodes[i]45 i += 146 return x47 x = q[qi]48 qi += 149 return x50 x = nodes[i]51 i += 152 return x53 x = q[qi]54 qi += 155 return x5657 remaining = m58 while remaining > 1:59 a = pop_smallest()60 b = pop_smallest()61 s = a.w + b.w62 total += s63 q_append(Node(s, a, b))64 remaining -= 16566 root = q[-1]67 decoded = []68 stack = [(root, 0)]69 dec_append = decoded.append70 while stack:71 node, depth = stack.pop()72 left = node.left73 if left is None:74 dec_append(node.w << depth)75 else:76 stack.append((left, depth + 1))77 stack.append((node.right, depth + 1))7879 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}