Solution #40369b8a-64e4-407f-a240-12b85000b84a

completed

Score

100% (5/5)

Runtime

74μs

Delta

No change vs parent

Tied for best

Same as parent

Solution Lineage

Current100%Same as parent
f9d7018b100%Same as parent
5a4f6922100%Same as parent
15ec7bd1100%Same as parent
76aeaf5e100%Improved from parent
4b16e42760%Regression from parent
fd0fb3a5100%Same as parent
4911088c100%Same as parent
68ce1629100%Same as parent
2d8382ce100%Same as parent
62c233ed100%Same as parent
82a9952b100%Same as parent
b513de2d100%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 n == 0:
        return {"encoded_length": 0, "decoded": ""}

    counts = {}
    get = counts.get
    for ch in text:
        counts[ch] = get(ch, 0) + 1

    if len(counts) <= 2:
        return {"encoded_length": n, "decoded": text}

    heap = {}
    size = 0

    for f in counts.values():
        i = size
        size += 1
        while i:
            p = (i - 1) >> 1
            pv = heap[p]
            if pv <= f:
                break
            heap[i] = pv
            i = p
        heap[i] = f

    total = 0

    while size > 1:
        x = heap[0]
        size -= 1
        if size:
            v = heap[size]
            i = 0
            h = size >> 1
            while i < h:
                l = (i << 1) + 1
                r = l + 1
                c = l
                cv = heap[l]
                if r < size:
                    rv = heap[r]
                    if rv < cv:
                        c = r
                        cv = rv
                if v <= cv:
                    break
                heap[i] = cv
                i = c
            heap[i] = v

        y = heap[0]
        size -= 1
        if size:
            v = heap[size]
            i = 0
            h = size >> 1
            while i < h:
                l = (i << 1) + 1
                r = l + 1
                c = l
                cv = heap[l]
                if r < size:
                    rv = heap[r]
                    if rv < cv:
                        c = r
                        cv = rv
                if v <= cv:
                    break
                heap[i] = cv
                i = c
            heap[i] = v

        s = x + y
        total += s

        i = size
        size += 1
        while i:
            p = (i - 1) >> 1
            pv = heap[p]
            if pv <= s:
                break
            heap[i] = pv
            i = p
        heap[i] = s

    return {"encoded_length": total, "decoded": text}

Compare with Champion

Score Difference

Tied

Runtime Advantage

50μs slower

Code Size

91 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 n == 0:4 if n == 0:
5 return {"encoded_length": 0, "decoded": ""}5 return {"encoded_length": 0, "decoded": ""}
66
7 counts = {}7 counts = {}
8 get = counts.get8 get = counts.get
9 for ch in text:9 for ch in text:
10 counts[ch] = get(ch, 0) + 110 counts[ch] = get(ch, 0) + 1
1111
12 if len(counts) <= 2:12 freqs = list(counts.values())
13 return {"encoded_length": n, "decoded": text}13 m = len(freqs)
1414
15 heap = {}15 if m == 1:
16 size = 016 return {"encoded_length": n, "decoded": text}
1717
18 for f in counts.values():18 freqs.sort()
19 i = size19
20 size += 120 # Bottom-up two-queue Huffman merge:
21 while i:21 # use freqs as first queue and merged as second queue.
22 p = (i - 1) >> 122 merged = [0] * (m - 1)
23 pv = heap[p]23 i = j = k = 0
24 if pv <= f:24 total = 0
25 break25
26 heap[i] = pv26 while k < m - 1:
27 i = p27 if i < m and (j >= k or freqs[i] <= merged[j]):
28 heap[i] = f28 a = freqs[i]
2929 i += 1
30 total = 030 else:
3131 a = merged[j]
32 while size > 1:32 j += 1
33 x = heap[0]33
34 size -= 134 if i < m and (j >= k or freqs[i] <= merged[j]):
35 if size:35 b = freqs[i]
36 v = heap[size]36 i += 1
37 i = 037 else:
38 h = size >> 138 b = merged[j]
39 while i < h:39 j += 1
40 l = (i << 1) + 140
41 r = l + 141 s = a + b
42 c = l42 merged[k] = s
43 cv = heap[l]43 total += s
44 if r < size:44 k += 1
45 rv = heap[r]45
46 if rv < cv:46 return {"encoded_length": total, "decoded": text}
47 c = r47
48 cv = rv48
49 if v <= cv:49
50 break50
51 heap[i] = cv51
52 i = c52
53 heap[i] = v53
5454
55 y = heap[0]55
56 size -= 156
57 if size:57
58 v = heap[size]58
59 i = 059
60 h = size >> 160
61 while i < h:61
62 l = (i << 1) + 162
63 r = l + 163
64 c = l64
65 cv = heap[l]65
66 if r < size:66
67 rv = heap[r]67
68 if rv < cv:68
69 c = r69
70 cv = rv70
71 if v <= cv:71
72 break72
73 heap[i] = cv73
74 i = c74
75 heap[i] = v75
7676
77 s = x + y77
78 total += s78
7979
80 i = size80
81 size += 181
82 while i:82
83 p = (i - 1) >> 183
84 pv = heap[p]84
85 if pv <= s:85
86 break86
87 heap[i] = pv87
88 i = p88
89 heap[i] = s89
9090
91 return {"encoded_length": total, "decoded": text}91
Your Solution
100% (5/5)74μ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 if len(counts) <= 2:
13 return {"encoded_length": n, "decoded": text}
14
15 heap = {}
16 size = 0
17
18 for f in counts.values():
19 i = size
20 size += 1
21 while i:
22 p = (i - 1) >> 1
23 pv = heap[p]
24 if pv <= f:
25 break
26 heap[i] = pv
27 i = p
28 heap[i] = f
29
30 total = 0
31
32 while size > 1:
33 x = heap[0]
34 size -= 1
35 if size:
36 v = heap[size]
37 i = 0
38 h = size >> 1
39 while i < h:
40 l = (i << 1) + 1
41 r = l + 1
42 c = l
43 cv = heap[l]
44 if r < size:
45 rv = heap[r]
46 if rv < cv:
47 c = r
48 cv = rv
49 if v <= cv:
50 break
51 heap[i] = cv
52 i = c
53 heap[i] = v
54
55 y = heap[0]
56 size -= 1
57 if size:
58 v = heap[size]
59 i = 0
60 h = size >> 1
61 while i < h:
62 l = (i << 1) + 1
63 r = l + 1
64 c = l
65 cv = heap[l]
66 if r < size:
67 rv = heap[r]
68 if rv < cv:
69 c = r
70 cv = rv
71 if v <= cv:
72 break
73 heap[i] = cv
74 i = c
75 heap[i] = v
76
77 s = x + y
78 total += s
79
80 i = size
81 size += 1
82 while i:
83 p = (i - 1) >> 1
84 pv = heap[p]
85 if pv <= s:
86 break
87 heap[i] = pv
88 i = p
89 heap[i] = s
90
91 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}