Solution #b513de2d-45cb-4c37-a6f4-0777c70b7998

completed

Score

100% (5/5)

Runtime

210μs

Delta

No change vs parent

Tied for best

Same as parent

Solution Lineage

Current100%Same as parent
8607bb8f100%Same as parent
96012705100%Same as parent
21d15e87100%Same as parent
9a277008100%Improved from parent
1b2fa39920%Regression from parent
98fd02a3100%Same as parent
ae4d0f99100%Same as parent
6126deee100%Same as parent
d720f0bf100%Same as parent
7e637902100%Same as parent
29bbc470100%Same as parent
268b5b53100%Same as parent
ffe6e932100%Same as parent
bb8a4da9100%Same as parent
0d32fca6100%Same as parent
195f1ac7100%Same as parent
96773990100%Same as parent
d7adae63100%Same as parent
8cb031c4100%Same as parent
0826d84e100%Same as parent
2da814bd100%Same as parent
e227904f100%Same as parent
69696638100%Same as parent
c128503d100%Same as parent
9e0f203b100%Same as parent
30447971100%Same as parent
62082b2d100%Same as parent
2a708353100%Same as parent
a0f415b0100%First in chain

Code

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}

Compare with Champion

Score Difference

Tied

Runtime Advantage

186μs slower

Code Size

79 vs 46 lines

#Your Solution#Champion
1def solve(input):1def 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": ""}
66
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 = w10 counts[ch] = get(ch, 0) + 1
11 self.left = left11
12 self.right = right12 freqs = list(counts.values())
1313 m = len(freqs)
14 try:14
15 b = text.encode("latin1")15 if m == 1:
16 counts = [0] * 25616 return {"encoded_length": n, "decoded": text}
17 for x in b:17
18 counts[x] += 118 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.get22 merged = [0] * (m - 1)
23 for ch in text:23 i = j = k = 0
24 d[ch] = get(ch, 0) + 124 total = 0
25 nodes = [Node(c) for c in d.values()]25
2626 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
3030 else:
31 nodes.sort(key=lambda node: node.w)31 a = merged[j]
3232 j += 1
33 i = 033
34 q = []34 if i < m and (j >= k or freqs[i] <= merged[j]):
35 qi = 035 b = freqs[i]
36 q_append = q.append36 i += 1
37 total = 037 else:
3838 b = merged[j]
39 def pop_smallest():39 j += 1
40 nonlocal i, qi40
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 += 145
46 return x46 return {"encoded_length": total, "decoded": text}
47 x = q[qi]47
48 qi += 148
49 return x49
50 x = nodes[i]50
51 i += 151
52 return x52
53 x = q[qi]53
54 qi += 154
55 return x55
5656
57 remaining = m57
58 while remaining > 1:58
59 a = pop_smallest()59
60 b = pop_smallest()60
61 s = a.w + b.w61
62 total += s62
63 q_append(Node(s, a, b))63
64 remaining -= 164
6565
66 root = q[-1]66
67 decoded = []67
68 stack = [(root, 0)]68
69 dec_append = decoded.append69
70 while stack:70
71 node, depth = stack.pop()71
72 left = node.left72
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
7878
79 return {"encoded_length": total, "decoded": text}79
Your Solution
100% (5/5)210μs
1def solve(input):
2 text = input.get("text", "")
3 n = len(text)
4 if not n:
5 return {"encoded_length": 0, "decoded": ""}
6
7 class Node:
8 __slots__ = ("w", "left", "right")
9 def __init__(self, w, left=None, right=None):
10 self.w = w
11 self.left = left
12 self.right = right
13
14 try:
15 b = text.encode("latin1")
16 counts = [0] * 256
17 for x in b:
18 counts[x] += 1
19 nodes = [Node(c) for c in counts if c]
20 except:
21 d = {}
22 get = d.get
23 for ch in text:
24 d[ch] = get(ch, 0) + 1
25 nodes = [Node(c) for c in d.values()]
26
27 m = len(nodes)
28 if m == 1:
29 return {"encoded_length": n, "decoded": text}
30
31 nodes.sort(key=lambda node: node.w)
32
33 i = 0
34 q = []
35 qi = 0
36 q_append = q.append
37 total = 0
38
39 def pop_smallest():
40 nonlocal i, qi
41 if i < m:
42 if qi < len(q):
43 if nodes[i].w <= q[qi].w:
44 x = nodes[i]
45 i += 1
46 return x
47 x = q[qi]
48 qi += 1
49 return x
50 x = nodes[i]
51 i += 1
52 return x
53 x = q[qi]
54 qi += 1
55 return x
56
57 remaining = m
58 while remaining > 1:
59 a = pop_smallest()
60 b = pop_smallest()
61 s = a.w + b.w
62 total += s
63 q_append(Node(s, a, b))
64 remaining -= 1
65
66 root = q[-1]
67 decoded = []
68 stack = [(root, 0)]
69 dec_append = decoded.append
70 while stack:
71 node, depth = stack.pop()
72 left = node.left
73 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))
78
79 return {"encoded_length": total, "decoded": text}
Champion
100% (5/5)24μs
1def solve(input):
2 text = input.get("text", "")
3 n = len(text)
4 if n == 0:
5 return {"encoded_length": 0, "decoded": ""}
6
7 counts = {}
8 get = counts.get
9 for ch in text:
10 counts[ch] = get(ch, 0) + 1
11
12 freqs = list(counts.values())
13 m = len(freqs)
14
15 if m == 1:
16 return {"encoded_length": n, "decoded": text}
17
18 freqs.sort()
19
20 # 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 = 0
24 total = 0
25
26 while k < m - 1:
27 if i < m and (j >= k or freqs[i] <= merged[j]):
28 a = freqs[i]
29 i += 1
30 else:
31 a = merged[j]
32 j += 1
33
34 if i < m and (j >= k or freqs[i] <= merged[j]):
35 b = freqs[i]
36 i += 1
37 else:
38 b = merged[j]
39 j += 1
40
41 s = a + b
42 merged[k] = s
43 total += s
44 k += 1
45
46 return {"encoded_length": total, "decoded": text}