Solution #c34b4f3b-b1bf-4312-9b5b-a917093c8c43

completed

Score

100% (5/5)

Runtime

47μs

Delta

No change vs parent

Tied for best

Same as parent

Solution Lineage

Current100%Same as parent
6a54e553100%Same as parent
8f72c514100%Improved from parent
9bcd8c5220%Regression from parent
1a8aec0060%Regression from parent
e2a7405b100%Same as parent
9e71593e100%Improved from parent
42ace40a40%Regression from parent
b404991f100%Same as parent
06ab1c25100%Same as parent
52d74aac100%Improved from parent
917a89f120%Regression from parent
f3599802100%Same as parent
6aeac392100%Improved from parent
3edec6f70%Regression from parent
f68f5746100%Same as parent
40369b8a100%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 = {}
    for ch in text:
        counts[ch] = counts.get(ch, 0) + 1

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

    vals = sorted(counts.values())

    def bisect_right(a, x, lo):
        hi = len(a)
        while lo < hi:
            mid = (lo + hi) >> 1
            if x < a[mid]:
                hi = mid
            else:
                lo = mid + 1
        return lo

    total = 0
    merged = []
    i = j = 0
    m = len(vals)

    while True:
        remaining = (m - i) + (len(merged) - j)
        if remaining <= 1:
            break

        if i < m and (j >= len(merged) or vals[i] <= merged[j]):
            a = vals[i]
            i += 1
        else:
            a = merged[j]
            j += 1

        if i < m and (j >= len(merged) or vals[i] <= merged[j]):
            b = vals[i]
            i += 1
        else:
            b = merged[j]
            j += 1

        s = a + b
        total += s

        pos = bisect_right(merged, s, j)
        merged.append(0)
        k = len(merged) - 1
        while k > pos:
            merged[k] = merged[k - 1]
            k -= 1
        merged[pos] = s

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

Compare with Champion

Score Difference

Tied

Runtime Advantage

23μs slower

Code Size

61 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 for ch in text:8 get = counts.get
9 counts[ch] = counts.get(ch, 0) + 19 for ch in text:
1010 counts[ch] = get(ch, 0) + 1
11 if len(counts) == 1:11
12 return {"encoded_length": n, "decoded": text}12 freqs = list(counts.values())
1313 m = len(freqs)
14 vals = sorted(counts.values())14
1515 if m == 1:
16 def bisect_right(a, x, lo):16 return {"encoded_length": n, "decoded": text}
17 hi = len(a)17
18 while lo < hi:18 freqs.sort()
19 mid = (lo + hi) >> 119
20 if x < a[mid]:20 # Bottom-up two-queue Huffman merge:
21 hi = mid21 # use freqs as first queue and merged as second queue.
22 else:22 merged = [0] * (m - 1)
23 lo = mid + 123 i = j = k = 0
24 return lo24 total = 0
2525
26 total = 026 while k < m - 1:
27 merged = []27 if i < m and (j >= k or freqs[i] <= merged[j]):
28 i = j = 028 a = freqs[i]
29 m = len(vals)29 i += 1
3030 else:
31 while True:31 a = merged[j]
32 remaining = (m - i) + (len(merged) - j)32 j += 1
33 if remaining <= 1:33
34 break34 if i < m and (j >= k or freqs[i] <= merged[j]):
3535 b = freqs[i]
36 if i < m and (j >= len(merged) or vals[i] <= merged[j]):36 i += 1
37 a = vals[i]37 else:
38 i += 138 b = merged[j]
39 else:39 j += 1
40 a = merged[j]40
41 j += 141 s = a + b
4242 merged[k] = s
43 if i < m and (j >= len(merged) or vals[i] <= merged[j]):43 total += s
44 b = vals[i]44 k += 1
45 i += 145
46 else:46 return {"encoded_length": total, "decoded": text}
47 b = merged[j]47
48 j += 148
4949
50 s = a + b50
51 total += s51
5252
53 pos = bisect_right(merged, s, j)53
54 merged.append(0)54
55 k = len(merged) - 155
56 while k > pos:56
57 merged[k] = merged[k - 1]57
58 k -= 158
59 merged[pos] = s59
6060
61 return {"encoded_length": total, "decoded": text}61
Your Solution
100% (5/5)47μ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 for ch in text:
9 counts[ch] = counts.get(ch, 0) + 1
10
11 if len(counts) == 1:
12 return {"encoded_length": n, "decoded": text}
13
14 vals = sorted(counts.values())
15
16 def bisect_right(a, x, lo):
17 hi = len(a)
18 while lo < hi:
19 mid = (lo + hi) >> 1
20 if x < a[mid]:
21 hi = mid
22 else:
23 lo = mid + 1
24 return lo
25
26 total = 0
27 merged = []
28 i = j = 0
29 m = len(vals)
30
31 while True:
32 remaining = (m - i) + (len(merged) - j)
33 if remaining <= 1:
34 break
35
36 if i < m and (j >= len(merged) or vals[i] <= merged[j]):
37 a = vals[i]
38 i += 1
39 else:
40 a = merged[j]
41 j += 1
42
43 if i < m and (j >= len(merged) or vals[i] <= merged[j]):
44 b = vals[i]
45 i += 1
46 else:
47 b = merged[j]
48 j += 1
49
50 s = a + b
51 total += s
52
53 pos = bisect_right(merged, s, j)
54 merged.append(0)
55 k = len(merged) - 1
56 while k > pos:
57 merged[k] = merged[k - 1]
58 k -= 1
59 merged[pos] = s
60
61 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}