Solution #0d32fca6-aa87-42bd-a7e0-ebdc381a7ed1

completed

Score

100% (5/5)

Runtime

300μs

Delta

No change vs parent

Tied for best

Same as parent

Solution Lineage

Current100%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", "")
    if not text:
        return {"encoded_length": 0, "decoded": ""}

    freqs = tuple(map(text.count, set(text)))
    if len(freqs) == 1:
        return {"encoded_length": len(text), "decoded": text}

    def merge_cost(seq):
        n = len(seq)
        if n == 1:
            return 0
        if n == 2:
            return seq[0] + seq[1]

        a = seq[0]
        b = seq[1]
        s = a + b

        rest = seq[2:]
        lo = tuple(filter(lambda x: x < s, rest))
        hi = tuple(filter(lambda x: x >= s, rest))
        merged = lo + (s,) + hi
        return s + merge_cost(merged)

    return {"encoded_length": merge_cost(tuple(sorted(freqs))), "decoded": text}

Compare with Champion

Score Difference

Tied

Runtime Advantage

276μs slower

Code Size

27 vs 46 lines

#Your Solution#Champion
1def solve(input):1def solve(input):
2 text = input.get("text", "")2 text = input.get("text", "")
3 if not text:3 n = len(text)
4 return {"encoded_length": 0, "decoded": ""}4 if n == 0:
55 return {"encoded_length": 0, "decoded": ""}
6 freqs = tuple(map(text.count, set(text)))6
7 if len(freqs) == 1:7 counts = {}
8 return {"encoded_length": len(text), "decoded": text}8 get = counts.get
99 for ch in text:
10 def merge_cost(seq):10 counts[ch] = get(ch, 0) + 1
11 n = len(seq)11
12 if n == 1:12 freqs = list(counts.values())
13 return 013 m = len(freqs)
14 if n == 2:14
15 return seq[0] + seq[1]15 if m == 1:
1616 return {"encoded_length": n, "decoded": text}
17 a = seq[0]17
18 b = seq[1]18 freqs.sort()
19 s = a + b19
2020 # Bottom-up two-queue Huffman merge:
21 rest = seq[2:]21 # use freqs as first queue and merged as second queue.
22 lo = tuple(filter(lambda x: x < s, rest))22 merged = [0] * (m - 1)
23 hi = tuple(filter(lambda x: x >= s, rest))23 i = j = k = 0
24 merged = lo + (s,) + hi24 total = 0
25 return s + merge_cost(merged)25
2626 while k < m - 1:
27 return {"encoded_length": merge_cost(tuple(sorted(freqs))), "decoded": text}27 if i < m and (j >= k or freqs[i] <= merged[j]):
2828 a = freqs[i]
2929 i += 1
3030 else:
3131 a = merged[j]
3232 j += 1
3333
3434 if i < m and (j >= k or freqs[i] <= merged[j]):
3535 b = freqs[i]
3636 i += 1
3737 else:
3838 b = merged[j]
3939 j += 1
4040
4141 s = a + b
4242 merged[k] = s
4343 total += s
4444 k += 1
4545
4646 return {"encoded_length": total, "decoded": text}
Your Solution
100% (5/5)300μs
1def solve(input):
2 text = input.get("text", "")
3 if not text:
4 return {"encoded_length": 0, "decoded": ""}
5
6 freqs = tuple(map(text.count, set(text)))
7 if len(freqs) == 1:
8 return {"encoded_length": len(text), "decoded": text}
9
10 def merge_cost(seq):
11 n = len(seq)
12 if n == 1:
13 return 0
14 if n == 2:
15 return seq[0] + seq[1]
16
17 a = seq[0]
18 b = seq[1]
19 s = a + b
20
21 rest = seq[2:]
22 lo = tuple(filter(lambda x: x < s, rest))
23 hi = tuple(filter(lambda x: x >= s, rest))
24 merged = lo + (s,) + hi
25 return s + merge_cost(merged)
26
27 return {"encoded_length": merge_cost(tuple(sorted(freqs))), "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}