Solution #5a4f6922-a0e9-4208-8265-cc218390e25b

completed

Score

100% (5/5)

Runtime

84μs

Delta

No change vs parent

Tied for best

Same as parent

Solution Lineage

Current100%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": ""}

    from array import array

    try:
        b = text.encode("latin1")
        cnt = array('I', [0]) * 256
        for x in b:
            cnt[x] += 1

        freqs = array('I')
        for c in cnt:
            if c:
                freqs.append(c)
    except:
        counts = {}
        get = counts.get
        for ch in text:
            counts[ch] = get(ch, 0) + 1
        vals = counts.values()
        freqs = array('I', vals)

    m = len(freqs)
    if m == 1:
        return {"encoded_length": n, "decoded": text}
    if m == 2:
        return {"encoded_length": freqs[0] + freqs[1], "decoded": text}

    freqs = array('I', sorted(freqs))
    merged = array('I', [0]) * (m - 1)

    i = j = k = 0
    total = 0

    while k < m - 1:
        if j >= k:
            a = freqs[i]
            i += 1
        elif i >= m:
            a = merged[j]
            j += 1
        elif freqs[i] <= merged[j]:
            a = freqs[i]
            i += 1
        else:
            a = merged[j]
            j += 1

        if j >= k:
            b2 = freqs[i]
            i += 1
        elif i >= m:
            b2 = merged[j]
            j += 1
        elif freqs[i] <= merged[j]:
            b2 = freqs[i]
            i += 1
        else:
            b2 = merged[j]
            j += 1

        s = a + b2
        merged[k] = s
        total += s
        k += 1

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

Compare with Champion

Score Difference

Tied

Runtime Advantage

60μs slower

Code Size

71 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 from array import array7 counts = {}
88 get = counts.get
9 try:9 for ch in text:
10 b = text.encode("latin1")10 counts[ch] = get(ch, 0) + 1
11 cnt = array('I', [0]) * 25611
12 for x in b:12 freqs = list(counts.values())
13 cnt[x] += 113 m = len(freqs)
1414
15 freqs = array('I')15 if m == 1:
16 for c in cnt:16 return {"encoded_length": n, "decoded": text}
17 if c:17
18 freqs.append(c)18 freqs.sort()
19 except:19
20 counts = {}20 # Bottom-up two-queue Huffman merge:
21 get = counts.get21 # use freqs as first queue and merged as second queue.
22 for ch in text:22 merged = [0] * (m - 1)
23 counts[ch] = get(ch, 0) + 123 i = j = k = 0
24 vals = counts.values()24 total = 0
25 freqs = array('I', vals)25
2626 while k < m - 1:
27 m = len(freqs)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 if m == 2:30 else:
31 return {"encoded_length": freqs[0] + freqs[1], "decoded": text}31 a = merged[j]
3232 j += 1
33 freqs = array('I', sorted(freqs))33
34 merged = array('I', [0]) * (m - 1)34 if i < m and (j >= k or freqs[i] <= merged[j]):
3535 b = freqs[i]
36 i = j = k = 036 i += 1
37 total = 037 else:
3838 b = merged[j]
39 while k < m - 1:39 j += 1
40 if j >= k:40
41 a = freqs[i]41 s = a + b
42 i += 142 merged[k] = s
43 elif i >= m:43 total += s
44 a = merged[j]44 k += 1
45 j += 145
46 elif freqs[i] <= merged[j]:46 return {"encoded_length": total, "decoded": text}
47 a = freqs[i]47
48 i += 148
49 else:49
50 a = merged[j]50
51 j += 151
5252
53 if j >= k:53
54 b2 = freqs[i]54
55 i += 155
56 elif i >= m:56
57 b2 = merged[j]57
58 j += 158
59 elif freqs[i] <= merged[j]:59
60 b2 = freqs[i]60
61 i += 161
62 else:62
63 b2 = merged[j]63
64 j += 164
6565
66 s = a + b266
67 merged[k] = s67
68 total += s68
69 k += 169
7070
71 return {"encoded_length": total, "decoded": text}71
Your Solution
100% (5/5)84μ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 from array import array
8
9 try:
10 b = text.encode("latin1")
11 cnt = array('I', [0]) * 256
12 for x in b:
13 cnt[x] += 1
14
15 freqs = array('I')
16 for c in cnt:
17 if c:
18 freqs.append(c)
19 except:
20 counts = {}
21 get = counts.get
22 for ch in text:
23 counts[ch] = get(ch, 0) + 1
24 vals = counts.values()
25 freqs = array('I', vals)
26
27 m = len(freqs)
28 if m == 1:
29 return {"encoded_length": n, "decoded": text}
30 if m == 2:
31 return {"encoded_length": freqs[0] + freqs[1], "decoded": text}
32
33 freqs = array('I', sorted(freqs))
34 merged = array('I', [0]) * (m - 1)
35
36 i = j = k = 0
37 total = 0
38
39 while k < m - 1:
40 if j >= k:
41 a = freqs[i]
42 i += 1
43 elif i >= m:
44 a = merged[j]
45 j += 1
46 elif freqs[i] <= merged[j]:
47 a = freqs[i]
48 i += 1
49 else:
50 a = merged[j]
51 j += 1
52
53 if j >= k:
54 b2 = freqs[i]
55 i += 1
56 elif i >= m:
57 b2 = merged[j]
58 j += 1
59 elif freqs[i] <= merged[j]:
60 b2 = freqs[i]
61 i += 1
62 else:
63 b2 = merged[j]
64 j += 1
65
66 s = a + b2
67 merged[k] = s
68 total += s
69 k += 1
70
71 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}