3 kyu
Huffman Encoding
206 of 1,571muesli4
Loading description...
Algorithms
View
This comment has been reported as {{ abuseKindText }}.
Show
This comment has been hidden. You can view it now .
This comment can not be viewed.
- |
- Reply
- Edit
- View Solution
- Expand 1 Reply Expand {{ comments?.length }} replies
- Collapse
- Spoiler
- Remove
- Remove comment & replies
- Report
{{ fetchSolutionsError }}
-
-
Your rendered github-flavored markdown will appear here.
-
Label this discussion...
-
No Label
Keep the comment unlabeled if none of the below applies.
-
Issue
Use the issue label when reporting problems with the kata.
Be sure to explain the problem clearly and include the steps to reproduce. -
Suggestion
Use the suggestion label if you have feedback on how this kata can be improved.
-
Question
Use the question label if you have questions and/or need help solving the kata.
Don't forget to mention the language you're using, and mark as having spoiler if you include your solution.
-
No Label
- Cancel
Commenting is not allowed on this discussion
You cannot view this solution
There is no solution to show
Please sign in or sign up to leave a comment.
Code is passing tests but failing the Attempt. I didn't even know that was possible, and can't understand what's happening.
See this paragraph and this paragraph for explanation.
Very good challenge, took me quite a bit of brainpower to figure it out... hoping to encounter more like this.
Creating this solution was both enlightening and challenging, especially when it came to handling edge cases. One key complexity arose from dealing with scenarios where there was only one unique character in the input string. The original instructions left room for interpretation on this specific case, and my initial approach ended up returning an empty list, which didn't align with the test expectations.
This probably isn't a spoiler... but spoiler it if it is...
If the description of building the tree here is confusing to you, have a look at this amazing video by Tom Scott on YouTube.
You're welcome ;p
I have problem with "for an alphabet with same frequencies and with size of 2^n all encodings should have the length n" tests. Only a half in average from it are passed. I've checked my code several times that it implements Huffman algortihm from description and I don't know how to fix it.
Which language is it? It seems likely that your solution is incorrect. I.e. the trees you construct may not be optimal for a specific corner case. See one of my answers below on this specific test.
If you think there is an issue, I would have to ask you to reopen it.
"the higher frequencies are, the lower the length of their encoding should be (can also be equal for non-powers of 2)"
Why powers of two should make the difference?
For the frequencies [('b', 2), ('e', 2), ('g', 4), ('i', 8), ('m', 16), ('n', 32), etc, my Python code gets: b: 000, e: 001, g: 010100, i: 010101, m: 010110, etc.
So, 'g' has frequency 4 (2²) and code 010100 length 6; 'i' has frequency 8 (2³) with code 010101 also length 6. Both frequencies are powers of two, have same code length, but I don't see any problem with that, as there are no frequencies between 4 and 8.
Seems like you're misunderstanding the task. The encoding your algorithm comes up with is terribly inefficient and I'm assuming that's the reason the tests are failing.
Actually it wasn't misunderstanding. Just a silly mistake in the code
If the frequencies resemble ascending powers of two, one would expect the encoding to have an ideal representation (i.e. code length matches the frequency).
If you build a tree, then all of the previously added elements frequency sum is the same as the frequency of the next element. Thus the new root node should have the previous tree and the new leaf as children. The length of the encoding then is the same as the depth of the leaves, and this way it is validated.
If this test fails, then something with your algorithm is broken.
I keep getting this error :
TypeError: Cannot read property 'map' of null at Context.<anonymous> (test.js:122:35) at processImmediate (internal/timers.js:464:21)
But my code ain't 122 line long (only 80) and I don't even use map property in my code. What am I doing wrong ?Okay this :
Note: Frequency lists with just one or less elements should get rejected. (Because then there is no information we could encode, but the length.).
is missleading, just return the frequency list no matter it's size. Retuning null if freqs.length<=1 cause error in the testsI get that input validations is necessary and all, but I spent more time wondering why would one pass an empty list to encode (I am fine with empty strings) than finding errors in my code. Great kata nevertheless. I would suggest imporoving the functions signatures to remove some redundency in the computations but maybe it is me who wasn't clever enough (though I could ignore some variables but that annoys me even more). Again, great kata.
I pass the initial test, but when I run the Attempts, I'm getting errors outside my own code.
"I'm getting errors outside my own code" is not very helpful. how do you expect us to know what's wrong ? what language are you using ?
I was also getting errors outside of my code initially, as under certain circumstances I was returning null in my frequencies method - javascript How I found my problem is by printing every method call and input, try doing that
tests in Python are not using decorators, and in the full tests suite, the
basic_tests
have no assertions attached to them and therefore appear as failedPython Fork addressing the issues listed above.
Approved
Good tests... This kata is not for the algs, but for testing
If you do not want cheaters, you have to make it more challenging. ;)
Please make it clearer how code should 'reject' a frequency table with just one or no elements. Currently the description states:
There is no clear definition of 'reject' across programming languages. Make it explicit what should happen in such cases.
For the Python version, the starter text (the template solution text you get when you start training) confuses matters too, as it tells you only
str
is expected:Where the input should be rejected, the tests expect
None
here, which is definitely not astr
object. A seasoned Python developer might reasonably expect to have to raise an exception here, as that's the ideomatic way of rejecting bad input in Python. With no further clarity in the description and the comments stating astr
return is expected, that's a perfectly reasonable assumption to make.So, for Python at least, please update the returns lines in the template:
(This issue was re-raised by request)
i added the following to the description:
JS random tests are too easy to bypass.
This comment has been hidden.
Fix
Please review (!) and approve.
All translations were remarkably faithful - they all have the exact same problems.
Problem. So I unpublished the fix for now.
Kata doesn't specify how to build the tree from the frequencies ( you could sort by frequency, then original order, or character order ascending or descending ). Kata doesn't specify how to encode the tree ( you can choose
0
or1
for left, and v.v. for right ). Kata only requires thatdecode
invertencode
, givenfrequencies
( andfrequencies
might even be in different order forencode
anddecode
, e.g. iffrequencies
returns unsorted data andencode
then mutates that. that should be solver's problem! ).How would you like to test this, while leaving all implementation wiggle room within the specs?
decode
no longer tested;encode
tested for correct use of freq table when used with partial strings;frequencies
called once and this data repeatedly used for testing but never altered by tests;decode . encode = id
tested.Lots of solutions do not implement specs correctly. Returning
null
fromfrequencies
, mutating freq tables, building the tree wrong all happen.aaaaaaaaand unpublished again.
inserting combined nodes in the tree can be done before or after ndoes with the same ( combined ) count, leading to different encodings.
N O T H I N G is certain about any correct encoding, not even the exact number of bits used for a symbol. You can only
decode
it, and only if you know exactly how the tree was generated from the freqs.Something is certain about a correct encoding: it's just bits.
/[01]*/"
only and no properties on it.That's what I test for now, and that decoding an encoding works.
Please review ( and possibly approve ).
Bump. It's been a week.
As mentioned by others in this kata discussion, there are hidden requirements that don't quite make sense until looking into other discussion items, such as when to return empty strings versus
None
s for results.Also, I'd love if we could see logs and more details for 'odd' failures like the ones I'm hitting, where I've created a working Huffman Encoding script, but there's 1 test that fails with:
'0' should equal None
, with no other information.This comment has been hidden.
I am testing Huffman encoding in Python: Passed tests : 2781 but Failed tests: 265
I don't undestand the following error Log frequencies(l) l encode([],l) Test Passed ERROR restore sorted sequence from frequencies should succeed: [] should equal ['l']
Can you help me Please
No more help needed, I found the origin.
This kata's basic tests are incredibly inconsistent
enode(fs, [])
, when according to the hint the second argument should be a string ???encode(fs, "")
supposed to returnNone
iflen(fs)<2
and else""
????Not an issue.
This comment has been hidden.
Exactly, some expected outcomes would be good!
I know that there are different ways to build the Huffman tree but I would like to know if it is possible to use the module "networkx" in python. Thanks :)
Hello - I don't really understand the requirements fully here! One of the test cases has freqs = [] and s = 'v' My encode function correctly returns None With no encoded value, my decode function doesn't have a lot to work with, and so it also returns None. However, I'm getting the error "restore sorted sequence from frequencies should succeed: [] should equal ['v']" If there is no frequency table, how does it know to decode to 'v'? Any help gratefully received! Thanks
I don't know which language this is but the original Haskell test cases contain the following:
Sorry - I should have said. This is Python. And (from the comments) other people have clearly passed the Python test cases, so the problem is clearly my understanding rather than the test cases!
Aha - I think this was me being an idiot, and what I said in my original post was given as an error wasn't given as an error at all. I do have other errors that I need to work on, but I understand those :-)
Clojure Translation ready for review.
Please make it clearer how could should 'reject' a frequency table with just one or no elements. Currently the description states:
For the Python version, the starter text confuses matters too, as it tells you
str
is expected:The tests expect
None
here (and not an exception, which is the ideomatic way of rejecting bad input).Please update the description to state what should be returned when rejecting, and update the
returns
lines:Not gonna happen. The kata's specs are adapted from Haskell, where
None
is perfectly idiomatic - you can read the example tests to find out what is expected.I'm not saying it's ideal, but in an imperfect world specs are sometimes adapted from other languages. Broaden your horizons.
Closing.
I think you may have misunderstood what I asked for. While
None
may not be entirely idiomatic in Python, I didn't actually ask that to be changed.I asked for the
return
lines to be updated, part of the initial Python code that you see in the Solution editor pane when you start training. There, the comments claim thatencode()
anddecode()
only returnstr
and I'm strongly suggesting that you want to add, or None when rejecting
to those lines.I also asked for the phrasing "rejected" to be clarified. That verb doesn't mean anything when it comes to a problem specification. Reject the value how? Please read my remarks on exceptions in Python in that light, I gave context to what I would normally have expected the problem to treat "rejecting" an input. Returning
None
is fine too here, but you need to make this explicit. This isn't something that you can simply bury with an excuse of this being an imperfect translation between different programming languages.I note I'm not the only one to have reported this issue either, see this report, which could easily have been avoided if there wasn't this directly conflicting text that claims only
str
is to be returned.Finally, and very ironically, dismissing feedback on your Kata with Broaden your horizons is incredibly close-minded. Learn to communicate better, being dismissive and rude is no way to treat anyone, especially not those that took the time to give you feedback.
Please reraise your issue.
Re-raised (and updated and expanded for clarity).
Brilliant Kata and it was great fun to solve it. But were the >2500 random tests really necessary? It posed quite an additional challenge on the performance of the algorithm. I know, it's 3kyu, but getting the tree right is already a puzzle without the added complication of scarce time.
See the discussion down below with MastaB. Especially the last comment contains some hints.
Now I work with java translation and try to choose kata api design. Well, any solution should be able:
0000101111
- here a:0
, b:10
, c:11
. When "usually we choose0
for the left branch and1
for the right branch", shouldn't be b:11
, c:01
if a:0
? a=0
and freq(a)=4 > freq(b+c)=3; so last code letter for c should be the same as first for a, because of freq(c)=2 > freq(b)=1 (in accordance with select branch rule. Whould it be convenient to work with this 1), 2-a), 2-b), 3) api schema in kata java version?Concerning the last comment, the final codes depend on the way you build your tree. For example, in the situation of the example, here is a valid tree
..*
./.\
a...*
.../.\
..b...c
which will give a:0, b:10, c:11. Otherwise, you can exchange b and c on the tree (and get a:0, b:11, c:10) and a and the node (and get a:1, b:01, c:00 or a:1, b:00, c:01).What you won't get is something as you suggest with a:0 and c:01. Thing is the left-most digit is how you go from the root to the first nodes and a is in another component than b and c (because as they have the 2 smallest frequencies, b and c are paired).
Meaning what exactly?
?
Why? Can you provide some examples because I cannot follow your description.
I think it is part of the fun to figure out how to best do something. Also that's the comment on the decode function and not the description. The description goes into detail and explains the basic concepts.
No, it should not. The description is consistent, please read again.
freq(b+c)=3
meaning what? Define first.Thank you for reading and answering, it's very helpful for me.
My questions were mostly about real process, when we have transmitter and receiver: i) how can transmitter use coding table (e.g. a:0, b:10, c:11) provided by receiver? ii) when transmitter creates one, how can receiver receive that table or re-calculate it self?
Here, serialization is projection Map<Character,String> -> List (e.g. ["a 0", "b 10", "c 11"]).
Encode message: aaaabcc -> 0000101111; or aaaabcc, ["a 0", "b 10", "c 11"] -> 0000101111 Decode: the inversion of above.
Ok, the description is consistent, and so; should test system be able to decode result of Huffman.encode("aaaabcc")? Guess this is not part of kata problem. I agree with this too.
freq(b+c)=3 is shortly the same as description (Tree construction, "... This node gets reinserted and has the sum of the frequencies of both trees as new frequency.").
Test cases are vulnarable If user makes changes to the given list in the function, because other tests are dependent in the former ones. In Python
Why while testing encode function you give frequency list as
[('dSg?VQu4NJF8UMhZvq!eC9maiW1ko7Ax', 320)]
and expect us to encode this like every single character in the text has frequency 320? And In the description you say that if "frequency list has one or less element should be rejected". Very confusing. If you give me freq just like that, I would choose whole string as a character in the encdoing. Understanding test suit is the real deal in this kata btw.Don't we make classic Huffman Encoding here? (Actually this kata just appeared to me after we studied huffman encoding in my last semester algorithm class :p).I read details over and over again but couldnt figure that out.
In one test
[('c', 1), ('m', 1), ('h', 1), ('x', 1), ('i', 1)], cmhxi
Encoding is tested with this, and I construct the tree as this{'i': '00', 'x': '01', 'h': '110', 'm': '111', 'c': '10'}
Because ties can be broken arbitrarily.But I get this response
'101111100100' should equal None
What is wrong here? I would be glad if someone help.Sorry for the inconvenience, But I guess it is an issue
Could someone translate this in Java when and if they had the time please?Looks like a really fun kata.
Hi, for the Haskell version my code is failing with:
however I find this message somewhat unhelpful, I can't figure out what is the root cause, what is being compared to what, or what frequencies are used.
Hi,
I think this is from the length property (the higher frequencies are, the lower the length of their encoding should be; can also be equal for non-powers of 2). To give you a simple example: Encoding
aabbcccc
should use an encoding where the length of the code word forc
is half of the length of the code words fora
andb
.Thanks, I managed to fix the issue. Awesome kata!
There is something entirely wrong with this kata! I didn't test out my code yet because it is irritating example, how
b
can have10
andc
can have11
, despite the fact that the occurence ofb
is lower thanc
. Please check example on the wikipedia, from that it is expected that the frequency should be in order ofa> b > c
which is certainly not true here. The problem is not with the convention, it has to do with inherent inconsistency! I am sure something is wrong with me, as it is quite improbable that this number of people would have completed the kata. Please help! I just want to get out of the irritation.The case
Doesn't neccesarily mean that
b
occurs more thanc
. It just means that bothb
andc
occur less thana
.Essentially, the only rule is that every character in a lower level of a tree must occur less times than a character at a higher level. The order of the characters (or branches) at a specific level does not matter. You just have to be consistent when encoding and decoding.
what you mean? Won't by encoding function would be tested on its own?
No, encoding and decoding are tested together as there can be different ways to create a valid huffman tree. Therefore, you just have to be consistent with the way you create the tree for encoding and decoding.
I quote from the description:
(Note: As you can see the encoding is not optimal, since the code for b and c have same length, but that is topic of another data compression Kata.)
In general, there is no way to come up with an optimal compression. In that case you can't construct a binary tree that encodes your alphabet where
b
andc
are not on the same level.An optimal compression with Huffman can only be achieved iff:
Of course this can be generalized to any output alphabet (power of n; n-ary tree; output alphabet with n symbols).
I completed this kata yesterday, but didn't submit as I wanted to tidy up my code. Having come back to it today, the code has disappeared, and there is just the skeleton! Is there any way to get it back, or do I have to recode from scratch?
Haskell
I've been investigating why my solution is too slow.
I use trace to see the input to the tests.
There are roughly : 3300 tests in total (before it times out) 1100 of those are repeated tests
Can we have repeated tests removed please?
Or even better just do 3000 tests in total, then I can pass this kata! :-)
Thanks!
What repeated tests are you talking about? This Kata is tested with property tests and with a working solution you should be able to pass.
Without any information from your side I mark this issue as resolved. Feel free to give me anything and I will investigate.
Here is a sample of the inputs of some of the tests
encode [('a',2),('e',2),('j',4),('k',8),('n',16),('p',32),('q',64),('r',128),('t',256)] "a" encode [('a',2),('e',2),('j',4),('k',8),('n',16),('p',32),('q',64),('r',128),('t',256)] "e" encode [('a',2),('e',2),('j',4),('k',8),('n',16),('p',32),('q',64),('r',128),('t',256)] "e" encode [('a',2),('e',2),('j',4),('k',8),('n',16),('p',32),('q',64),('r',128),('t',256)] "j" encode [('a',2),('e',2),('j',4),('k',8),('n',16),('p',32),('q',64),('r',128),('t',256)] "j" encode [('a',2),('e',2),('j',4),('k',8),('n',16),('p',32),('q',64),('r',128),('t',256)] "k" encode [('a',2),('e',2),('j',4),('k',8),('n',16),('p',32),('q',64),('r',128),('t',256)] "k" encode [('a',2),('e',2),('j',4),('k',8),('n',16),('p',32),('q',64),('r',128),('t',256)] "n" encode [('a',2),('e',2),('j',4),('k',8),('n',16),('p',32),('q',64),('r',128),('t',256)] "n" encode [('a',2),('e',2),('j',4),('k',8),('n',16),('p',32),('q',64),('r',128),('t',256)] "p" encode [('a',2),('e',2),('j',4),('k',8),('n',16),('p',32),('q',64),('r',128),('t',256)] "p" encode [('a',2),('e',2),('j',4),('k',8),('n',16),('p',32),('q',64),('r',128),('t',256)] "q" encode [('a',2),('e',2),('j',4),('k',8),('n',16),('p',32),('q',64),('r',128),('t',256)] "q" encode [('a',2),('e',2),('j',4),('k',8),('n',16),('p',32),('q',64),('r',128),('t',256)] "r" encode [('a',2),('e',2),('j',4),('k',8),('n',16),('p',32),('q',64),('r',128),('t',256)] "r" encode [('a',2),('e',2),('j',4),('k',8),('n',16),('p',32),('q',64),('r',128),('t',256)] "t"
This grouping is repeated many times. Where you have n items in the frequency and rather than n test to build up the entire set of encodings, the first and last are done once and the middle ones are run twice each. so (2n -2) tests rather than n.
Also, at a highter level, if we just look at tests matching '256)]' we can see 6 groupings which are really just the same tests as in frequencies of -
encode [(,2),(,2),(,4),(,8),(,16),(,32),(,64),(,128),(_,256)] _
There are 112 tests in this form, where I'd think really 9 should do.
Likewise the tests ending with '512)]' there are 126 tests with same frequency counts, again 10 should do.
Thank you. That's something I can work with. But just for the record: Those are randomly generated by QuickCheck. I might be able to remove some of the redundancy but that will most likely not solve your problem.
If your tests can't finish in 8 or 16 seconds (or whatever the limit is) then you did something very wrong.
Edit: There is a small amount of redundancy in 1 test in the way the tests are run. But that reundancy has only a factor of 2. I won't fix that since it won't really make a difference.
Thanks for the quick reply.
When it says 'Ok, passed 100 tests.' Is that like just 100 encodes or decodes? If so, it looks like under 500 ish tests in total?
As I said, my log has about 3300 tests before it timed out.
Is that output the haskell output of the run?
(It could be the haskell version has changed over time (codewars, haskell engine, etc))
(I've made a 7x improvement of my solution so far. For 12 seconds and 3300 tests, that just gives 3.6ms to run each test, and run the test code to check the test. If there's randomness generation in there, that can eat up a bit of time.)
Thanks again for the effort in looking into this
Hi, Um, I am not sure you understand. I think it far more than a redundancy of 2x, more like 30x one is as bad as 40x.
If we take the tests with frequencies of 2, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384. That's 15 items, so to get the whole tree, i.e. all the encodings, you just need to do 15 tests.
However, there are 588. That's 40x the required number.
This is repeated for many of the tests
These show mostly about 20x to 30x the number of useful tests.
Below is the test for the 16384 tests all with the same frequencies.
encode [('a',2),('d',2),('g',4),('h',8),('j',16),('k',32),('n',64),('o',128),('p',256),('s',512),('t',1024),('u',2048),('v',4096),('x',8192),('z',16384)] "a" encode [('a',2),('d',2),('g',4),('h',8),('j',16),('k',32),('n',64),('o',128),('p',256),('s',512),('t',1024),('u',2048),('v',4096),('x',8192),('z',16384)] "d" encode [('a',2),('d',2),('g',4),('h',8),('j',16),('k',32),('n',64),('o',128),('p',256),('s',512),('t',1024),('u',2048),('v',4096),('x',8192),('z',16384)] "d" encode [('a',2),('d',2),('g',4),('h',8),('j',16),('k',32),('n',64),('o',128),('p',256),('s',512),('t',1024),('u',2048),('v',4096),('x',8192),('z',16384)] "g" encode [('a',2),('d',2),('g',4),('h',8),('j',16),('k',32),('n',64),('o',128),('p',256),('s',512),('t',1024),('u',2048),('v',4096),('x',8192),('z',16384)] "g" encode [('a',2),('d',2),('g',4),('h',8),('j',16),('k',32),('n',64),('o',128),('p',256),('s',512),('t',1024),('u',2048),('v',4096),('x',8192),('z',16384)] "h" encode [('a',2),('d',2),('g',4),('h',8),('j',16),('k',32),('n',64),('o',128),('p',256),('s',512),('t',1024),('u',2048),('v',4096),('x',8192),('z',16384)] "h" encode [('a',2),('d',2),('g',4),('h',8),('j',16),('k',32),('n',64),('o',128),('p',256),('s',512),('t',1024),('u',2048),('v',4096),('x',8192),('z',16384)] "j" encode [('a',2),('d',2),('g',4),('h',8),('j',16),('k',32),('n',64),('o',128),('p',256),('s',512),('t',1024),('u',2048),('v',4096),('x',8192),('z',16384)] "j" encode [('a',2),('d',2),('g',4),('h',8),('j',16),('k',32),('n',64),('o',128),('p',256),('s',512),('t',1024),('u',2048),('v',4096),('x',8192),('z',16384)] "k" encode [('a',2),('d',2),('g',4),('h',8),('j',16),('k',32),('n',64),('o',128),('p',256),('s',512),('t',1024),('u',2048),('v',4096),('x',8192),('z',16384)] "k" encode [('a',2),('d',2),('g',4),('h',8),('j',16),('k',32),('n',64),('o',128),('p',256),('s',512),('t',1024),('u',2048),('v',4096),('x',8192),('z',16384)] "n" encode [('a',2),('d',2),('g',4),('h',8),('j',16),('k',32),('n',64),('o',128),('p',256),('s',512),('t',1024),('u',2048),('v',4096),('x',8192),('z',16384)] "n" encode [('a',2),('d',2),('g',4),('h',8),('j',16),('k',32),('n',64),('o',128),('p',256),('s',512),('t',1024),('u',2048),('v',4096),('x',8192),('z',16384)] "o" encode [('a',2),('d',2),('g',4),('h',8),('j',16),('k',32),('n',64),('o',128),('p',256),('s',512),('t',1024),('u',2048),('v',4096),('x',8192),('z',16384)] "o" encode [('a',2),('d',2),('g',4),('h',8),('j',16),('k',32),('n',64),('o',128),('p',256),('s',512),('t',1024),('u',2048),('v',4096),('x',8192),('z',16384)] "p" encode [('a',2),('d',2),('g',4),('h',8),('j',16),('k',32),('n',64),('o',128),('p',256),('s',512),('t',1024),('u',2048),('v',4096),('x',8192),('z',16384)] "p" encode [('a',2),('d',2),('g',4),('h',8),('j',16),('k',32),('n',64),('o',128),('p',256),('s',512),('t',1024),('u',2048),('v',4096),('x',8192),('z',16384)] "s" encode [('a',2),('d',2),('g',4),('h',8),('j',16),('k',32),('n',64),('o',128),('p',256),('s',512),('t',1024),('u',2048),('v',4096),('x',8192),('z',16384)] "s" encode [('a',2),('d',2),('g',4),('h',8),('j',16),('k',32),('n',64),('o',128),('p',256),('s',512),('t',1024),('u',2048),('v',4096),('x',8192),('z',16384)] "t" encode [('a',2),('d',2),('g',4),('h',8),('j',16),('k',32),('n',64),('o',128),('p',256),('s',512),('t',1024),('u',2048),('v',4096),('x',8192),('z',16384)] "t" encode [('a',2),('d',2),('g',4),('h',8),('j',16),('k',32),('n',64),('o',128),('p',256),('s',512),('t',1024),('u',2048),('v',4096),('x',8192),('z',16384)] "u" encode [('a',2),('d',2),('g',4),('h',8),('j',16),('k',32),('n',64),('o',128),('p',256),('s',512),('t',1024),('u',2048),('v',4096),('x',8192),('z',16384)] "u" encode [('a',2),('d',2),('g',4),('h',8),('j',16),('k',32),('n',64),('o',128),('p',256),('s',512),('t',1024),('u',2048),('v',4096),('x',8192),('z',16384)] "v" encode [('a',2),('d',2),('g',4),('h',8),('j',16),('k',32),('n',64),('o',128),('p',256),('s',512),('t',1024),('u',2048),('v',4096),('x',8192),('z',16384)] "v" encode [('a',2),('d',2),('g',4),('h',8),('j',16),('k',32),('n',64),('o',128),('p',256),('s',512),('t',1024),('u',2048),('v',4096),('x',8192),('z',16384)] "x" encode [('a',2),('d',2),('g',4),('h',8),('j',16),('k',32),('n',64),('o',128),('p',256),('s',512),('t',1024),('u',2048),('v',4096),('x',8192),('z',16384)] "x" encode [('a',2),('d',2),('g',4),('h',8),('j',16),('k',32),('n',64),('o',128),('p',256),('s',512),('t',1024),('u',2048),('v',4096),('x',8192),('z',16384)] "z" encode [('a',2),('c',2),('d',4),('e',8),('h',16),('j',32),('k',64),('l',128),('m',256),('q',512),('r',1024),('t',2048),('u',4096),('v',8192),('x',16384)] "a" encode [('a',2),('c',2),('d',4),('e',8),('h',16),('j',32),('k',64),('l',128),('m',256),('q',512),('r',1024),('t',2048),('u',4096),('v',8192),('x',16384)] "c" encode [('a',2),('c',2),('d',4),('e',8),('h',16),('j',32),('k',64),('l',128),('m',256),('q',512),('r',1024),('t',2048),('u',4096),('v',8192),('x',16384)] "c" encode [('a',2),('c',2),('d',4),('e',8),('h',16),('j',32),('k',64),('l',128),('m',256),('q',512),('r',1024),('t',2048),('u',4096),('v',8192),('x',16384)] "d" encode [('a',2),('c',2),('d',4),('e',8),('h',16),('j',32),('k',64),('l',128),('m',256),('q',512),('r',1024),('t',2048),('u',4096),('v',8192),('x',16384)] "d" encode [('a',2),('c',2),('d',4),('e',8),('h',16),('j',32),('k',64),('l',128),('m',256),('q',512),('r',1024),('t',2048),('u',4096),('v',8192),('x',16384)] "e" encode [('a',2),('c',2),('d',4),('e',8),('h',16),('j',32),('k',64),('l',128),('m',256),('q',512),('r',1024),('t',2048),('u',4096),('v',8192),('x',16384)] "e" encode [('a',2),('c',2),('d',4),('e',8),('h',16),('j',32),('k',64),('l',128),('m',256),('q',512),('r',1024),('t',2048),('u',4096),('v',8192),('x',16384)] "h" encode [('a',2),('c',2),('d',4),('e',8),('h',16),('j',32),('k',64),('l',128),('m',256),('q',512),('r',1024),('t',2048),('u',4096),('v',8192),('x',16384)] "h" encode [('a',2),('c',2),('d',4),('e',8),('h',16),('j',32),('k',64),('l',128),('m',256),('q',512),('r',1024),('t',2048),('u',4096),('v',8192),('x',16384)] "j" encode [('a',2),('c',2),('d',4),('e',8),('h',16),('j',32),('k',64),('l',128),('m',256),('q',512),('r',1024),('t',2048),('u',4096),('v',8192),('x',16384)] "j" encode [('a',2),('c',2),('d',4),('e',8),('h',16),('j',32),('k',64),('l',128),('m',256),('q',512),('r',1024),('t',2048),('u',4096),('v',8192),('x',16384)] "k" encode [('a',2),('c',2),('d',4),('e',8),('h',16),('j',32),('k',64),('l',128),('m',256),('q',512),('r',1024),('t',2048),('u',4096),('v',8192),('x',16384)] "k" encode [('a',2),('c',2),('d',4),('e',8),('h',16),('j',32),('k',64),('l',128),('m',256),('q',512),('r',1024),('t',2048),('u',4096),('v',8192),('x',16384)] "l" encode [('a',2),('c',2),('d',4),('e',8),('h',16),('j',32),('k',64),('l',128),('m',256),('q',512),('r',1024),('t',2048),('u',4096),('v',8192),('x',16384)] "l" encode [('a',2),('c',2),('d',4),('e',8),('h',16),('j',32),('k',64),('l',128),('m',256),('q',512),('r',1024),('t',2048),('u',4096),('v',8192),('x',16384)] "m" encode [('a',2),('c',2),('d',4),('e',8),('h',16),('j',32),('k',64),('l',128),('m',256),('q',512),('r',1024),('t',2048),('u',4096),('v',8192),('x',16384)] "m" encode [('a',2),('c',2),('d',4),('e',8),('h',16),('j',32),('k',64),('l',128),('m',256),('q',512),('r',1024),('t',2048),('u',4096),('v',8192),('x',16384)] "q" encode [('a',2),('c',2),('d',4),('e',8),('h',16),('j',32),('k',64),('l',128),('m',256),('q',512),('r',1024),('t',2048),('u',4096),('v',8192),('x',16384)] "q" encode [('a',2),('c',2),('d',4),('e',8),('h',16),('j',32),('k',64),('l',128),('m',256),('q',512),('r',1024),('t',2048),('u',4096),('v',8192),('x',16384)] "r" encode [('a',2),('c',2),('d',4),('e',8),('h',16),('j',32),('k',64),('l',128),('m',256),('q',512),('r',1024),('t',2048),('u',4096),('v',8192),('x',16384)] "r" encode [('a',2),('c',2),('d',4),('e',8),('h',16),('j',32),('k',64),('l',128),('m',256),('q',512),('r',1024),('t',2048),('u',4096),('v',8192),('x',16384)] "t" encode [('a',2),('c',2),('d',4),('e',8),('h',16),('j',32),('k',64),('l',128),('m',256),('q',512),('r',1024),('t',2048),('u',4096),('v',8192),('x',16384)] "t" encode [('a',2),('c',2),('d',4),('e',8),('h',16),('j',32),('k',64),('l',128),('m',256),('q',512),('r',1024),('t',2048),('u',4096),('v',8192),('x',16384)] "u" encode [('a',2),('c',2),('d',4),('e',8),('h',16),('j',32),('k',64),('l',128),('m',256),('q',512),('r',1024),('t',2048),('u',4096),('v',8192),('x',16384)] "u" encode [('a',2),('c',2),('d',4),('e',8),('h',16),('j',32),('k',64),('l',128),('m',256),('q',512),('r',1024),('t',2048),('u',4096),('v',8192),('x',16384)] "v" encode [('a',2),('c',2),('d',4),('e',8),('h',16),('j',32),('k',64),('l',128),('m',256),('q',512),('r',1024),('t',2048),('u',4096),('v',8192),('x',16384)] "v" encode [('a',2),('c',2),('d',4),('e',8),('h',16),('j',32),('k',64),('l',128),('m',256),('q',512),('r',1024),('t',2048),('u',4096),('v',8192),('x',16384)] "x" encode [('c',2),('d',2),('g',4),('h',8),('j',16),('k',32),('l',64),('m',128),('r',256),('s',512),('u',1024),('w',2048),('x',4096),('y',8192),('z',16384)] "c" encode [('c',2),('d',2),('g',4),('h',8),('j',16),('k',32),('l',64),('m',128),('r',256),('s',512),('u',1024),('w',2048),('x',4096),('y',8192),('z',16384)] "d" encode [('c',2),('d',2),('g',4),('h',8),('j',16),('k',32),('l',64),('m',128),('r',256),('s',512),('u',1024),('w',2048),('x',4096),('y',8192),('z',16384)] "d" encode [('c',2),('d',2),('g',4),('h',8),('j',16),('k',32),('l',64),('m',128),('r',256),('s',512),('u',1024),('w',2048),('x',4096),('y',8192),('z',16384)] "g" encode [('c',2),('d',2),('g',4),('h',8),('j',16),('k',32),('l',64),('m',128),('r',256),('s',512),('u',1024),('w',2048),('x',4096),('y',8192),('z',16384)] "g" encode [('c',2),('d',2),('g',4),('h',8),('j',16),('k',32),('l',64),('m',128),('r',256),('s',512),('u',1024),('w',2048),('x',4096),('y',8192),('z',16384)] "h" encode [('c',2),('d',2),('g',4),('h',8),('j',16),('k',32),('l',64),('m',128),('r',256),('s',512),('u',1024),('w',2048),('x',4096),('y',8192),('z',16384)] "h" encode [('c',2),('d',2),('g',4),('h',8),('j',16),('k',32),('l',64),('m',128),('r',256),('s',512),('u',1024),('w',2048),('x',4096),('y',8192),('z',16384)] "j" encode [('c',2),('d',2),('g',4),('h',8),('j',16),('k',32),('l',64),('m',128),('r',256),('s',512),('u',1024),('w',2048),('x',4096),('y',8192),('z',16384)] "j" encode [('c',2),('d',2),('g',4),('h',8),('j',16),('k',32),('l',64),('m',128),('r',256),('s',512),('u',1024),('w',2048),('x',4096),('y',8192),('z',16384)] "k" encode [('c',2),('d',2),('g',4),('h',8),('j',16),('k',32),('l',64),('m',128),('r',256),('s',512),('u',1024),('w',2048),('x',4096),('y',8192),('z',16384)] "k" encode [('c',2),('d',2),('g',4),('h',8),('j',16),('k',32),('l',64),('m',128),('r',256),('s',512),('u',1024),('w',2048),('x',4096),('y',8192),('z',16384)] "l" encode [('c',2),('d',2),('g',4),('h',8),('j',16),('k',32),('l',64),('m',128),('r',256),('s',512),('u',1024),('w',2048),('x',4096),('y',8192),('z',16384)] "l" encode [('c',2),('d',2),('g',4),('h',8),('j',16),('k',32),('l',64),('m',128),('r',256),('s',512),('u',1024),('w',2048),('x',4096),('y',8192),('z',16384)] "m" encode [('c',2),('d',2),('g',4),('h',8),('j',16),('k',32),('l',64),('m',128),('r',256),('s',512),('u',1024),('w',2048),('x',4096),('y',8192),('z',16384)] "m" encode [('c',2),('d',2),('g',4),('h',8),('j',16),('k',32),('l',64),('m',128),('r',256),('s',512),('u',1024),('w',2048),('x',4096),('y',8192),('z',16384)] "r" encode [('c',2),('d',2),('g',4),('h',8),('j',16),('k',32),('l',64),('m',128),('r',256),('s',512),('u',1024),('w',2048),('x',4096),('y',8192),('z',16384)] "r" encode [('c',2),('d',2),('g',4),('h',8),('j',16),('k',32),('l',64),('m',128),('r',256),('s',512),('u',1024),('w',2048),('x',4096),('y',8192),('z',16384)] "s" encode [('c',2),('d',2),('g',4),('h',8),('j',16),('k',32),('l',64),('m',128),('r',256),('s',512),('u',1024),('w',2048),('x',4096),('y',8192),('z',16384)] "s" encode [('c',2),('d',2),('g',4),('h',8),('j',16),('k',32),('l',64),('m',128),('r',256),('s',512),('u',1024),('w',2048),('x',4096),('y',8192),('z',16384)] "u" encode [('c',2),('d',2),('g',4),('h',8),('j',16),('k',32),('l',64),('m',128),('r',256),('s',512),('u',1024),('w',2048),('x',4096),('y',8192),('z',16384)] "u" encode [('c',2),('d',2),('g',4),('h',8),('j',16),('k',32),('l',64),('m',128),('r',256),('s',512),('u',1024),('w',2048),('x',4096),('y',8192),('z',16384)] "w" encode [('c',2),('d',2),('g',4),('h',8),('j',16),('k',32),('l',64),('m',128),('r',256),('s',512),('u',1024),('w',2048),('x',4096),('y',8192),('z',16384)] "w" encode [('c',2),('d',2),('g',4),('h',8),('j',16),('k',32),('l',64),('m',128),('r',256),('s',512),('u',1024),('w',2048),('x',4096),('y',8192),('z',16384)] "x" encode [('c',2),('d',2),('g',4),('h',8),('j',16),('k',32),('l',64),('m',128),('r',256),('s',512),('u',1024),('w',2048),('x',4096),('y',8192),('z',16384)] "x" encode [('c',2),('d',2),('g',4),('h',8),('j',16),('k',32),('l',64),('m',128),('r',256),('s',512),('u',1024),('w',2048),('x',4096),('y',8192),('z',16384)] "y" encode [('c',2),('d',2),('g',4),('h',8),('j',16),('k',32),('l',64),('m',128),('r',256),('s',512),('u',1024),('w',2048),('x',4096),('y',8192),('z',16384)] "y" encode [('c',2),('d',2),('g',4),('h',8),('j',16),('k',32),('l',64),('m',128),('r',256),('s',512),('u',1024),('w',2048),('x',4096),('y',8192),('z',16384)] "z" encode [('a',2),('b',2),('c',4),('e',8),('g',16),('h',32),('l',64),('m',128),('n',256),('o',512),('s',1024),('t',2048),('v',4096),('y',8192),('z',16384)] "a" encode [('a',2),('b',2),('c',4),('e',8),('g',16),('h',32),('l',64),('m',128),('n',256),('o',512),('s',1024),('t',2048),('v',4096),('y',8192),('z',16384)] "b" encode [('a',2),('b',2),('c',4),('e',8),('g',16),('h',32),('l',64),('m',128),('n',256),('o',512),('s',1024),('t',2048),('v',4096),('y',8192),('z',16384)] "b" encode [('a',2),('b',2),('c',4),('e',8),('g',16),('h',32),('l',64),('m',128),('n',256),('o',512),('s',1024),('t',2048),('v',4096),('y',8192),('z',16384)] "c" encode [('a',2),('b',2),('c',4),('e',8),('g',16),('h',32),('l',64),('m',128),('n',256),('o',512),('s',1024),('t',2048),('v',4096),('y',8192),('z',16384)] "c" encode [('a',2),('b',2),('c',4),('e',8),('g',16),('h',32),('l',64),('m',128),('n',256),('o',512),('s',1024),('t',2048),('v',4096),('y',8192),('z',16384)] "e" encode [('a',2),('b',2),('c',4),('e',8),('g',16),('h',32),('l',64),('m',128),('n',256),('o',512),('s',1024),('t',2048),('v',4096),('y',8192),('z',16384)] "e" encode [('a',2),('b',2),('c',4),('e',8),('g',16),('h',32),('l',64),('m',128),('n',256),('o',512),('s',1024),('t',2048),('v',4096),('y',8192),('z',16384)] "g" encode [('a',2),('b',2),('c',4),('e',8),('g',16),('h',32),('l',64),('m',128),('n',256),('o',512),('s',1024),('t',2048),('v',4096),('y',8192),('z',16384)] "g" encode [('a',2),('b',2),('c',4),('e',8),('g',16),('h',32),('l',64),('m',128),('n',256),('o',512),('s',1024),('t',2048),('v',4096),('y',8192),('z',16384)] "h" encode [('a',2),('b',2),('c',4),('e',8),('g',16),('h',32),('l',64),('m',128),('n',256),('o',512),('s',1024),('t',2048),('v',4096),('y',8192),('z',16384)] "h" encode [('a',2),('b',2),('c',4),('e',8),('g',16),('h',32),('l',64),('m',128),('n',256),('o',512),('s',1024),('t',2048),('v',4096),('y',8192),('z',16384)] "l" encode [('a',2),('b',2),('c',4),('e',8),('g',16),('h',32),('l',64),('m',128),('n',256),('o',512),('s',1024),('t',2048),('v',4096),('y',8192),('z',16384)] "l" encode [('a',2),('b',2),('c',4),('e',8),('g',16),('h',32),('l',64),('m',128),('n',256),('o',512),('s',1024),('t',2048),('v',4096),('y',8192),('z',16384)] "m" encode [('a',2),('b',2),('c',4),('e',8),('g',16),('h',32),('l',64),('m',128),('n',256),('o',512),('s',1024),('t',2048),('v',4096),('y',8192),('z',16384)] "m" encode [('a',2),('b',2),('c',4),('e',8),('g',16),('h',32),('l',64),('m',128),('n',256),('o',512),('s',1024),('t',2048),('v',4096),('y',8192),('z',16384)] "n" encode [('a',2),('b',2),('c',4),('e',8),('g',16),('h',32),('l',64),('m',128),('n',256),('o',512),('s',1024),('t',2048),('v',4096),('y',8192),('z',16384)] "n" encode [('a',2),('b',2),('c',4),('e',8),('g',16),('h',32),('l',64),('m',128),('n',256),('o',512),('s',1024),('t',2048),('v',4096),('y',8192),('z',16384)] "o" encode [('a',2),('b',2),('c',4),('e',8),('g',16),('h',32),('l',64),('m',128),('n',256),('o',512),('s',1024),('t',2048),('v',4096),('y',8192),('z',16384)] "o" encode [('a',2),('b',2),('c',4),('e',8),('g',16),('h',32),('l',64),('m',128),('n',256),('o',512),('s',1024),('t',2048),('v',4096),('y',8192),('z',16384)] "s" encode [('a',2),('b',2),('c',4),('e',8),('g',16),('h',32),('l',64),('m',128),('n',256),('o',512),('s',1024),('t',2048),('v',4096),('y',8192),('z',16384)] "s" encode [('a',2),('b',2),('c',4),('e',8),('g',16),('h',32),('l',64),('m',128),('n',256),('o',512),('s',1024),('t',2048),('v',4096),('y',8192),('z',16384)] "t" encode [('a',2),('b',2),('c',4),('e',8),('g',16),('h',32),('l',64),('m',128),('n',256),('o',512),('s',1024),('t',2048),('v',4096),('y',8192),('z',16384)] "t" encode [('a',2),('b',2),('c',4),('e',8),('g',16),('h',32),('l',64),('m',128),('n',256),('o',512),('s',1024),('t',2048),('v',4096),('y',8192),('z',16384)] "v" encode [('a',2),('b',2),('c',4),('e',8),('g',16),('h',32),('l',64),('m',128),('n',256),('o',512),('s',1024),('t',2048),('v',4096),('y',8192),('z',16384)] "v" encode [('a',2),('b',2),('c',4),('e',8),('g',16),('h',32),('l',64),('m',128),('n',256),('o',512),('s',1024),('t',2048),('v',4096),('y',8192),('z',16384)] "y" encode [('a',2),('b',2),('c',4),('e',8),('g',16),('h',32),('l',64),('m',128),('n',256),('o',512),('s',1024),('t',2048),('v',4096),('y',8192),('z',16384)] "y" encode [('a',2),('b',2),('c',4),('e',8),('g',16),('h',32),('l',64),('m',128),('n',256),('o',512),('s',1024),('t',2048),('v',4096),('y',8192),('z',16384)] "z" encode [('a',2),('d',2),('e',4),('f',8),('g',16),('h',32),('l',64),('o',128),('p',256),('r',512),('s',1024),('u',2048),('w',4096),('x',8192),('y',16384)] "a" encode [('a',2),('d',2),('e',4),('f',8),('g',16),('h',32),('l',64),('o',128),('p',256),('r',512),('s',1024),('u',2048),('w',4096),('x',8192),('y',16384)] "d" encode [('a',2),('d',2),('e',4),('f',8),('g',16),('h',32),('l',64),('o',128),('p',256),('r',512),('s',1024),('u',2048),('w',4096),('x',8192),('y',16384)] "d" encode [('a',2),('d',2),('e',4),('f',8),('g',16),('h',32),('l',64),('o',128),('p',256),('r',512),('s',1024),('u',2048),('w',4096),('x',8192),('y',16384)] "e" encode [('a',2),('d',2),('e',4),('f',8),('g',16),('h',32),('l',64),('o',128),('p',256),('r',512),('s',1024),('u',2048),('w',4096),('x',8192),('y',16384)] "e" encode [('a',2),('d',2),('e',4),('f',8),('g',16),('h',32),('l',64),('o',128),('p',256),('r',512),('s',1024),('u',2048),('w',4096),('x',8192),('y',16384)] "f" encode [('a',2),('d',2),('e',4),('f',8),('g',16),('h',32),('l',64),('o',128),('p',256),('r',512),('s',1024),('u',2048),('w',4096),('x',8192),('y',16384)] "f" encode [('a',2),('d',2),('e',4),('f',8),('g',16),('h',32),('l',64),('o',128),('p',256),('r',512),('s',1024),('u',2048),('w',4096),('x',8192),('y',16384)] "g" encode [('a',2),('d',2),('e',4),('f',8),('g',16),('h',32),('l',64),('o',128),('p',256),('r',512),('s',1024),('u',2048),('w',4096),('x',8192),('y',16384)] "g" encode [('a',2),('d',2),('e',4),('f',8),('g',16),('h',32),('l',64),('o',128),('p',256),('r',512),('s',1024),('u',2048),('w',4096),('x',8192),('y',16384)] "h" encode [('a',2),('d',2),('e',4),('f',8),('g',16),('h',32),('l',64),('o',128),('p',256),('r',512),('s',1024),('u',2048),('w',4096),('x',8192),('y',16384)] "h" encode [('a',2),('d',2),('e',4),('f',8),('g',16),('h',32),('l',64),('o',128),('p',256),('r',512),('s',1024),('u',2048),('w',4096),('x',8192),('y',16384)] "l" encode [('a',2),('d',2),('e',4),('f',8),('g',16),('h',32),('l',64),('o',128),('p',256),('r',512),('s',1024),('u',2048),('w',4096),('x',8192),('y',16384)] "l" encode [('a',2),('d',2),('e',4),('f',8),('g',16),('h',32),('l',64),('o',128),('p',256),('r',512),('s',1024),('u',2048),('w',4096),('x',8192),('y',16384)] "o" encode [('a',2),('d',2),('e',4),('f',8),('g',16),('h',32),('l',64),('o',128),('p',256),('r',512),('s',1024),('u',2048),('w',4096),('x',8192),('y',16384)] "o" encode [('a',2),('d',2),('e',4),('f',8),('g',16),('h',32),('l',64),('o',128),('p',256),('r',512),('s',1024),('u',2048),('w',4096),('x',8192),('y',16384)] "p" encode [('a',2),('d',2),('e',4),('f',8),('g',16),('h',32),('l',64),('o',128),('p',256),('r',512),('s',1024),('u',2048),('w',4096),('x',8192),('y',16384)] "p" encode [('a',2),('d',2),('e',4),('f',8),('g',16),('h',32),('l',64),('o',128),('p',256),('r',512),('s',1024),('u',2048),('w',4096),('x',8192),('y',16384)] "r" encode [('a',2),('d',2),('e',4),('f',8),('g',16),('h',32),('l',64),('o',128),('p',256),('r',512),('s',1024),('u',2048),('w',4096),('x',8192),('y',16384)] "r" encode [('a',2),('d',2),('e',4),('f',8),('g',16),('h',32),('l',64),('o',128),('p',256),('r',512),('s',1024),('u',2048),('w',4096),('x',8192),('y',16384)] "s" encode [('a',2),('d',2),('e',4),('f',8),('g',16),('h',32),('l',64),('o',128),('p',256),('r',512),('s',1024),('u',2048),('w',4096),('x',8192),('y',16384)] "s" encode [('a',2),('d',2),('e',4),('f',8),('g',16),('h',32),('l',64),('o',128),('p',256),('r',512),('s',1024),('u',2048),('w',4096),('x',8192),('y',16384)] "u" encode [('a',2),('d',2),('e',4),('f',8),('g',16),('h',32),('l',64),('o',128),('p',256),('r',512),('s',1024),('u',2048),('w',4096),('x',8192),('y',16384)] "u" encode [('a',2),('d',2),('e',4),('f',8),('g',16),('h',32),('l',64),('o',128),('p',256),('r',512),('s',1024),('u',2048),('w',4096),('x',8192),('y',16384)] "w" encode [('a',2),('d',2),('e',4),('f',8),('g',16),('h',32),('l',64),('o',128),('p',256),('r',512),('s',1024),('u',2048),('w',4096),('x',8192),('y',16384)] "w" encode [('a',2),('d',2),('e',4),('f',8),('g',16),('h',32),('l',64),('o',128),('p',256),('r',512),('s',1024),('u',2048),('w',4096),('x',8192),('y',16384)] "x" encode [('a',2),('d',2),('e',4),('f',8),('g',16),('h',32),('l',64),('o',128),('p',256),('r',512),('s',1024),('u',2048),('w',4096),('x',8192),('y',16384)] "x" encode [('a',2),('d',2),('e',4),('f',8),('g',16),('h',32),('l',64),('o',128),('p',256),('r',512),('s',1024),('u',2048),('w',4096),('x',8192),('y',16384)] "y" encode [('c',2),('e',2),('f',4),('h',8),('i',16),('j',32),('l',64),('m',128),('n',256),('p',512),('r',1024),('s',2048),('w',4096),('x',8192),('z',16384)] "c" encode [('c',2),('e',2),('f',4),('h',8),('i',16),('j',32),('l',64),('m',128),('n',256),('p',512),('r',1024),('s',2048),('w',4096),('x',8192),('z',16384)] "e" encode [('c',2),('e',2),('f',4),('h',8),('i',16),('j',32),('l',64),('m',128),('n',256),('p',512),('r',1024),('s',2048),('w',4096),('x',8192),('z',16384)] "e" encode [('c',2),('e',2),('f',4),('h',8),('i',16),('j',32),('l',64),('m',128),('n',256),('p',512),('r',1024),('s',2048),('w',4096),('x',8192),('z',16384)] "f" encode [('c',2),('e',2),('f',4),('h',8),('i',16),('j',32),('l',64),('m',128),('n',256),('p',512),('r',1024),('s',2048),('w',4096),('x',8192),('z',16384)] "f" encode [('c',2),('e',2),('f',4),('h',8),('i',16),('j',32),('l',64),('m',128),('n',256),('p',512),('r',1024),('s',2048),('w',4096),('x',8192),('z',16384)] "h" encode [('c',2),('e',2),('f',4),('h',8),('i',16),('j',32),('l',64),('m',128),('n',256),('p',512),('r',1024),('s',2048),('w',4096),('x',8192),('z',16384)] "h" encode [('c',2),('e',2),('f',4),('h',8),('i',16),('j',32),('l',64),('m',128),('n',256),('p',512),('r',1024),('s',2048),('w',4096),('x',8192),('z',16384)] "i" encode [('c',2),('e',2),('f',4),('h',8),('i',16),('j',32),('l',64),('m',128),('n',256),('p',512),('r',1024),('s',2048),('w',4096),('x',8192),('z',16384)] "i" encode [('c',2),('e',2),('f',4),('h',8),('i',16),('j',32),('l',64),('m',128),('n',256),('p',512),('r',1024),('s',2048),('w',4096),('x',8192),('z',16384)] "j" encode [('c',2),('e',2),('f',4),('h',8),('i',16),('j',32),('l',64),('m',128),('n',256),('p',512),('r',1024),('s',2048),('w',4096),('x',8192),('z',16384)] "j" encode [('c',2),('e',2),('f',4),('h',8),('i',16),('j',32),('l',64),('m',128),('n',256),('p',512),('r',1024),('s',2048),('w',4096),('x',8192),('z',16384)] "l" encode [('c',2),('e',2),('f',4),('h',8),('i',16),('j',32),('l',64),('m',128),('n',256),('p',512),('r',1024),('s',2048),('w',4096),('x',8192),('z',16384)] "l" encode [('c',2),('e',2),('f',4),('h',8),('i',16),('j',32),('l',64),('m',128),('n',256),('p',512),('r',1024),('s',2048),('w',4096),('x',8192),('z',16384)] "m" encode [('c',2),('e',2),('f',4),('h',8),('i',16),('j',32),('l',64),('m',128),('n',256),('p',512),('r',1024),('s',2048),('w',4096),('x',8192),('z',16384)] "m" encode [('c',2),('e',2),('f',4),('h',8),('i',16),('j',32),('l',64),('m',128),('n',256),('p',512),('r',1024),('s',2048),('w',4096),('x',8192),('z',16384)] "n" encode [('c',2),('e',2),('f',4),('h',8),('i',16),('j',32),('l',64),('m',128),('n',256),('p',512),('r',1024),('s',2048),('w',4096),('x',8192),('z',16384)] "n" encode [('c',2),('e',2),('f',4),('h',8),('i',16),('j',32),('l',64),('m',128),('n',256),('p',512),('r',1024),('s',2048),('w',4096),('x',8192),('z',16384)] "p" encode [('c',2),('e',2),('f',4),('h',8),('i',16),('j',32),('l',64),('m',128),('n',256),('p',512),('r',1024),('s',2048),('w',4096),('x',8192),('z',16384)] "p" encode [('c',2),('e',2),('f',4),('h',8),('i',16),('j',32),('l',64),('m',128),('n',256),('p',512),('r',1024),('s',2048),('w',4096),('x',8192),('z',16384)] "r" encode [('c',2),('e',2),('f',4),('h',8),('i',16),('j',32),('l',64),('m',128),('n',256),('p',512),('r',1024),('s',2048),('w',4096),('x',8192),('z',16384)] "r" encode [('c',2),('e',2),('f',4),('h',8),('i',16),('j',32),('l',64),('m',128),('n',256),('p',512),('r',1024),('s',2048),('w',4096),('x',8192),('z',16384)] "s" encode [('c',2),('e',2),('f',4),('h',8),('i',16),('j',32),('l',64),('m',128),('n',256),('p',512),('r',1024),('s',2048),('w',4096),('x',8192),('z',16384)] "s" encode [('c',2),('e',2),('f',4),('h',8),('i',16),('j',32),('l',64),('m',128),('n',256),('p',512),('r',1024),('s',2048),('w',4096),('x',8192),('z',16384)] "w" encode [('c',2),('e',2),('f',4),('h',8),('i',16),('j',32),('l',64),('m',128),('n',256),('p',512),('r',1024),('s',2048),('w',4096),('x',8192),('z',16384)] "w" encode [('c',2),('e',2),('f',4),('h',8),('i',16),('j',32),('l',64),('m',128),('n',256),('p',512),('r',1024),('s',2048),('w',4096),('x',8192),('z',16384)] "x" encode [('c',2),('e',2),('f',4),('h',8),('i',16),('j',32),('l',64),('m',128),('n',256),('p',512),('r',1024),('s',2048),('w',4096),('x',8192),('z',16384)] "x" encode [('c',2),('e',2),('f',4),('h',8),('i',16),('j',32),('l',64),('m',128),('n',256),('p',512),('r',1024),('s',2048),('w',4096),('x',8192),('z',16384)] "z" encode [('b',2),('f',2),('g',4),('h',8),('j',16),('k',32),('l',64),('n',128),('o',256),('p',512),('r',1024),('u',2048),('w',4096),('x',8192),('z',16384)] "b" encode [('b',2),('f',2),('g',4),('h',8),('j',16),('k',32),('l',64),('n',128),('o',256),('p',512),('r',1024),('u',2048),('w',4096),('x',8192),('z',16384)] "f" encode [('b',2),('f',2),('g',4),('h',8),('j',16),('k',32),('l',64),('n',128),('o',256),('p',512),('r',1024),('u',2048),('w',4096),('x',8192),('z',16384)] "f" encode [('b',2),('f',2),('g',4),('h',8),('j',16),('k',32),('l',64),('n',128),('o',256),('p',512),('r',1024),('u',2048),('w',4096),('x',8192),('z',16384)] "g" encode [('b',2),('f',2),('g',4),('h',8),('j',16),('k',32),('l',64),('n',128),('o',256),('p',512),('r',1024),('u',2048),('w',4096),('x',8192),('z',16384)] "g" encode [('b',2),('f',2),('g',4),('h',8),('j',16),('k',32),('l',64),('n',128),('o',256),('p',512),('r',1024),('u',2048),('w',4096),('x',8192),('z',16384)] "h" encode [('b',2),('f',2),('g',4),('h',8),('j',16),('k',32),('l',64),('n',128),('o',256),('p',512),('r',1024),('u',2048),('w',4096),('x',8192),('z',16384)] "h" encode [('b',2),('f',2),('g',4),('h',8),('j',16),('k',32),('l',64),('n',128),('o',256),('p',512),('r',1024),('u',2048),('w',4096),('x',8192),('z',16384)] "j" encode [('b',2),('f',2),('g',4),('h',8),('j',16),('k',32),('l',64),('n',128),('o',256),('p',512),('r',1024),('u',2048),('w',4096),('x',8192),('z',16384)] "j" encode [('b',2),('f',2),('g',4),('h',8),('j',16),('k',32),('l',64),('n',128),('o',256),('p',512),('r',1024),('u',2048),('w',4096),('x',8192),('z',16384)] "k" encode [('b',2),('f',2),('g',4),('h',8),('j',16),('k',32),('l',64),('n',128),('o',256),('p',512),('r',1024),('u',2048),('w',4096),('x',8192),('z',16384)] "k" encode [('b',2),('f',2),('g',4),('h',8),('j',16),('k',32),('l',64),('n',128),('o',256),('p',512),('r',1024),('u',2048),('w',4096),('x',8192),('z',16384)] "l" encode [('b',2),('f',2),('g',4),('h',8),('j',16),('k',32),('l',64),('n',128),('o',256),('p',512),('r',1024),('u',2048),('w',4096),('x',8192),('z',16384)] "l" encode [('b',2),('f',2),('g',4),('h',8),('j',16),('k',32),('l',64),('n',128),('o',256),('p',512),('r',1024),('u',2048),('w',4096),('x',8192),('z',16384)] "n" encode [('b',2),('f',2),('g',4),('h',8),('j',16),('k',32),('l',64),('n',128),('o',256),('p',512),('r',1024),('u',2048),('w',4096),('x',8192),('z',16384)] "n" encode [('b',2),('f',2),('g',4),('h',8),('j',16),('k',32),('l',64),('n',128),('o',256),('p',512),('r',1024),('u',2048),('w',4096),('x',8192),('z',16384)] "o" encode [('b',2),('f',2),('g',4),('h',8),('j',16),('k',32),('l',64),('n',128),('o',256),('p',512),('r',1024),('u',2048),('w',4096),('x',8192),('z',16384)] "o" encode [('b',2),('f',2),('g',4),('h',8),('j',16),('k',32),('l',64),('n',128),('o',256),('p',512),('r',1024),('u',2048),('w',4096),('x',8192),('z',16384)] "p" encode [('b',2),('f',2),('g',4),('h',8),('j',16),('k',32),('l',64),('n',128),('o',256),('p',512),('r',1024),('u',2048),('w',4096),('x',8192),('z',16384)] "p" encode [('b',2),('f',2),('g',4),('h',8),('j',16),('k',32),('l',64),('n',128),('o',256),('p',512),('r',1024),('u',2048),('w',4096),('x',8192),('z',16384)] "r" encode [('b',2),('f',2),('g',4),('h',8),('j',16),('k',32),('l',64),('n',128),('o',256),('p',512),('r',1024),('u',2048),('w',4096),('x',8192),('z',16384)] "r" encode [('b',2),('f',2),('g',4),('h',8),('j',16),('k',32),('l',64),('n',128),('o',256),('p',512),('r',1024),('u',2048),('w',4096),('x',8192),('z',16384)] "u" encode [('b',2),('f',2),('g',4),('h',8),('j',16),('k',32),('l',64),('n',128),('o',256),('p',512),('r',1024),('u',2048),('w',4096),('x',8192),('z',16384)] "u" encode [('b',2),('f',2),('g',4),('h',8),('j',16),('k',32),('l',64),('n',128),('o',256),('p',512),('r',1024),('u',2048),('w',4096),('x',8192),('z',16384)] "w" encode [('b',2),('f',2),('g',4),('h',8),('j',16),('k',32),('l',64),('n',128),('o',256),('p',512),('r',1024),('u',2048),('w',4096),('x',8192),('z',16384)] "w" encode [('b',2),('f',2),('g',4),('h',8),('j',16),('k',32),('l',64),('n',128),('o',256),('p',512),('r',1024),('u',2048),('w',4096),('x',8192),('z',16384)] "x" encode [('b',2),('f',2),('g',4),('h',8),('j',16),('k',32),('l',64),('n',128),('o',256),('p',512),('r',1024),('u',2048),('w',4096),('x',8192),('z',16384)] "x" encode [('b',2),('f',2),('g',4),('h',8),('j',16),('k',32),('l',64),('n',128),('o',256),('p',512),('r',1024),('u',2048),('w',4096),('x',8192),('z',16384)] "z" encode [('b',2),('c',2),('d',4),('f',8),('g',16),('h',32),('l',64),('m',128),('o',256),('p',512),('s',1024),('v',2048),('w',4096),('y',8192),('z',16384)] "b" encode [('b',2),('c',2),('d',4),('f',8),('g',16),('h',32),('l',64),('m',128),('o',256),('p',512),('s',1024),('v',2048),('w',4096),('y',8192),('z',16384)] "c" encode [('b',2),('c',2),('d',4),('f',8),('g',16),('h',32),('l',64),('m',128),('o',256),('p',512),('s',1024),('v',2048),('w',4096),('y',8192),('z',16384)] "c" encode [('b',2),('c',2),('d',4),('f',8),('g',16),('h',32),('l',64),('m',128),('o',256),('p',512),('s',1024),('v',2048),('w',4096),('y',8192),('z',16384)] "d" encode [('b',2),('c',2),('d',4),('f',8),('g',16),('h',32),('l',64),('m',128),('o',256),('p',512),('s',1024),('v',2048),('w',4096),('y',8192),('z',16384)] "d" encode [('b',2),('c',2),('d',4),('f',8),('g',16),('h',32),('l',64),('m',128),('o',256),('p',512),('s',1024),('v',2048),('w',4096),('y',8192),('z',16384)] "f" encode [('b',2),('c',2),('d',4),('f',8),('g',16),('h',32),('l',64),('m',128),('o',256),('p',512),('s',1024),('v',2048),('w',4096),('y',8192),('z',16384)] "f" encode [('b',2),('c',2),('d',4),('f',8),('g',16),('h',32),('l',64),('m',128),('o',256),('p',512),('s',1024),('v',2048),('w',4096),('y',8192),('z',16384)] "g" encode [('b',2),('c',2),('d',4),('f',8),('g',16),('h',32),('l',64),('m',128),('o',256),('p',512),('s',1024),('v',2048),('w',4096),('y',8192),('z',16384)] "g" encode [('b',2),('c',2),('d',4),('f',8),('g',16),('h',32),('l',64),('m',128),('o',256),('p',512),('s',1024),('v',2048),('w',4096),('y',8192),('z',16384)] "h" encode [('b',2),('c',2),('d',4),('f',8),('g',16),('h',32),('l',64),('m',128),('o',256),('p',512),('s',1024),('v',2048),('w',4096),('y',8192),('z',16384)] "h" encode [('b',2),('c',2),('d',4),('f',8),('g',16),('h',32),('l',64),('m',128),('o',256),('p',512),('s',1024),('v',2048),('w',4096),('y',8192),('z',16384)] "l" encode [('b',2),('c',2),('d',4),('f',8),('g',16),('h',32),('l',64),('m',128),('o',256),('p',512),('s',1024),('v',2048),('w',4096),('y',8192),('z',16384)] "l" encode [('b',2),('c',2),('d',4),('f',8),('g',16),('h',32),('l',64),('m',128),('o',256),('p',512),('s',1024),('v',2048),('w',4096),('y',8192),('z',16384)] "m" encode [('b',2),('c',2),('d',4),('f',8),('g',16),('h',32),('l',64),('m',128),('o',256),('p',512),('s',1024),('v',2048),('w',4096),('y',8192),('z',16384)] "m" encode [('b',2),('c',2),('d',4),('f',8),('g',16),('h',32),('l',64),('m',128),('o',256),('p',512),('s',1024),('v',2048),('w',4096),('y',8192),('z',16384)] "o" encode [('b',2),('c',2),('d',4),('f',8),('g',16),('h',32),('l',64),('m',128),('o',256),('p',512),('s',1024),('v',2048),('w',4096),('y',8192),('z',16384)] "o" encode [('b',2),('c',2),('d',4),('f',8),('g',16),('h',32),('l',64),('m',128),('o',256),('p',512),('s',1024),('v',2048),('w',4096),('y',8192),('z',16384)] "p" encode [('b',2),('c',2),('d',4),('f',8),('g',16),('h',32),('l',64),('m',128),('o',256),('p',512),('s',1024),('v',2048),('w',4096),('y',8192),('z',16384)] "p" encode [('b',2),('c',2),('d',4),('f',8),('g',16),('h',32),('l',64),('m',128),('o',256),('p',512),('s',1024),('v',2048),('w',4096),('y',8192),('z',16384)] "s" encode [('b',2),('c',2),('d',4),('f',8),('g',16),('h',32),('l',64),('m',128),('o',256),('p',512),('s',1024),('v',2048),('w',4096),('y',8192),('z',16384)] "s" encode [('b',2),('c',2),('d',4),('f',8),('g',16),('h',32),('l',64),('m',128),('o',256),('p',512),('s',1024),('v',2048),('w',4096),('y',8192),('z',16384)] "v" encode [('b',2),('c',2),('d',4),('f',8),('g',16),('h',32),('l',64),('m',128),('o',256),('p',512),('s',1024),('v',2048),('w',4096),('y',8192),('z',16384)] "v" encode [('b',2),('c',2),('d',4),('f',8),('g',16),('h',32),('l',64),('m',128),('o',256),('p',512),('s',1024),('v',2048),('w',4096),('y',8192),('z',16384)] "w" encode [('b',2),('c',2),('d',4),('f',8),('g',16),('h',32),('l',64),('m',128),('o',256),('p',512),('s',1024),('v',2048),('w',4096),('y',8192),('z',16384)] "w" encode [('b',2),('c',2),('d',4),('f',8),('g',16),('h',32),('l',64),('m',128),('o',256),('p',512),('s',1024),('v',2048),('w',4096),('y',8192),('z',16384)] "y" encode [('b',2),('c',2),('d',4),('f',8),('g',16),('h',32),('l',64),('m',128),('o',256),('p',512),('s',1024),('v',2048),('w',4096),('y',8192),('z',16384)] "y" encode [('b',2),('c',2),('d',4),('f',8),('g',16),('h',32),('l',64),('m',128),('o',256),('p',512),('s',1024),('v',2048),('w',4096),('y',8192),('z',16384)] "z" encode [('b',2),('d',2),('e',4),('g',8),('h',16),('i',32),('j',64),('k',128),('p',256),('r',512),('s',1024),('t',2048),('v',4096),('w',8192),('y',16384)] "b" encode [('b',2),('d',2),('e',4),('g',8),('h',16),('i',32),('j',64),('k',128),('p',256),('r',512),('s',1024),('t',2048),('v',4096),('w',8192),('y',16384)] "d" encode [('b',2),('d',2),('e',4),('g',8),('h',16),('i',32),('j',64),('k',128),('p',256),('r',512),('s',1024),('t',2048),('v',4096),('w',8192),('y',16384)] "d" encode [('b',2),('d',2),('e',4),('g',8),('h',16),('i',32),('j',64),('k',128),('p',256),('r',512),('s',1024),('t',2048),('v',4096),('w',8192),('y',16384)] "e" encode [('b',2),('d',2),('e',4),('g',8),('h',16),('i',32),('j',64),('k',128),('p',256),('r',512),('s',1024),('t',2048),('v',4096),('w',8192),('y',16384)] "e" encode [('b',2),('d',2),('e',4),('g',8),('h',16),('i',32),('j',64),('k',128),('p',256),('r',512),('s',1024),('t',2048),('v',4096),('w',8192),('y',16384)] "g" encode [('b',2),('d',2),('e',4),('g',8),('h',16),('i',32),('j',64),('k',128),('p',256),('r',512),('s',1024),('t',2048),('v',4096),('w',8192),('y',16384)] "g" encode [('b',2),('d',2),('e',4),('g',8),('h',16),('i',32),('j',64),('k',128),('p',256),('r',512),('s',1024),('t',2048),('v',4096),('w',8192),('y',16384)] "h" encode [('b',2),('d',2),('e',4),('g',8),('h',16),('i',32),('j',64),('k',128),('p',256),('r',512),('s',1024),('t',2048),('v',4096),('w',8192),('y',16384)] "h" encode [('b',2),('d',2),('e',4),('g',8),('h',16),('i',32),('j',64),('k',128),('p',256),('r',512),('s',1024),('t',2048),('v',4096),('w',8192),('y',16384)] "i" encode [('b',2),('d',2),('e',4),('g',8),('h',16),('i',32),('j',64),('k',128),('p',256),('r',512),('s',1024),('t',2048),('v',4096),('w',8192),('y',16384)] "i" encode [('b',2),('d',2),('e',4),('g',8),('h',16),('i',32),('j',64),('k',128),('p',256),('r',512),('s',1024),('t',2048),('v',4096),('w',8192),('y',16384)] "j" encode [('b',2),('d',2),('e',4),('g',8),('h',16),('i',32),('j',64),('k',128),('p',256),('r',512),('s',1024),('t',2048),('v',4096),('w',8192),('y',16384)] "j" encode [('b',2),('d',2),('e',4),('g',8),('h',16),('i',32),('j',64),('k',128),('p',256),('r',512),('s',1024),('t',2048),('v',4096),('w',8192),('y',16384)] "k" encode [('b',2),('d',2),('e',4),('g',8),('h',16),('i',32),('j',64),('k',128),('p',256),('r',512),('s',1024),('t',2048),('v',4096),('w',8192),('y',16384)] "k" encode [('b',2),('d',2),('e',4),('g',8),('h',16),('i',32),('j',64),('k',128),('p',256),('r',512),('s',1024),('t',2048),('v',4096),('w',8192),('y',16384)] "p" encode [('b',2),('d',2),('e',4),('g',8),('h',16),('i',32),('j',64),('k',128),('p',256),('r',512),('s',1024),('t',2048),('v',4096),('w',8192),('y',16384)] "p" encode [('b',2),('d',2),('e',4),('g',8),('h',16),('i',32),('j',64),('k',128),('p',256),('r',512),('s',1024),('t',2048),('v',4096),('w',8192),('y',16384)] "r" encode [('b',2),('d',2),('e',4),('g',8),('h',16),('i',32),('j',64),('k',128),('p',256),('r',512),('s',1024),('t',2048),('v',4096),('w',8192),('y',16384)] "r" encode [('b',2),('d',2),('e',4),('g',8),('h',16),('i',32),('j',64),('k',128),('p',256),('r',512),('s',1024),('t',2048),('v',4096),('w',8192),('y',16384)] "s" encode [('b',2),('d',2),('e',4),('g',8),('h',16),('i',32),('j',64),('k',128),('p',256),('r',512),('s',1024),('t',2048),('v',4096),('w',8192),('y',16384)] "s" encode [('b',2),('d',2),('e',4),('g',8),('h',16),('i',32),('j',64),('k',128),('p',256),('r',512),('s',1024),('t',2048),('v',4096),('w',8192),('y',16384)] "t" encode [('b',2),('d',2),('e',4),('g',8),('h',16),('i',32),('j',64),('k',128),('p',256),('r',512),('s',1024),('t',2048),('v',4096),('w',8192),('y',16384)] "t" encode [('b',2),('d',2),('e',4),('g',8),('h',16),('i',32),('j',64),('k',128),('p',256),('r',512),('s',1024),('t',2048),('v',4096),('w',8192),('y',16384)] "v" encode [('b',2),('d',2),('e',4),('g',8),('h',16),('i',32),('j',64),('k',128),('p',256),('r',512),('s',1024),('t',2048),('v',4096),('w',8192),('y',16384)] "v" encode [('b',2),('d',2),('e',4),('g',8),('h',16),('i',32),('j',64),('k',128),('p',256),('r',512),('s',1024),('t',2048),('v',4096),('w',8192),('y',16384)] "w" encode [('b',2),('d',2),('e',4),('g',8),('h',16),('i',32),('j',64),('k',128),('p',256),('r',512),('s',1024),('t',2048),('v',4096),('w',8192),('y',16384)] "w" encode [('b',2),('d',2),('e',4),('g',8),('h',16),('i',32),('j',64),('k',128),('p',256),('r',512),('s',1024),('t',2048),('v',4096),('w',8192),('y',16384)] "y" encode [('e',2),('f',2),('g',4),('h',8),('j',16),('k',32),('m',64),('p',128),('q',256),('s',512),('t',1024),('v',2048),('w',4096),('x',8192),('z',16384)] "e" encode [('e',2),('f',2),('g',4),('h',8),('j',16),('k',32),('m',64),('p',128),('q',256),('s',512),('t',1024),('v',2048),('w',4096),('x',8192),('z',16384)] "f" encode [('e',2),('f',2),('g',4),('h',8),('j',16),('k',32),('m',64),('p',128),('q',256),('s',512),('t',1024),('v',2048),('w',4096),('x',8192),('z',16384)] "f" encode [('e',2),('f',2),('g',4),('h',8),('j',16),('k',32),('m',64),('p',128),('q',256),('s',512),('t',1024),('v',2048),('w',4096),('x',8192),('z',16384)] "g" encode [('e',2),('f',2),('g',4),('h',8),('j',16),('k',32),('m',64),('p',128),('q',256),('s',512),('t',1024),('v',2048),('w',4096),('x',8192),('z',16384)] "g" encode [('e',2),('f',2),('g',4),('h',8),('j',16),('k',32),('m',64),('p',128),('q',256),('s',512),('t',1024),('v',2048),('w',4096),('x',8192),('z',16384)] "h" encode [('e',2),('f',2),('g',4),('h',8),('j',16),('k',32),('m',64),('p',128),('q',256),('s',512),('t',1024),('v',2048),('w',4096),('x',8192),('z',16384)] "h" encode [('e',2),('f',2),('g',4),('h',8),('j',16),('k',32),('m',64),('p',128),('q',256),('s',512),('t',1024),('v',2048),('w',4096),('x',8192),('z',16384)] "j" encode [('e',2),('f',2),('g',4),('h',8),('j',16),('k',32),('m',64),('p',128),('q',256),('s',512),('t',1024),('v',2048),('w',4096),('x',8192),('z',16384)] "j" encode [('e',2),('f',2),('g',4),('h',8),('j',16),('k',32),('m',64),('p',128),('q',256),('s',512),('t',1024),('v',2048),('w',4096),('x',8192),('z',16384)] "k" encode [('e',2),('f',2),('g',4),('h',8),('j',16),('k',32),('m',64),('p',128),('q',256),('s',512),('t',1024),('v',2048),('w',4096),('x',8192),('z',16384)] "k" encode [('e',2),('f',2),('g',4),('h',8),('j',16),('k',32),('m',64),('p',128),('q',256),('s',512),('t',1024),('v',2048),('w',4096),('x',8192),('z',16384)] "m" encode [('e',2),('f',2),('g',4),('h',8),('j',16),('k',32),('m',64),('p',128),('q',256),('s',512),('t',1024),('v',2048),('w',4096),('x',8192),('z',16384)] "m" encode [('e',2),('f',2),('g',4),('h',8),('j',16),('k',32),('m',64),('p',128),('q',256),('s',512),('t',1024),('v',2048),('w',4096),('x',8192),('z',16384)] "p" encode [('e',2),('f',2),('g',4),('h',8),('j',16),('k',32),('m',64),('p',128),('q',256),('s',512),('t',1024),('v',2048),('w',4096),('x',8192),('z',16384)] "p" encode [('e',2),('f',2),('g',4),('h',8),('j',16),('k',32),('m',64),('p',128),('q',256),('s',512),('t',1024),('v',2048),('w',4096),('x',8192),('z',16384)] "q" encode [('e',2),('f',2),('g',4),('h',8),('j',16),('k',32),('m',64),('p',128),('q',256),('s',512),('t',1024),('v',2048),('w',4096),('x',8192),('z',16384)] "q" encode [('e',2),('f',2),('g',4),('h',8),('j',16),('k',32),('m',64),('p',128),('q',256),('s',512),('t',1024),('v',2048),('w',4096),('x',8192),('z',16384)] "s" encode [('e',2),('f',2),('g',4),('h',8),('j',16),('k',32),('m',64),('p',128),('q',256),('s',512),('t',1024),('v',2048),('w',4096),('x',8192),('z',16384)] "s" encode [('e',2),('f',2),('g',4),('h',8),('j',16),('k',32),('m',64),('p',128),('q',256),('s',512),('t',1024),('v',2048),('w',4096),('x',8192),('z',16384)] "t" encode [('e',2),('f',2),('g',4),('h',8),('j',16),('k',32),('m',64),('p',128),('q',256),('s',512),('t',1024),('v',2048),('w',4096),('x',8192),('z',16384)] "t" encode [('e',2),('f',2),('g',4),('h',8),('j',16),('k',32),('m',64),('p',128),('q',256),('s',512),('t',1024),('v',2048),('w',4096),('x',8192),('z',16384)] "v" encode [('e',2),('f',2),('g',4),('h',8),('j',16),('k',32),('m',64),('p',128),('q',256),('s',512),('t',1024),('v',2048),('w',4096),('x',8192),('z',16384)] "v" encode [('e',2),('f',2),('g',4),('h',8),('j',16),('k',32),('m',64),('p',128),('q',256),('s',512),('t',1024),('v',2048),('w',4096),('x',8192),('z',16384)] "w" encode [('e',2),('f',2),('g',4),('h',8),('j',16),('k',32),('m',64),('p',128),('q',256),('s',512),('t',1024),('v',2048),('w',4096),('x',8192),('z',16384)] "w" encode [('e',2),('f',2),('g',4),('h',8),('j',16),('k',32),('m',64),('p',128),('q',256),('s',512),('t',1024),('v',2048),('w',4096),('x',8192),('z',16384)] "x" encode [('e',2),('f',2),('g',4),('h',8),('j',16),('k',32),('m',64),('p',128),('q',256),('s',512),('t',1024),('v',2048),('w',4096),('x',8192),('z',16384)] "x" encode [('e',2),('f',2),('g',4),('h',8),('j',16),('k',32),('m',64),('p',128),('q',256),('s',512),('t',1024),('v',2048),('w',4096),('x',8192),('z',16384)] "z" encode [('b',2),('d',2),('e',4),('g',8),('i',16),('j',32),('l',64),('n',128),('q',256),('r',512),('s',1024),('t',2048),('v',4096),('x',8192),('z',16384)] "b" encode [('b',2),('d',2),('e',4),('g',8),('i',16),('j',32),('l',64),('n',128),('q',256),('r',512),('s',1024),('t',2048),('v',4096),('x',8192),('z',16384)] "d" encode [('b',2),('d',2),('e',4),('g',8),('i',16),('j',32),('l',64),('n',128),('q',256),('r',512),('s',1024),('t',2048),('v',4096),('x',8192),('z',16384)] "d" encode [('b',2),('d',2),('e',4),('g',8),('i',16),('j',32),('l',64),('n',128),('q',256),('r',512),('s',1024),('t',2048),('v',4096),('x',8192),('z',16384)] "e" encode [('b',2),('d',2),('e',4),('g',8),('i',16),('j',32),('l',64),('n',128),('q',256),('r',512),('s',1024),('t',2048),('v',4096),('x',8192),('z',16384)] "e" encode [('b',2),('d',2),('e',4),('g',8),('i',16),('j',32),('l',64),('n',128),('q',256),('r',512),('s',1024),('t',2048),('v',4096),('x',8192),('z',16384)] "g" encode [('b',2),('d',2),('e',4),('g',8),('i',16),('j',32),('l',64),('n',128),('q',256),('r',512),('s',1024),('t',2048),('v',4096),('x',8192),('z',16384)] "g" encode [('b',2),('d',2),('e',4),('g',8),('i',16),('j',32),('l',64),('n',128),('q',256),('r',512),('s',1024),('t',2048),('v',4096),('x',8192),('z',16384)] "i" encode [('b',2),('d',2),('e',4),('g',8),('i',16),('j',32),('l',64),('n',128),('q',256),('r',512),('s',1024),('t',2048),('v',4096),('x',8192),('z',16384)] "i" encode [('b',2),('d',2),('e',4),('g',8),('i',16),('j',32),('l',64),('n',128),('q',256),('r',512),('s',1024),('t',2048),('v',4096),('x',8192),('z',16384)] "j" encode [('b',2),('d',2),('e',4),('g',8),('i',16),('j',32),('l',64),('n',128),('q',256),('r',512),('s',1024),('t',2048),('v',4096),('x',8192),('z',16384)] "j" encode [('b',2),('d',2),('e',4),('g',8),('i',16),('j',32),('l',64),('n',128),('q',256),('r',512),('s',1024),('t',2048),('v',4096),('x',8192),('z',16384)] "l" encode [('b',2),('d',2),('e',4),('g',8),('i',16),('j',32),('l',64),('n',128),('q',256),('r',512),('s',1024),('t',2048),('v',4096),('x',8192),('z',16384)] "l" encode [('b',2),('d',2),('e',4),('g',8),('i',16),('j',32),('l',64),('n',128),('q',256),('r',512),('s',1024),('t',2048),('v',4096),('x',8192),('z',16384)] "n" encode [('b',2),('d',2),('e',4),('g',8),('i',16),('j',32),('l',64),('n',128),('q',256),('r',512),('s',1024),('t',2048),('v',4096),('x',8192),('z',16384)] "n" encode [('b',2),('d',2),('e',4),('g',8),('i',16),('j',32),('l',64),('n',128),('q',256),('r',512),('s',1024),('t',2048),('v',4096),('x',8192),('z',16384)] "q" encode [('b',2),('d',2),('e',4),('g',8),('i',16),('j',32),('l',64),('n',128),('q',256),('r',512),('s',1024),('t',2048),('v',4096),('x',8192),('z',16384)] "q" encode [('b',2),('d',2),('e',4),('g',8),('i',16),('j',32),('l',64),('n',128),('q',256),('r',512),('s',1024),('t',2048),('v',4096),('x',8192),('z',16384)] "r" encode [('b',2),('d',2),('e',4),('g',8),('i',16),('j',32),('l',64),('n',128),('q',256),('r',512),('s',1024),('t',2048),('v',4096),('x',8192),('z',16384)] "r" encode [('b',2),('d',2),('e',4),('g',8),('i',16),('j',32),('l',64),('n',128),('q',256),('r',512),('s',1024),('t',2048),('v',4096),('x',8192),('z',16384)] "s" encode [('b',2),('d',2),('e',4),('g',8),('i',16),('j',32),('l',64),('n',128),('q',256),('r',512),('s',1024),('t',2048),('v',4096),('x',8192),('z',16384)] "s" encode [('b',2),('d',2),('e',4),('g',8),('i',16),('j',32),('l',64),('n',128),('q',256),('r',512),('s',1024),('t',2048),('v',4096),('x',8192),('z',16384)] "t" encode [('b',2),('d',2),('e',4),('g',8),('i',16),('j',32),('l',64),('n',128),('q',256),('r',512),('s',1024),('t',2048),('v',4096),('x',8192),('z',16384)] "t" encode [('b',2),('d',2),('e',4),('g',8),('i',16),('j',32),('l',64),('n',128),('q',256),('r',512),('s',1024),('t',2048),('v',4096),('x',8192),('z',16384)] "v" encode [('b',2),('d',2),('e',4),('g',8),('i',16),('j',32),('l',64),('n',128),('q',256),('r',512),('s',1024),('t',2048),('v',4096),('x',8192),('z',16384)] "v" encode [('b',2),('d',2),('e',4),('g',8),('i',16),('j',32),('l',64),('n',128),('q',256),('r',512),('s',1024),('t',2048),('v',4096),('x',8192),('z',16384)] "x" encode [('b',2),('d',2),('e',4),('g',8),('i',16),('j',32),('l',64),('n',128),('q',256),('r',512),('s',1024),('t',2048),('v',4096),('x',8192),('z',16384)] "x" encode [('b',2),('d',2),('e',4),('g',8),('i',16),('j',32),('l',64),('n',128),('q',256),('r',512),('s',1024),('t',2048),('v',4096),('x',8192),('z',16384)] "z" encode [('a',2),('b',2),('c',4),('d',8),('e',16),('f',32),('h',64),('i',128),('k',256),('n',512),('p',1024),('q',2048),('r',4096),('x',8192),('y',16384)] "a" encode [('a',2),('b',2),('c',4),('d',8),('e',16),('f',32),('h',64),('i',128),('k',256),('n',512),('p',1024),('q',2048),('r',4096),('x',8192),('y',16384)] "b" encode [('a',2),('b',2),('c',4),('d',8),('e',16),('f',32),('h',64),('i',128),('k',256),('n',512),('p',1024),('q',2048),('r',4096),('x',8192),('y',16384)] "b" encode [('a',2),('b',2),('c',4),('d',8),('e',16),('f',32),('h',64),('i',128),('k',256),('n',512),('p',1024),('q',2048),('r',4096),('x',8192),('y',16384)] "c" encode [('a',2),('b',2),('c',4),('d',8),('e',16),('f',32),('h',64),('i',128),('k',256),('n',512),('p',1024),('q',2048),('r',4096),('x',8192),('y',16384)] "c" encode [('a',2),('b',2),('c',4),('d',8),('e',16),('f',32),('h',64),('i',128),('k',256),('n',512),('p',1024),('q',2048),('r',4096),('x',8192),('y',16384)] "d" encode [('a',2),('b',2),('c',4),('d',8),('e',16),('f',32),('h',64),('i',128),('k',256),('n',512),('p',1024),('q',2048),('r',4096),('x',8192),('y',16384)] "d" encode [('a',2),('b',2),('c',4),('d',8),('e',16),('f',32),('h',64),('i',128),('k',256),('n',512),('p',1024),('q',2048),('r',4096),('x',8192),('y',16384)] "e" encode [('a',2),('b',2),('c',4),('d',8),('e',16),('f',32),('h',64),('i',128),('k',256),('n',512),('p',1024),('q',2048),('r',4096),('x',8192),('y',16384)] "e" encode [('a',2),('b',2),('c',4),('d',8),('e',16),('f',32),('h',64),('i',128),('k',256),('n',512),('p',1024),('q',2048),('r',4096),('x',8192),('y',16384)] "f" encode [('a',2),('b',2),('c',4),('d',8),('e',16),('f',32),('h',64),('i',128),('k',256),('n',512),('p',1024),('q',2048),('r',4096),('x',8192),('y',16384)] "f" encode [('a',2),('b',2),('c',4),('d',8),('e',16),('f',32),('h',64),('i',128),('k',256),('n',512),('p',1024),('q',2048),('r',4096),('x',8192),('y',16384)] "h" encode [('a',2),('b',2),('c',4),('d',8),('e',16),('f',32),('h',64),('i',128),('k',256),('n',512),('p',1024),('q',2048),('r',4096),('x',8192),('y',16384)] "h" encode [('a',2),('b',2),('c',4),('d',8),('e',16),('f',32),('h',64),('i',128),('k',256),('n',512),('p',1024),('q',2048),('r',4096),('x',8192),('y',16384)] "i" encode [('a',2),('b',2),('c',4),('d',8),('e',16),('f',32),('h',64),('i',128),('k',256),('n',512),('p',1024),('q',2048),('r',4096),('x',8192),('y',16384)] "i" encode [('a',2),('b',2),('c',4),('d',8),('e',16),('f',32),('h',64),('i',128),('k',256),('n',512),('p',1024),('q',2048),('r',4096),('x',8192),('y',16384)] "k" encode [('a',2),('b',2),('c',4),('d',8),('e',16),('f',32),('h',64),('i',128),('k',256),('n',512),('p',1024),('q',2048),('r',4096),('x',8192),('y',16384)] "k" encode [('a',2),('b',2),('c',4),('d',8),('e',16),('f',32),('h',64),('i',128),('k',256),('n',512),('p',1024),('q',2048),('r',4096),('x',8192),('y',16384)] "n" encode [('a',2),('b',2),('c',4),('d',8),('e',16),('f',32),('h',64),('i',128),('k',256),('n',512),('p',1024),('q',2048),('r',4096),('x',8192),('y',16384)] "n" encode [('a',2),('b',2),('c',4),('d',8),('e',16),('f',32),('h',64),('i',128),('k',256),('n',512),('p',1024),('q',2048),('r',4096),('x',8192),('y',16384)] "p" encode [('a',2),('b',2),('c',4),('d',8),('e',16),('f',32),('h',64),('i',128),('k',256),('n',512),('p',1024),('q',2048),('r',4096),('x',8192),('y',16384)] "p" encode [('a',2),('b',2),('c',4),('d',8),('e',16),('f',32),('h',64),('i',128),('k',256),('n',512),('p',1024),('q',2048),('r',4096),('x',8192),('y',16384)] "q" encode [('a',2),('b',2),('c',4),('d',8),('e',16),('f',32),('h',64),('i',128),('k',256),('n',512),('p',1024),('q',2048),('r',4096),('x',8192),('y',16384)] "q" encode [('a',2),('b',2),('c',4),('d',8),('e',16),('f',32),('h',64),('i',128),('k',256),('n',512),('p',1024),('q',2048),('r',4096),('x',8192),('y',16384)] "r" encode [('a',2),('b',2),('c',4),('d',8),('e',16),('f',32),('h',64),('i',128),('k',256),('n',512),('p',1024),('q',2048),('r',4096),('x',8192),('y',16384)] "r" encode [('a',2),('b',2),('c',4),('d',8),('e',16),('f',32),('h',64),('i',128),('k',256),('n',512),('p',1024),('q',2048),('r',4096),('x',8192),('y',16384)] "x" encode [('a',2),('b',2),('c',4),('d',8),('e',16),('f',32),('h',64),('i',128),('k',256),('n',512),('p',1024),('q',2048),('r',4096),('x',8192),('y',16384)] "x" encode [('a',2),('b',2),('c',4),('d',8),('e',16),('f',32),('h',64),('i',128),('k',256),('n',512),('p',1024),('q',2048),('r',4096),('x',8192),('y',16384)] "y" encode [('a',2),('c',2),('e',4),('g',8),('h',16),('j',32),('k',64),('n',128),('o',256),('p',512),('q',1024),('s',2048),('u',4096),('y',8192),('z',16384)] "a" encode [('a',2),('c',2),('e',4),('g',8),('h',16),('j',32),('k',64),('n',128),('o',256),('p',512),('q',1024),('s',2048),('u',4096),('y',8192),('z',16384)] "c" encode [('a',2),('c',2),('e',4),('g',8),('h',16),('j',32),('k',64),('n',128),('o',256),('p',512),('q',1024),('s',2048),('u',4096),('y',8192),('z',16384)] "c" encode [('a',2),('c',2),('e',4),('g',8),('h',16),('j',32),('k',64),('n',128),('o',256),('p',512),('q',1024),('s',2048),('u',4096),('y',8192),('z',16384)] "e" encode [('a',2),('c',2),('e',4),('g',8),('h',16),('j',32),('k',64),('n',128),('o',256),('p',512),('q',1024),('s',2048),('u',4096),('y',8192),('z',16384)] "e" encode [('a',2),('c',2),('e',4),('g',8),('h',16),('j',32),('k',64),('n',128),('o',256),('p',512),('q',1024),('s',2048),('u',4096),('y',8192),('z',16384)] "g" encode [('a',2),('c',2),('e',4),('g',8),('h',16),('j',32),('k',64),('n',128),('o',256),('p',512),('q',1024),('s',2048),('u',4096),('y',8192),('z',16384)] "g" encode [('a',2),('c',2),('e',4),('g',8),('h',16),('j',32),('k',64),('n',128),('o',256),('p',512),('q',1024),('s',2048),('u',4096),('y',8192),('z',16384)] "h" encode [('a',2),('c',2),('e',4),('g',8),('h',16),('j',32),('k',64),('n',128),('o',256),('p',512),('q',1024),('s',2048),('u',4096),('y',8192),('z',16384)] "h" encode [('a',2),('c',2),('e',4),('g',8),('h',16),('j',32),('k',64),('n',128),('o',256),('p',512),('q',1024),('s',2048),('u',4096),('y',8192),('z',16384)] "j" encode [('a',2),('c',2),('e',4),('g',8),('h',16),('j',32),('k',64),('n',128),('o',256),('p',512),('q',1024),('s',2048),('u',4096),('y',8192),('z',16384)] "j" encode [('a',2),('c',2),('e',4),('g',8),('h',16),('j',32),('k',64),('n',128),('o',256),('p',512),('q',1024),('s',2048),('u',4096),('y',8192),('z',16384)] "k" encode [('a',2),('c',2),('e',4),('g',8),('h',16),('j',32),('k',64),('n',128),('o',256),('p',512),('q',1024),('s',2048),('u',4096),('y',8192),('z',16384)] "k" encode [('a',2),('c',2),('e',4),('g',8),('h',16),('j',32),('k',64),('n',128),('o',256),('p',512),('q',1024),('s',2048),('u',4096),('y',8192),('z',16384)] "n" encode [('a',2),('c',2),('e',4),('g',8),('h',16),('j',32),('k',64),('n',128),('o',256),('p',512),('q',1024),('s',2048),('u',4096),('y',8192),('z',16384)] "n" encode [('a',2),('c',2),('e',4),('g',8),('h',16),('j',32),('k',64),('n',128),('o',256),('p',512),('q',1024),('s',2048),('u',4096),('y',8192),('z',16384)] "o" encode [('a',2),('c',2),('e',4),('g',8),('h',16),('j',32),('k',64),('n',128),('o',256),('p',512),('q',1024),('s',2048),('u',4096),('y',8192),('z',16384)] "o" encode [('a',2),('c',2),('e',4),('g',8),('h',16),('j',32),('k',64),('n',128),('o',256),('p',512),('q',1024),('s',2048),('u',4096),('y',8192),('z',16384)] "p" encode [('a',2),('c',2),('e',4),('g',8),('h',16),('j',32),('k',64),('n',128),('o',256),('p',512),('q',1024),('s',2048),('u',4096),('y',8192),('z',16384)] "p" encode [('a',2),('c',2),('e',4),('g',8),('h',16),('j',32),('k',64),('n',128),('o',256),('p',512),('q',1024),('s',2048),('u',4096),('y',8192),('z',16384)] "q" encode [('a',2),('c',2),('e',4),('g',8),('h',16),('j',32),('k',64),('n',128),('o',256),('p',512),('q',1024),('s',2048),('u',4096),('y',8192),('z',16384)] "q" encode [('a',2),('c',2),('e',4),('g',8),('h',16),('j',32),('k',64),('n',128),('o',256),('p',512),('q',1024),('s',2048),('u',4096),('y',8192),('z',16384)] "s" encode [('a',2),('c',2),('e',4),('g',8),('h',16),('j',32),('k',64),('n',128),('o',256),('p',512),('q',1024),('s',2048),('u',4096),('y',8192),('z',16384)] "s" encode [('a',2),('c',2),('e',4),('g',8),('h',16),('j',32),('k',64),('n',128),('o',256),('p',512),('q',1024),('s',2048),('u',4096),('y',8192),('z',16384)] "u" encode [('a',2),('c',2),('e',4),('g',8),('h',16),('j',32),('k',64),('n',128),('o',256),('p',512),('q',1024),('s',2048),('u',4096),('y',8192),('z',16384)] "u" encode [('a',2),('c',2),('e',4),('g',8),('h',16),('j',32),('k',64),('n',128),('o',256),('p',512),('q',1024),('s',2048),('u',4096),('y',8192),('z',16384)] "y" encode [('a',2),('c',2),('e',4),('g',8),('h',16),('j',32),('k',64),('n',128),('o',256),('p',512),('q',1024),('s',2048),('u',4096),('y',8192),('z',16384)] "y" encode [('a',2),('c',2),('e',4),('g',8),('h',16),('j',32),('k',64),('n',128),('o',256),('p',512),('q',1024),('s',2048),('u',4096),('y',8192),('z',16384)] "z" encode [('a',2),('c',2),('d',4),('h',8),('j',16),('k',32),('l',64),('n',128),('o',256),('q',512),('s',1024),('t',2048),('u',4096),('x',8192),('y',16384)] "a" encode [('a',2),('c',2),('d',4),('h',8),('j',16),('k',32),('l',64),('n',128),('o',256),('q',512),('s',1024),('t',2048),('u',4096),('x',8192),('y',16384)] "c" encode [('a',2),('c',2),('d',4),('h',8),('j',16),('k',32),('l',64),('n',128),('o',256),('q',512),('s',1024),('t',2048),('u',4096),('x',8192),('y',16384)] "c" encode [('a',2),('c',2),('d',4),('h',8),('j',16),('k',32),('l',64),('n',128),('o',256),('q',512),('s',1024),('t',2048),('u',4096),('x',8192),('y',16384)] "d" encode [('a',2),('c',2),('d',4),('h',8),('j',16),('k',32),('l',64),('n',128),('o',256),('q',512),('s',1024),('t',2048),('u',4096),('x',8192),('y',16384)] "d" encode [('a',2),('c',2),('d',4),('h',8),('j',16),('k',32),('l',64),('n',128),('o',256),('q',512),('s',1024),('t',2048),('u',4096),('x',8192),('y',16384)] "h" encode [('a',2),('c',2),('d',4),('h',8),('j',16),('k',32),('l',64),('n',128),('o',256),('q',512),('s',1024),('t',2048),('u',4096),('x',8192),('y',16384)] "h" encode [('a',2),('c',2),('d',4),('h',8),('j',16),('k',32),('l',64),('n',128),('o',256),('q',512),('s',1024),('t',2048),('u',4096),('x',8192),('y',16384)] "j" encode [('a',2),('c',2),('d',4),('h',8),('j',16),('k',32),('l',64),('n',128),('o',256),('q',512),('s',1024),('t',2048),('u',4096),('x',8192),('y',16384)] "j" encode [('a',2),('c',2),('d',4),('h',8),('j',16),('k',32),('l',64),('n',128),('o',256),('q',512),('s',1024),('t',2048),('u',4096),('x',8192),('y',16384)] "k" encode [('a',2),('c',2),('d',4),('h',8),('j',16),('k',32),('l',64),('n',128),('o',256),('q',512),('s',1024),('t',2048),('u',4096),('x',8192),('y',16384)] "k" encode [('a',2),('c',2),('d',4),('h',8),('j',16),('k',32),('l',64),('n',128),('o',256),('q',512),('s',1024),('t',2048),('u',4096),('x',8192),('y',16384)] "l" encode [('a',2),('c',2),('d',4),('h',8),('j',16),('k',32),('l',64),('n',128),('o',256),('q',512),('s',1024),('t',2048),('u',4096),('x',8192),('y',16384)] "l" encode [('a',2),('c',2),('d',4),('h',8),('j',16),('k',32),('l',64),('n',128),('o',256),('q',512),('s',1024),('t',2048),('u',4096),('x',8192),('y',16384)] "n" encode [('a',2),('c',2),('d',4),('h',8),('j',16),('k',32),('l',64),('n',128),('o',256),('q',512),('s',1024),('t',2048),('u',4096),('x',8192),('y',16384)] "n" encode [('a',2),('c',2),('d',4),('h',8),('j',16),('k',32),('l',64),('n',128),('o',256),('q',512),('s',1024),('t',2048),('u',4096),('x',8192),('y',16384)] "o" encode [('a',2),('c',2),('d',4),('h',8),('j',16),('k',32),('l',64),('n',128),('o',256),('q',512),('s',1024),('t',2048),('u',4096),('x',8192),('y',16384)] "o" encode [('a',2),('c',2),('d',4),('h',8),('j',16),('k',32),('l',64),('n',128),('o',256),('q',512),('s',1024),('t',2048),('u',4096),('x',8192),('y',16384)] "q" encode [('a',2),('c',2),('d',4),('h',8),('j',16),('k',32),('l',64),('n',128),('o',256),('q',512),('s',1024),('t',2048),('u',4096),('x',8192),('y',16384)] "q" encode [('a',2),('c',2),('d',4),('h',8),('j',16),('k',32),('l',64),('n',128),('o',256),('q',512),('s',1024),('t',2048),('u',4096),('x',8192),('y',16384)] "s" encode [('a',2),('c',2),('d',4),('h',8),('j',16),('k',32),('l',64),('n',128),('o',256),('q',512),('s',1024),('t',2048),('u',4096),('x',8192),('y',16384)] "s" encode [('a',2),('c',2),('d',4),('h',8),('j',16),('k',32),('l',64),('n',128),('o',256),('q',512),('s',1024),('t',2048),('u',4096),('x',8192),('y',16384)] "t" encode [('a',2),('c',2),('d',4),('h',8),('j',16),('k',32),('l',64),('n',128),('o',256),('q',512),('s',1024),('t',2048),('u',4096),('x',8192),('y',16384)] "t" encode [('a',2),('c',2),('d',4),('h',8),('j',16),('k',32),('l',64),('n',128),('o',256),('q',512),('s',1024),('t',2048),('u',4096),('x',8192),('y',16384)] "u" encode [('a',2),('c',2),('d',4),('h',8),('j',16),('k',32),('l',64),('n',128),('o',256),('q',512),('s',1024),('t',2048),('u',4096),('x',8192),('y',16384)] "u" encode [('a',2),('c',2),('d',4),('h',8),('j',16),('k',32),('l',64),('n',128),('o',256),('q',512),('s',1024),('t',2048),('u',4096),('x',8192),('y',16384)] "x" encode [('a',2),('c',2),('d',4),('h',8),('j',16),('k',32),('l',64),('n',128),('o',256),('q',512),('s',1024),('t',2048),('u',4096),('x',8192),('y',16384)] "x" encode [('a',2),('c',2),('d',4),('h',8),('j',16),('k',32),('l',64),('n',128),('o',256),('q',512),('s',1024),('t',2048),('u',4096),('x',8192),('y',16384)] "y" encode [('a',2),('c',2),('d',4),('e',8),('f',16),('g',32),('i',64),('l',128),('m',256),('o',512),('s',1024),('u',2048),('w',4096),('x',8192),('z',16384)] "a" encode [('a',2),('c',2),('d',4),('e',8),('f',16),('g',32),('i',64),('l',128),('m',256),('o',512),('s',1024),('u',2048),('w',4096),('x',8192),('z',16384)] "c" encode [('a',2),('c',2),('d',4),('e',8),('f',16),('g',32),('i',64),('l',128),('m',256),('o',512),('s',1024),('u',2048),('w',4096),('x',8192),('z',16384)] "c" encode [('a',2),('c',2),('d',4),('e',8),('f',16),('g',32),('i',64),('l',128),('m',256),('o',512),('s',1024),('u',2048),('w',4096),('x',8192),('z',16384)] "d" encode [('a',2),('c',2),('d',4),('e',8),('f',16),('g',32),('i',64),('l',128),('m',256),('o',512),('s',1024),('u',2048),('w',4096),('x',8192),('z',16384)] "d" encode [('a',2),('c',2),('d',4),('e',8),('f',16),('g',32),('i',64),('l',128),('m',256),('o',512),('s',1024),('u',2048),('w',4096),('x',8192),('z',16384)] "e" encode [('a',2),('c',2),('d',4),('e',8),('f',16),('g',32),('i',64),('l',128),('m',256),('o',512),('s',1024),('u',2048),('w',4096),('x',8192),('z',16384)] "e" encode [('a',2),('c',2),('d',4),('e',8),('f',16),('g',32),('i',64),('l',128),('m',256),('o',512),('s',1024),('u',2048),('w',4096),('x',8192),('z',16384)] "f" encode [('a',2),('c',2),('d',4),('e',8),('f',16),('g',32),('i',64),('l',128),('m',256),('o',512),('s',1024),('u',2048),('w',4096),('x',8192),('z',16384)] "f" encode [('a',2),('c',2),('d',4),('e',8),('f',16),('g',32),('i',64),('l',128),('m',256),('o',512),('s',1024),('u',2048),('w',4096),('x',8192),('z',16384)] "g" encode [('a',2),('c',2),('d',4),('e',8),('f',16),('g',32),('i',64),('l',128),('m',256),('o',512),('s',1024),('u',2048),('w',4096),('x',8192),('z',16384)] "g" encode [('a',2),('c',2),('d',4),('e',8),('f',16),('g',32),('i',64),('l',128),('m',256),('o',512),('s',1024),('u',2048),('w',4096),('x',8192),('z',16384)] "i" encode [('a',2),('c',2),('d',4),('e',8),('f',16),('g',32),('i',64),('l',128),('m',256),('o',512),('s',1024),('u',2048),('w',4096),('x',8192),('z',16384)] "i" encode [('a',2),('c',2),('d',4),('e',8),('f',16),('g',32),('i',64),('l',128),('m',256),('o',512),('s',1024),('u',2048),('w',4096),('x',8192),('z',16384)] "l" encode [('a',2),('c',2),('d',4),('e',8),('f',16),('g',32),('i',64),('l',128),('m',256),('o',512),('s',1024),('u',2048),('w',4096),('x',8192),('z',16384)] "l" encode [('a',2),('c',2),('d',4),('e',8),('f',16),('g',32),('i',64),('l',128),('m',256),('o',512),('s',1024),('u',2048),('w',4096),('x',8192),('z',16384)] "m" encode [('a',2),('c',2),('d',4),('e',8),('f',16),('g',32),('i',64),('l',128),('m',256),('o',512),('s',1024),('u',2048),('w',4096),('x',8192),('z',16384)] "m" encode [('a',2),('c',2),('d',4),('e',8),('f',16),('g',32),('i',64),('l',128),('m',256),('o',512),('s',1024),('u',2048),('w',4096),('x',8192),('z',16384)] "o" encode [('a',2),('c',2),('d',4),('e',8),('f',16),('g',32),('i',64),('l',128),('m',256),('o',512),('s',1024),('u',2048),('w',4096),('x',8192),('z',16384)] "o" encode [('a',2),('c',2),('d',4),('e',8),('f',16),('g',32),('i',64),('l',128),('m',256),('o',512),('s',1024),('u',2048),('w',4096),('x',8192),('z',16384)] "s" encode [('a',2),('c',2),('d',4),('e',8),('f',16),('g',32),('i',64),('l',128),('m',256),('o',512),('s',1024),('u',2048),('w',4096),('x',8192),('z',16384)] "s" encode [('a',2),('c',2),('d',4),('e',8),('f',16),('g',32),('i',64),('l',128),('m',256),('o',512),('s',1024),('u',2048),('w',4096),('x',8192),('z',16384)] "u" encode [('a',2),('c',2),('d',4),('e',8),('f',16),('g',32),('i',64),('l',128),('m',256),('o',512),('s',1024),('u',2048),('w',4096),('x',8192),('z',16384)] "u" encode [('a',2),('c',2),('d',4),('e',8),('f',16),('g',32),('i',64),('l',128),('m',256),('o',512),('s',1024),('u',2048),('w',4096),('x',8192),('z',16384)] "w" encode [('a',2),('c',2),('d',4),('e',8),('f',16),('g',32),('i',64),('l',128),('m',256),('o',512),('s',1024),('u',2048),('w',4096),('x',8192),('z',16384)] "w" encode [('a',2),('c',2),('d',4),('e',8),('f',16),('g',32),('i',64),('l',128),('m',256),('o',512),('s',1024),('u',2048),('w',4096),('x',8192),('z',16384)] "x" encode [('a',2),('c',2),('d',4),('e',8),('f',16),('g',32),('i',64),('l',128),('m',256),('o',512),('s',1024),('u',2048),('w',4096),('x',8192),('z',16384)] "x" encode [('a',2),('c',2),('d',4),('e',8),('f',16),('g',32),('i',64),('l',128),('m',256),('o',512),('s',1024),('u',2048),('w',4096),('x',8192),('z',16384)] "z" encode [('b',2),('c',2),('e',4),('f',8),('i',16),('j',32),('l',64),('n',128),('p',256),('q',512),('r',1024),('t',2048),('v',4096),('w',8192),('x',16384)] "b" encode [('b',2),('c',2),('e',4),('f',8),('i',16),('j',32),('l',64),('n',128),('p',256),('q',512),('r',1024),('t',2048),('v',4096),('w',8192),('x',16384)] "c" encode [('b',2),('c',2),('e',4),('f',8),('i',16),('j',32),('l',64),('n',128),('p',256),('q',512),('r',1024),('t',2048),('v',4096),('w',8192),('x',16384)] "c" encode [('b',2),('c',2),('e',4),('f',8),('i',16),('j',32),('l',64),('n',128),('p',256),('q',512),('r',1024),('t',2048),('v',4096),('w',8192),('x',16384)] "e" encode [('b',2),('c',2),('e',4),('f',8),('i',16),('j',32),('l',64),('n',128),('p',256),('q',512),('r',1024),('t',2048),('v',4096),('w',8192),('x',16384)] "e" encode [('b',2),('c',2),('e',4),('f',8),('i',16),('j',32),('l',64),('n',128),('p',256),('q',512),('r',1024),('t',2048),('v',4096),('w',8192),('x',16384)] "f" encode [('b',2),('c',2),('e',4),('f',8),('i',16),('j',32),('l',64),('n',128),('p',256),('q',512),('r',1024),('t',2048),('v',4096),('w',8192),('x',16384)] "f" encode [('b',2),('c',2),('e',4),('f',8),('i',16),('j',32),('l',64),('n',128),('p',256),('q',512),('r',1024),('t',2048),('v',4096),('w',8192),('x',16384)] "i" encode [('b',2),('c',2),('e',4),('f',8),('i',16),('j',32),('l',64),('n',128),('p',256),('q',512),('r',1024),('t',2048),('v',4096),('w',8192),('x',16384)] "i" encode [('b',2),('c',2),('e',4),('f',8),('i',16),('j',32),('l',64),('n',128),('p',256),('q',512),('r',1024),('t',2048),('v',4096),('w',8192),('x',16384)] "j" encode [('b',2),('c',2),('e',4),('f',8),('i',16),('j',32),('l',64),('n',128),('p',256),('q',512),('r',1024),('t',2048),('v',4096),('w',8192),('x',16384)] "j" encode [('b',2),('c',2),('e',4),('f',8),('i',16),('j',32),('l',64),('n',128),('p',256),('q',512),('r',1024),('t',2048),('v',4096),('w',8192),('x',16384)] "l" encode [('b',2),('c',2),('e',4),('f',8),('i',16),('j',32),('l',64),('n',128),('p',256),('q',512),('r',1024),('t',2048),('v',4096),('w',8192),('x',16384)] "l" encode [('b',2),('c',2),('e',4),('f',8),('i',16),('j',32),('l',64),('n',128),('p',256),('q',512),('r',1024),('t',2048),('v',4096),('w',8192),('x',16384)] "n" encode [('b',2),('c',2),('e',4),('f',8),('i',16),('j',32),('l',64),('n',128),('p',256),('q',512),('r',1024),('t',2048),('v',4096),('w',8192),('x',16384)] "n" encode [('b',2),('c',2),('e',4),('f',8),('i',16),('j',32),('l',64),('n',128),('p',256),('q',512),('r',1024),('t',2048),('v',4096),('w',8192),('x',16384)] "p" encode [('b',2),('c',2),('e',4),('f',8),('i',16),('j',32),('l',64),('n',128),('p',256),('q',512),('r',1024),('t',2048),('v',4096),('w',8192),('x',16384)] "p" encode [('b',2),('c',2),('e',4),('f',8),('i',16),('j',32),('l',64),('n',128),('p',256),('q',512),('r',1024),('t',2048),('v',4096),('w',8192),('x',16384)] "q" encode [('b',2),('c',2),('e',4),('f',8),('i',16),('j',32),('l',64),('n',128),('p',256),('q',512),('r',1024),('t',2048),('v',4096),('w',8192),('x',16384)] "q" encode [('b',2),('c',2),('e',4),('f',8),('i',16),('j',32),('l',64),('n',128),('p',256),('q',512),('r',1024),('t',2048),('v',4096),('w',8192),('x',16384)] "r" encode [('b',2),('c',2),('e',4),('f',8),('i',16),('j',32),('l',64),('n',128),('p',256),('q',512),('r',1024),('t',2048),('v',4096),('w',8192),('x',16384)] "r" encode [('b',2),('c',2),('e',4),('f',8),('i',16),('j',32),('l',64),('n',128),('p',256),('q',512),('r',1024),('t',2048),('v',4096),('w',8192),('x',16384)] "t" encode [('b',2),('c',2),('e',4),('f',8),('i',16),('j',32),('l',64),('n',128),('p',256),('q',512),('r',1024),('t',2048),('v',4096),('w',8192),('x',16384)] "t" encode [('b',2),('c',2),('e',4),('f',8),('i',16),('j',32),('l',64),('n',128),('p',256),('q',512),('r',1024),('t',2048),('v',4096),('w',8192),('x',16384)] "v" encode [('b',2),('c',2),('e',4),('f',8),('i',16),('j',32),('l',64),('n',128),('p',256),('q',512),('r',1024),('t',2048),('v',4096),('w',8192),('x',16384)] "v" encode [('b',2),('c',2),('e',4),('f',8),('i',16),('j',32),('l',64),('n',128),('p',256),('q',512),('r',1024),('t',2048),('v',4096),('w',8192),('x',16384)] "w" encode [('b',2),('c',2),('e',4),('f',8),('i',16),('j',32),('l',64),('n',128),('p',256),('q',512),('r',1024),('t',2048),('v',4096),('w',8192),('x',16384)] "w" encode [('b',2),('c',2),('e',4),('f',8),('i',16),('j',32),('l',64),('n',128),('p',256),('q',512),('r',1024),('t',2048),('v',4096),('w',8192),('x',16384)] "x" encode [('a',2),('b',2),('c',4),('g',8),('h',16),('i',32),('k',64),('p',128),('r',256),('t',512),('u',1024),('v',2048),('x',4096),('y',8192),('z',16384)] "a" encode [('a',2),('b',2),('c',4),('g',8),('h',16),('i',32),('k',64),('p',128),('r',256),('t',512),('u',1024),('v',2048),('x',4096),('y',8192),('z',16384)] "b" encode [('a',2),('b',2),('c',4),('g',8),('h',16),('i',32),('k',64),('p',128),('r',256),('t',512),('u',1024),('v',2048),('x',4096),('y',8192),('z',16384)] "b" encode [('a',2),('b',2),('c',4),('g',8),('h',16),('i',32),('k',64),('p',128),('r',256),('t',512),('u',1024),('v',2048),('x',4096),('y',8192),('z',16384)] "c" encode [('a',2),('b',2),('c',4),('g',8),('h',16),('i',32),('k',64),('p',128),('r',256),('t',512),('u',1024),('v',2048),('x',4096),('y',8192),('z',16384)] "c" encode [('a',2),('b',2),('c',4),('g',8),('h',16),('i',32),('k',64),('p',128),('r',256),('t',512),('u',1024),('v',2048),('x',4096),('y',8192),('z',16384)] "g" encode [('a',2),('b',2),('c',4),('g',8),('h',16),('i',32),('k',64),('p',128),('r',256),('t',512),('u',1024),('v',2048),('x',4096),('y',8192),('z',16384)] "g" encode [('a',2),('b',2),('c',4),('g',8),('h',16),('i',32),('k',64),('p',128),('r',256),('t',512),('u',1024),('v',2048),('x',4096),('y',8192),('z',16384)] "h" encode [('a',2),('b',2),('c',4),('g',8),('h',16),('i',32),('k',64),('p',128),('r',256),('t',512),('u',1024),('v',2048),('x',4096),('y',8192),('z',16384)] "h" encode [('a',2),('b',2),('c',4),('g',8),('h',16),('i',32),('k',64),('p',128),('r',256),('t',512),('u',1024),('v',2048),('x',4096),('y',8192),('z',16384)] "i" encode [('a',2),('b',2),('c',4),('g',8),('h',16),('i',32),('k',64),('p',128),('r',256),('t',512),('u',1024),('v',2048),('x',4096),('y',8192),('z',16384)] "i" encode [('a',2),('b',2),('c',4),('g',8),('h',16),('i',32),('k',64),('p',128),('r',256),('t',512),('u',1024),('v',2048),('x',4096),('y',8192),('z',16384)] "k" encode [('a',2),('b',2),('c',4),('g',8),('h',16),('i',32),('k',64),('p',128),('r',256),('t',512),('u',1024),('v',2048),('x',4096),('y',8192),('z',16384)] "k" encode [('a',2),('b',2),('c',4),('g',8),('h',16),('i',32),('k',64),('p',128),('r',256),('t',512),('u',1024),('v',2048),('x',4096),('y',8192),('z',16384)] "p" encode [('a',2),('b',2),('c',4),('g',8),('h',16),('i',32),('k',64),('p',128),('r',256),('t',512),('u',1024),('v',2048),('x',4096),('y',8192),('z',16384)] "p" encode [('a',2),('b',2),('c',4),('g',8),('h',16),('i',32),('k',64),('p',128),('r',256),('t',512),('u',1024),('v',2048),('x',4096),('y',8192),('z',16384)] "r" encode [('a',2),('b',2),('c',4),('g',8),('h',16),('i',32),('k',64),('p',128),('r',256),('t',512),('u',1024),('v',2048),('x',4096),('y',8192),('z',16384)] "r" encode [('a',2),('b',2),('c',4),('g',8),('h',16),('i',32),('k',64),('p',128),('r',256),('t',512),('u',1024),('v',2048),('x',4096),('y',8192),('z',16384)] "t" encode [('a',2),('b',2),('c',4),('g',8),('h',16),('i',32),('k',64),('p',128),('r',256),('t',512),('u',1024),('v',2048),('x',4096),('y',8192),('z',16384)] "t" encode [('a',2),('b',2),('c',4),('g',8),('h',16),('i',32),('k',64),('p',128),('r',256),('t',512),('u',1024),('v',2048),('x',4096),('y',8192),('z',16384)] "u" encode [('a',2),('b',2),('c',4),('g',8),('h',16),('i',32),('k',64),('p',128),('r',256),('t',512),('u',1024),('v',2048),('x',4096),('y',8192),('z',16384)] "u" encode [('a',2),('b',2),('c',4),('g',8),('h',16),('i',32),('k',64),('p',128),('r',256),('t',512),('u',1024),('v',2048),('x',4096),('y',8192),('z',16384)] "v" encode [('a',2),('b',2),('c',4),('g',8),('h',16),('i',32),('k',64),('p',128),('r',256),('t',512),('u',1024),('v',2048),('x',4096),('y',8192),('z',16384)] "v" encode [('a',2),('b',2),('c',4),('g',8),('h',16),('i',32),('k',64),('p',128),('r',256),('t',512),('u',1024),('v',2048),('x',4096),('y',8192),('z',16384)] "x" encode [('a',2),('b',2),('c',4),('g',8),('h',16),('i',32),('k',64),('p',128),('r',256),('t',512),('u',1024),('v',2048),('x',4096),('y',8192),('z',16384)] "x" encode [('a',2),('b',2),('c',4),('g',8),('h',16),('i',32),('k',64),('p',128),('r',256),('t',512),('u',1024),('v',2048),('x',4096),('y',8192),('z',16384)] "y" encode [('a',2),('b',2),('c',4),('g',8),('h',16),('i',32),('k',64),('p',128),('r',256),('t',512),('u',1024),('v',2048),('x',4096),('y',8192),('z',16384)] "y" encode [('a',2),('b',2),('c',4),('g',8),('h',16),('i',32),('k',64),('p',128),('r',256),('t',512),('u',1024),('v',2048),('x',4096),('y',8192),('z',16384)] "z" encode [('a',2),('c',2),('f',4),('g',8),('h',16),('j',32),('k',64),('n',128),('p',256),('q',512),('s',1024),('t',2048),('w',4096),('x',8192),('y',16384)] "a" encode [('a',2),('c',2),('f',4),('g',8),('h',16),('j',32),('k',64),('n',128),('p',256),('q',512),('s',1024),('t',2048),('w',4096),('x',8192),('y',16384)] "c" encode [('a',2),('c',2),('f',4),('g',8),('h',16),('j',32),('k',64),('n',128),('p',256),('q',512),('s',1024),('t',2048),('w',4096),('x',8192),('y',16384)] "c" encode [('a',2),('c',2),('f',4),('g',8),('h',16),('j',32),('k',64),('n',128),('p',256),('q',512),('s',1024),('t',2048),('w',4096),('x',8192),('y',16384)] "f" encode [('a',2),('c',2),('f',4),('g',8),('h',16),('j',32),('k',64),('n',128),('p',256),('q',512),('s',1024),('t',2048),('w',4096),('x',8192),('y',16384)] "f" encode [('a',2),('c',2),('f',4),('g',8),('h',16),('j',32),('k',64),('n',128),('p',256),('q',512),('s',1024),('t',2048),('w',4096),('x',8192),('y',16384)] "g" encode [('a',2),('c',2),('f',4),('g',8),('h',16),('j',32),('k',64),('n',128),('p',256),('q',512),('s',1024),('t',2048),('w',4096),('x',8192),('y',16384)] "g" encode [('a',2),('c',2),('f',4),('g',8),('h',16),('j',32),('k',64),('n',128),('p',256),('q',512),('s',1024),('t',2048),('w',4096),('x',8192),('y',16384)] "h" encode [('a',2),('c',2),('f',4),('g',8),('h',16),('j',32),('k',64),('n',128),('p',256),('q',512),('s',1024),('t',2048),('w',4096),('x',8192),('y',16384)] "h" encode [('a',2),('c',2),('f',4),('g',8),('h',16),('j',32),('k',64),('n',128),('p',256),('q',512),('s',1024),('t',2048),('w',4096),('x',8192),('y',16384)] "j" encode [('a',2),('c',2),('f',4),('g',8),('h',16),('j',32),('k',64),('n',128),('p',256),('q',512),('s',1024),('t',2048),('w',4096),('x',8192),('y',16384)] "j" encode [('a',2),('c',2),('f',4),('g',8),('h',16),('j',32),('k',64),('n',128),('p',256),('q',512),('s',1024),('t',2048),('w',4096),('x',8192),('y',16384)] "k" encode [('a',2),('c',2),('f',4),('g',8),('h',16),('j',32),('k',64),('n',128),('p',256),('q',512),('s',1024),('t',2048),('w',4096),('x',8192),('y',16384)] "k" encode [('a',2),('c',2),('f',4),('g',8),('h',16),('j',32),('k',64),('n',128),('p',256),('q',512),('s',1024),('t',2048),('w',4096),('x',8192),('y',16384)] "n" encode [('a',2),('c',2),('f',4),('g',8),('h',16),('j',32),('k',64),('n',128),('p',256),('q',512),('s',1024),('t',2048),('w',4096),('x',8192),('y',16384)] "n" encode [('a',2),('c',2),('f',4),('g',8),('h',16),('j',32),('k',64),('n',128),('p',256),('q',512),('s',1024),('t',2048),('w',4096),('x',8192),('y',16384)] "p" encode [('a',2),('c',2),('f',4),('g',8),('h',16),('j',32),('k',64),('n',128),('p',256),('q',512),('s',1024),('t',2048),('w',4096),('x',8192),('y',16384)] "p" encode [('a',2),('c',2),('f',4),('g',8),('h',16),('j',32),('k',64),('n',128),('p',256),('q',512),('s',1024),('t',2048),('w',4096),('x',8192),('y',16384)] "q" encode [('a',2),('c',2),('f',4),('g',8),('h',16),('j',32),('k',64),('n',128),('p',256),('q',512),('s',1024),('t',2048),('w',4096),('x',8192),('y',16384)] "q" encode [('a',2),('c',2),('f',4),('g',8),('h',16),('j',32),('k',64),('n',128),('p',256),('q',512),('s',1024),('t',2048),('w',4096),('x',8192),('y',16384)] "s" encode [('a',2),('c',2),('f',4),('g',8),('h',16),('j',32),('k',64),('n',128),('p',256),('q',512),('s',1024),('t',2048),('w',4096),('x',8192),('y',16384)] "s" encode [('a',2),('c',2),('f',4),('g',8),('h',16),('j',32),('k',64),('n',128),('p',256),('q',512),('s',1024),('t',2048),('w',4096),('x',8192),('y',16384)] "t" encode [('a',2),('c',2),('f',4),('g',8),('h',16),('j',32),('k',64),('n',128),('p',256),('q',512),('s',1024),('t',2048),('w',4096),('x',8192),('y',16384)] "t" encode [('a',2),('c',2),('f',4),('g',8),('h',16),('j',32),('k',64),('n',128),('p',256),('q',512),('s',1024),('t',2048),('w',4096),('x',8192),('y',16384)] "w" encode [('a',2),('c',2),('f',4),('g',8),('h',16),('j',32),('k',64),('n',128),('p',256),('q',512),('s',1024),('t',2048),('w',4096),('x',8192),('y',16384)] "w" encode [('a',2),('c',2),('f',4),('g',8),('h',16),('j',32),('k',64),('n',128),('p',256),('q',512),('s',1024),('t',2048),('w',4096),('x',8192),('y',16384)] "x" encode [('a',2),('c',2),('f',4),('g',8),('h',16),('j',32),('k',64),('n',128),('p',256),('q',512),('s',1024),('t',2048),('w',4096),('x',8192),('y',16384)] "x" encode [('a',2),('c',2),('f',4),('g',8),('h',16),('j',32),('k',64),('n',128),('p',256),('q',512),('s',1024),('t',2048),('w',4096),('x',8192),('y',16384)] "y" encode [('a',2),('b',2),('c',4),('e',8),('g',16),('i',32),('j',64),('o',128),('p',256),('q',512),('t',1024),('v',2048),('w',4096),('y',8192),('z',16384)] "a" encode [('a',2),('b',2),('c',4),('e',8),('g',16),('i',32),('j',64),('o',128),('p',256),('q',512),('t',1024),('v',2048),('w',4096),('y',8192),('z',16384)] "b" encode [('a',2),('b',2),('c',4),('e',8),('g',16),('i',32),('j',64),('o',128),('p',256),('q',512),('t',1024),('v',2048),('w',4096),('y',8192),('z',16384)] "b" encode [('a',2),('b',2),('c',4),('e',8),('g',16),('i',32),('j',64),('o',128),('p',256),('q',512),('t',1024),('v',2048),('w',4096),('y',8192),('z',16384)] "c" encode [('a',2),('b',2),('c',4),('e',8),('g',16),('i',32),('j',64),('o',128),('p',256),('q',512),('t',1024),('v',2048),('w',4096),('y',8192),('z',16384)] "c" encode [('a',2),('b',2),('c',4),('e',8),('g',16),('i',32),('j',64),('o',128),('p',256),('q',512),('t',1024),('v',2048),('w',4096),('y',8192),('z',16384)] "e" encode [('a',2),('b',2),('c',4),('e',8),('g',16),('i',32),('j',64),('o',128),('p',256),('q',512),('t',1024),('v',2048),('w',4096),('y',8192),('z',16384)] "e" encode [('a',2),('b',2),('c',4),('e',8),('g',16),('i',32),('j',64),('o',128),('p',256),('q',512),('t',1024),('v',2048),('w',4096),('y',8192),('z',16384)] "g" encode [('a',2),('b',2),('c',4),('e',8),('g',16),('i',32),('j',64),('o',128),('p',256),('q',512),('t',1024),('v',2048),('w',4096),('y',8192),('z',16384)] "g" encode [('a',2),('b',2),('c',4),('e',8),('g',16),('i',32),('j',64),('o',128),('p',256),('q',512),('t',1024),('v',2048),('w',4096),('y',8192),('z',16384)] "i" encode [('a',2),('b',2),('c',4),('e',8),('g',16),('i',32),('j',64),('o',128),('p',256),('q',512),('t',1024),('v',2048),('w',4096),('y',8192),('z',16384)] "i" encode [('a',2),('b',2),('c',4),('e',8),('g',16),('i',32),('j',64),('o',128),('p',256),('q',512),('t',1024),('v',2048),('w',4096),('y',8192),('z',16384)] "j" encode [('a',2),('b',2),('c',4),('e',8),('g',16),('i',32),('j',64),('o',128),('p',256),('q',512),('t',1024),('v',2048),('w',4096),('y',8192),('z',16384)] "j" encode [('a',2),('b',2),('c',4),('e',8),('g',16),('i',32),('j',64),('o',128),('p',256),('q',512),('t',1024),('v',2048),('w',4096),('y',8192),('z',16384)] "o" encode [('a',2),('b',2),('c',4),('e',8),('g',16),('i',32),('j',64),('o',128),('p',256),('q',512),('t',1024),('v',2048),('w',4096),('y',8192),('z',16384)] "o" encode [('a',2),('b',2),('c',4),('e',8),('g',16),('i',32),('j',64),('o',128),('p',256),('q',512),('t',1024),('v',2048),('w',4096),('y',8192),('z',16384)] "p" encode [('a',2),('b',2),('c',4),('e',8),('g',16),('i',32),('j',64),('o',128),('p',256),('q',512),('t',1024),('v',2048),('w',4096),('y',8192),('z',16384)] "p" encode [('a',2),('b',2),('c',4),('e',8),('g',16),('i',32),('j',64),('o',128),('p',256),('q',512),('t',1024),('v',2048),('w',4096),('y',8192),('z',16384)] "q" encode [('a',2),('b',2),('c',4),('e',8),('g',16),('i',32),('j',64),('o',128),('p',256),('q',512),('t',1024),('v',2048),('w',4096),('y',8192),('z',16384)] "q" encode [('a',2),('b',2),('c',4),('e',8),('g',16),('i',32),('j',64),('o',128),('p',256),('q',512),('t',1024),('v',2048),('w',4096),('y',8192),('z',16384)] "t" encode [('a',2),('b',2),('c',4),('e',8),('g',16),('i',32),('j',64),('o',128),('p',256),('q',512),('t',1024),('v',2048),('w',4096),('y',8192),('z',16384)] "t" encode [('a',2),('b',2),('c',4),('e',8),('g',16),('i',32),('j',64),('o',128),('p',256),('q',512),('t',1024),('v',2048),('w',4096),('y',8192),('z',16384)] "v" encode [('a',2),('b',2),('c',4),('e',8),('g',16),('i',32),('j',64),('o',128),('p',256),('q',512),('t',1024),('v',2048),('w',4096),('y',8192),('z',16384)] "v" encode [('a',2),('b',2),('c',4),('e',8),('g',16),('i',32),('j',64),('o',128),('p',256),('q',512),('t',1024),('v',2048),('w',4096),('y',8192),('z',16384)] "w" encode [('a',2),('b',2),('c',4),('e',8),('g',16),('i',32),('j',64),('o',128),('p',256),('q',512),('t',1024),('v',2048),('w',4096),('y',8192),('z',16384)] "w" encode [('a',2),('b',2),('c',4),('e',8),('g',16),('i',32),('j',64),('o',128),('p',256),('q',512),('t',1024),('v',2048),('w',4096),('y',8192),('z',16384)] "y" encode [('a',2),('b',2),('c',4),('e',8),('g',16),('i',32),('j',64),('o',128),('p',256),('q',512),('t',1024),('v',2048),('w',4096),('y',8192),('z',16384)] "y" encode [('a',2),('b',2),('c',4),('e',8),('g',16),('i',32),('j',64),('o',128),('p',256),('q',512),('t',1024),('v',2048),('w',4096),('y',8192),('z',16384)] "z" encode [('a',2),('b',2),('e',4),('g',8),('h',16),('i',32),('j',64),('m',128),('n',256),('o',512),('t',1024),('v',2048),('w',4096),('x',8192),('z',16384)] "a" encode [('a',2),('b',2),('e',4),('g',8),('h',16),('i',32),('j',64),('m',128),('n',256),('o',512),('t',1024),('v',2048),('w',4096),('x',8192),('z',16384)] "b" encode [('a',2),('b',2),('e',4),('g',8),('h',16),('i',32),('j',64),('m',128),('n',256),('o',512),('t',1024),('v',2048),('w',4096),('x',8192),('z',16384)] "b" encode [('a',2),('b',2),('e',4),('g',8),('h',16),('i',32),('j',64),('m',128),('n',256),('o',512),('t',1024),('v',2048),('w',4096),('x',8192),('z',16384)] "e" encode [('a',2),('b',2),('e',4),('g',8),('h',16),('i',32),('j',64),('m',128),('n',256),('o',512),('t',1024),('v',2048),('w',4096),('x',8192),('z',16384)] "e" encode [('a',2),('b',2),('e',4),('g',8),('h',16),('i',32),('j',64),('m',128),('n',256),('o',512),('t',1024),('v',2048),('w',4096),('x',8192),('z',16384)] "g" encode [('a',2),('b',2),('e',4),('g',8),('h',16),('i',32),('j',64),('m',128),('n',256),('o',512),('t',1024),('v',2048),('w',4096),('x',8192),('z',16384)] "g" encode [('a',2),('b',2),('e',4),('g',8),('h',16),('i',32),('j',64),('m',128),('n',256),('o',512),('t',1024),('v',2048),('w',4096),('x',8192),('z',16384)] "h" encode [('a',2),('b',2),('e',4),('g',8),('h',16),('i',32),('j',64),('m',128),('n',256),('o',512),('t',1024),('v',2048),('w',4096),('x',8192),('z',16384)] "h" encode [('a',2),('b',2),('e',4),('g',8),('h',16),('i',32),('j',64),('m',128),('n',256),('o',512),('t',1024),('v',2048),('w',4096),('x',8192),('z',16384)] "i" encode [('a',2),('b',2),('e',4),('g',8),('h',16),('i',32),('j',64),('m',128),('n',256),('o',512),('t',1024),('v',2048),('w',4096),('x',8192),('z',16384)] "i" encode [('a',2),('b',2),('e',4),('g',8),('h',16),('i',32),('j',64),('m',128),('n',256),('o',512),('t',1024),('v',2048),('w',4096),('x',8192),('z',16384)] "j" encode [('a',2),('b',2),('e',4),('g',8),('h',16),('i',32),('j',64),('m',128),('n',256),('o',512),('t',1024),('v',2048),('w',4096),('x',8192),('z',16384)] "j" encode [('a',2),('b',2),('e',4),('g',8),('h',16),('i',32),('j',64),('m',128),('n',256),('o',512),('t',1024),('v',2048),('w',4096),('x',8192),('z',16384)] "m" encode [('a',2),('b',2),('e',4),('g',8),('h',16),('i',32),('j',64),('m',128),('n',256),('o',512),('t',1024),('v',2048),('w',4096),('x',8192),('z',16384)] "m" encode [('a',2),('b',2),('e',4),('g',8),('h',16),('i',32),('j',64),('m',128),('n',256),('o',512),('t',1024),('v',2048),('w',4096),('x',8192),('z',16384)] "n" encode [('a',2),('b',2),('e',4),('g',8),('h',16),('i',32),('j',64),('m',128),('n',256),('o',512),('t',1024),('v',2048),('w',4096),('x',8192),('z',16384)] "n" encode [('a',2),('b',2),('e',4),('g',8),('h',16),('i',32),('j',64),('m',128),('n',256),('o',512),('t',1024),('v',2048),('w',4096),('x',8192),('z',16384)] "o" encode [('a',2),('b',2),('e',4),('g',8),('h',16),('i',32),('j',64),('m',128),('n',256),('o',512),('t',1024),('v',2048),('w',4096),('x',8192),('z',16384)] "o" encode [('a',2),('b',2),('e',4),('g',8),('h',16),('i',32),('j',64),('m',128),('n',256),('o',512),('t',1024),('v',2048),('w',4096),('x',8192),('z',16384)] "t" encode [('a',2),('b',2),('e',4),('g',8),('h',16),('i',32),('j',64),('m',128),('n',256),('o',512),('t',1024),('v',2048),('w',4096),('x',8192),('z',16384)] "t" encode [('a',2),('b',2),('e',4),('g',8),('h',16),('i',32),('j',64),('m',128),('n',256),('o',512),('t',1024),('v',2048),('w',4096),('x',8192),('z',16384)] "v" encode [('a',2),('b',2),('e',4),('g',8),('h',16),('i',32),('j',64),('m',128),('n',256),('o',512),('t',1024),('v',2048),('w',4096),('x',8192),('z',16384)] "v" encode [('a',2),('b',2),('e',4),('g',8),('h',16),('i',32),('j',64),('m',128),('n',256),('o',512),('t',1024),('v',2048),('w',4096),('x',8192),('z',16384)] "w" encode [('a',2),('b',2),('e',4),('g',8),('h',16),('i',32),('j',64),('m',128),('n',256),('o',512),('t',1024),('v',2048),('w',4096),('x',8192),('z',16384)] "w" encode [('a',2),('b',2),('e',4),('g',8),('h',16),('i',32),('j',64),('m',128),('n',256),('o',512),('t',1024),('v',2048),('w',4096),('x',8192),('z',16384)] "x" encode [('a',2),('b',2),('e',4),('g',8),('h',16),('i',32),('j',64),('m',128),('n',256),('o',512),('t',1024),('v',2048),('w',4096),('x',8192),('z',16384)] "x" encode [('a',2),('b',2),('e',4),('g',8),('h',16),('i',32),('j',64),('m',128),('n',256),('o',512),('t',1024),('v',2048),('w',4096),('x',8192),('z',16384)] "z" encode [('a',2),('c',2),('d',4),('e',8),('f',16),('g',32),('h',64),('i',128),('k',256),('l',512),('n',1024),('p',2048),('q',4096),('t',8192),('w',16384)] "a" encode [('a',2),('c',2),('d',4),('e',8),('f',16),('g',32),('h',64),('i',128),('k',256),('l',512),('n',1024),('p',2048),('q',4096),('t',8192),('w',16384)] "c" encode [('a',2),('c',2),('d',4),('e',8),('f',16),('g',32),('h',64),('i',128),('k',256),('l',512),('n',1024),('p',2048),('q',4096),('t',8192),('w',16384)] "c" encode [('a',2),('c',2),('d',4),('e',8),('f',16),('g',32),('h',64),('i',128),('k',256),('l',512),('n',1024),('p',2048),('q',4096),('t',8192),('w',16384)] "d" encode [('a',2),('c',2),('d',4),('e',8),('f',16),('g',32),('h',64),('i',128),('k',256),('l',512),('n',1024),('p',2048),('q',4096),('t',8192),('w',16384)] "d" encode [('a',2),('c',2),('d',4),('e',8),('f',16),('g',32),('h',64),('i',128),('k',256),('l',512),('n',1024),('p',2048),('q',4096),('t',8192),('w',16384)] "e" encode [('a',2),('c',2),('d',4),('e',8),('f',16),('g',32),('h',64),('i',128),('k',256),('l',512),('n',1024),('p',2048),('q',4096),('t',8192),('w',16384)] "e" encode [('a',2),('c',2),('d',4),('e',8),('f',16),('g',32),('h',64),('i',128),('k',256),('l',512),('n',1024),('p',2048),('q',4096),('t',8192),('w',16384)] "f" encode [('a',2),('c',2),('d',4),('e',8),('f',16),('g',32),('h',64),('i',128),('k',256),('l',512),('n',1024),('p',2048),('q',4096),('t',8192),('w',16384)] "f" encode [('a',2),('c',2),('d',4),('e',8),('f',16),('g',32),('h',64),('i',128),('k',256),('l',512),('n',1024),('p',2048),('q',4096),('t',8192),('w',16384)] "g" encode [('a',2),('c',2),('d',4),('e',8),('f',16),('g',32),('h',64),('i',128),('k',256),('l',512),('n',1024),('p',2048),('q',4096),('t',8192),('w',16384)] "g" encode [('a',2),('c',2),('d',4),('e',8),('f',16),('g',32),('h',64),('i',128),('k',256),('l',512),('n',1024),('p',2048),('q',4096),('t',8192),('w',16384)] "h" encode [('a',2),('c',2),('d',4),('e',8),('f',16),('g',32),('h',64),('i',128),('k',256),('l',512),('n',1024),('p',2048),('q',4096),('t',8192),('w',16384)] "h" encode [('a',2),('c',2),('d',4),('e',8),('f',16),('g',32),('h',64),('i',128),('k',256),('l',512),('n',1024),('p',2048),('q',4096),('t',8192),('w',16384)] "i" encode [('a',2),('c',2),('d',4),('e',8),('f',16),('g',32),('h',64),('i',128),('k',256),('l',512),('n',1024),('p',2048),('q',4096),('t',8192),('w',16384)] "i" encode [('a',2),('c',2),('d',4),('e',8),('f',16),('g',32),('h',64),('i',128),('k',256),('l',512),('n',1024),('p',2048),('q',4096),('t',8192),('w',16384)] "k" encode [('a',2),('c',2),('d',4),('e',8),('f',16),('g',32),('h',64),('i',128),('k',256),('l',512),('n',1024),('p',2048),('q',4096),('t',8192),('w',16384)] "k" encode [('a',2),('c',2),('d',4),('e',8),('f',16),('g',32),('h',64),('i',128),('k',256),('l',512),('n',1024),('p',2048),('q',4096),('t',8192),('w',16384)] "l" encode [('a',2),('c',2),('d',4),('e',8),('f',16),('g',32),('h',64),('i',128),('k',256),('l',512),('n',1024),('p',2048),('q',4096),('t',8192),('w',16384)] "l" encode [('a',2),('c',2),('d',4),('e',8),('f',16),('g',32),('h',64),('i',128),('k',256),('l',512),('n',1024),('p',2048),('q',4096),('t',8192),('w',16384)] "n" encode [('a',2),('c',2),('d',4),('e',8),('f',16),('g',32),('h',64),('i',128),('k',256),('l',512),('n',1024),('p',2048),('q',4096),('t',8192),('w',16384)] "n" encode [('a',2),('c',2),('d',4),('e',8),('f',16),('g',32),('h',64),('i',128),('k',256),('l',512),('n',1024),('p',2048),('q',4096),('t',8192),('w',16384)] "p" encode [('a',2),('c',2),('d',4),('e',8),('f',16),('g',32),('h',64),('i',128),('k',256),('l',512),('n',1024),('p',2048),('q',4096),('t',8192),('w',16384)] "p" encode [('a',2),('c',2),('d',4),('e',8),('f',16),('g',32),('h',64),('i',128),('k',256),('l',512),('n',1024),('p',2048),('q',4096),('t',8192),('w',16384)] "q" encode [('a',2),('c',2),('d',4),('e',8),('f',16),('g',32),('h',64),('i',128),('k',256),('l',512),('n',1024),('p',2048),('q',4096),('t',8192),('w',16384)] "q" encode [('a',2),('c',2),('d',4),('e',8),('f',16),('g',32),('h',64),('i',128),('k',256),('l',512),('n',1024),('p',2048),('q',4096),('t',8192),('w',16384)] "t" encode [('a',2),('c',2),('d',4),('e',8),('f',16),('g',32),('h',64),('i',128),('k',256),('l',512),('n',1024),('p',2048),('q',4096),('t',8192),('w',16384)] "t" encode [('a',2),('c',2),('d',4),('e',8),('f',16),('g',32),('h',64),('i',128),('k',256),('l',512),('n',1024),('p',2048),('q',4096),('t',8192),('w',16384)] "w"
That means it ran 100 tests of the property. It executes about 2
encode
for every element in the alphabet. The alphabet is created from a list of 2^6 elements and a subset that is smaller is picked randomly.The pairwise comparison evaluates the same element twice as you can see by the duplicate calls next to each other (e.g., compare the code length of "p" with that of "q" and then that of "q" with that of "t"). However, the alphabet is randomly picked as a subset of a list. There might be some more redundancy in there and of course that many tests are not strictly necessary.
Again, I think I can expect your solution to run in at most 50 times the time of the complete solution. This Kata is rated 3kyu for a reason. I would advise you to stop analysing the tests and start analysing your solution.
Prelude
.Haskell - Speed
I'm in the dark. Please help. For me...
'Run Sample Tests' Completes in 'Time 2147ms' and 'Completed in 0.0069 seconds'
'Attempt' 'Timed Out 12000ms' - Hangs after the passing the test 'the higher frequencies are, the lower the length of their encoding should be (can also be equal for non-powers of 2)'
Question - For those who did this in Haskell, how long does it take to complete the sample tests? Question - And how long does it take to complete the 'Attempt' tests? Question - What is the test after the above test?
Hi! Good fun so far, but...
Haskell - I pass the sample tests, but timeout on the full tests.
Is there a way to see what the tests are to debug this?
I'm still a noob in Haskell so not sure how to do this.
Hi,
the sample tests are obviously only a small subset of the tests you need to pass. Usually, the error message should indicate the error but due to Haskell's lazy nature that may somtimes produce counter-intuitive results.
Not that I know of but usually you should check your definitions for mistakes.
You can reply with your solution marked as spoiler. Then other people may be able to help you (including me).
This comment has been hidden.
It's not the
frequencies
function.Yes! In your code add trace. First param is a string to write to stderr. The 2nd param is the value to return (as if trace was never there.)
I think this is some form of monad.
An example :
Doing this for me gives about 3300 tests before it times out, with about 1100 tests which are repeated. I'll raise these repeated tests as an issue.
No, it's not. Also in more complex cases it may behave counter-intuitively because of lazy evaluation.
Are you talking about this Kata? I don't think there has been any changes in a while.
"Huffman coding" article at wikipedia and "nerdfirst huffman encoder online" was very helpfull to understand problem of this kata and debug code :)
Can anyone help me? I am stuck on the decode function,I have coded the encode function which is easy enough(Create a tree according to the frequency argument and then find the code for each character by visiting it from the root node). but how do i figure out the word boundaries for each letter in the encoded string as there are no separators. for ex: we get 0000101111 after encoding the example in description,should it be like |0|0|0|0|10|11|11| so that we know how many bits for each word,can someone explain please!
I just realised that all word nodes are leaf nodes so boundaries are not needed :)
Completed.
Why is there a parameter for the frequencies in the
encode
method? Normally one should get the frequencies (and the resulting encoding tree) directly from the given Strings
or is this for simulating the encoding of a substring with frequencies gathered from a bigger text?yes, it's to avoid to have to extract the tree from the text itself.
This comment has been hidden.
Python. I had tremendous fun; thank you.
There can be multiple results after encoding or decoding because there are multiple trees we can get after using function encode() or decode() For instance, in example in the instruction we can get tree with leaves 'b' and 'c' swapped and therefore we will get after encoding this: encode(frequency('aaaabcc'), 'aaaabcc') = '0000111010' after decoding this: decode(frequency('aaaabcc'), '0000101111') = 'aaaacbb'
In fact there is an infinite amount of function pairs
encode
anddecode
. The tests explicitly allow and support this. The only thing you have to do is being consistent in the way you encode and decode.This comment has been hidden.
Since none of the original translaters care anymore, which is what always happens, I had to do it. Cost me nearly two hours:
I added the property tests that I introduced with Haskell already. They should filter out invalid solutions. Let me know if there are some that pass (but I don't think they will).
I cleaned up the test cases a bit, added proper error messages and the print statement.
I added a few example test cases to the user tests. But as I've explained over and over again I cannot add more concrete test cases.
Some tests don't make sense. It expects an empty string to be returned when passing an empty string, except if the frequencies have 1 key. Why? Decoding or encoding an empty string should return an empty string.
Which language are you using?
Javascript
Can you give the title of the test case? I can't find the behavior in the test cases.
One thing that may seem a bit odd is, that once the frequencies have less than 2 elements it always returns
null
(Nothing
in Haskell). But it is in fact the most logical way. It's trival with zero elements in the alphabet (of course one could always return the empty string) but with one element in the alphabet the encoding is also an empty string (for all inputs with that character).The test is "singleton frequency encode". I get "Expected: null, instead got: ''". The input is encode([['a', 1]], "");
As I've already written, the issue is not in the test case. Your function should return
null
in that case. There is no general way to implement Huffman encoding for less than 2 letters in an alphabet.0
or1
is assigned by the path you take and if no path is taken the code is empty.Oh it's Huffman encoding that is like that, I understand now.
In a real implementation you would just handle those cases seperately. With an empty alphabet always return empty output. With an alphabet of one character return the count of the character (or something similar).
I added those test cases to python. If someone is willing to do the same for JavaScript it would be nice.
The tests are lacking. The most "Clever"-voted Python "solution" doesn't do Huffman. For example it turns the string
'abcdefgh'
into the table{'a': '0', 'b': '10', 'c': '110', 'd': '1110', 'e': '11110', 'f': '111110', 'g': '1111110', 'h': '1111111'}
, which is just wrong (and leads to a far too long encoded result string). The eight characters occur equally often, so they should be encoded as the eight different three-bits strings'000'
to'111'
.You are correct. The Haskell version has a generic test case that protects against such solutions. It was introduced after the JavaScript translation has been accepted and none of the other translators bothered to implement it. Therefore I keep this issue open hoping that someone is willing to add it (especially the original translators: @JohanWiltink, @kirilloid, @metalim).
edit: I just noticed my test case is not enough. Will fix it at least for Haskell.
For the Haskell version I devised the following test cases:
These catch two properties of the Huffman encoding that should be almost impossible to fake (or at least with disproportionate effort).
In addition I added small examples to the user test cases:
I hope that the translators or anyone else willing to help will provide equivalent tests for the other languages.
edit: I tried to make it more readable by adding comments.
Similar tests have been added to Python. I've seen that some solutions have been invalidated. Let me know if you see some that still pass. Those shouldn't, as the two properties are very strict.
I have passed, but I still have some little questions.
(1).What do we do if we find the two smallest subtrees with the same frequency?
(2).What do we do if we find several smallest subtrees all with the same frequency?
I think theoretically we can pick any two of them in any order?
It really doesn't matter which way you do it as long as your
decode
function does it the same way. In hindsight it made testing a lot harder but most people think about it, which is exactly what I wanted to convey in the first place. ;)Oh, I understand. So what I do is actually to encrypt any plain text correctly by any legal Haffman coding, while my decrypt method should be corresponding and exactly convert the output cypher text to the same plain text as before.
Technically, the Huffman code isn't an encryption (or at least a very bad one) but rather a compression algorithm. With compression you're trying to reduce data redundancy.
For the Huffman encoding you could basically pick an arbitrary way which branch you assign a
1
and a0
(and that for each level).Now there are other properties you can check to ensure whether a solution of this Kata is really using a Huffman code. In Haskell the the test is named the higher frequencies are, the lower the length of their encoding should be (can also be equal for non-powers of 2). Sadly, this hasn't been implemented for other languages.
The Python test suite used the standard library function randint() without importing it. Please fix it.
It was wrongly imported in the proposed solution. Thanks for your suggestion.
I don't know if it's the same in all languages (it seems to be...) but, the example tests are almost a joke :o => Only edge cases and no test of the actual encoding/decoding!? (meaning, not just the length of the string....!)
You have to be a little more clearer. Every language should have test cases for encoding and decoding with random input. Which language did you use?
Hi,
I used python, but surely the tests have these random tets. What I meant is that non of the languages do have sample tests with an actual ancoded result that is tested. Ony it's length is tested:
I didn't dig more into the thing so might be I'm missing something (like... I'm not actually sure that this is testable: could there be actually several solutions of different length to the same input message?)
cheers
That's true. The sample tests do not contain the random tests. And yes, there are several possible solutions. You can use a zero for the smaller branch or a one.
It is also not unusual for software engineers to write tests themselves. It is not complicated and it helps you to understand what you are doing.
Technically you could trick them. But to implement a solution that fulfills all the tested properties, it is much easier to just create a working solution.
@muesli4
you are right when saying engineers have to write tests themselves when facing new tasks to solve. But you must understand that CW purpose is to teach new concepts: a kata must guide players in order to solve it and this is done by giving explicit examples. Current tests are just cryptic and bring nothing at all to help warriors. Moreover they are misleading. Huffman encoding is a compression algorithm: its purpose is to compress a text. What can a player understand by readingtest.assert_equals( len(encode( fs, "aaaabcc" )), 10 )
? Output of this function is longer than the original string! Completely counter-intuitive...Please provide explicit test cases: even if it is possible to generate several outputs, it is possible to check if it belongs to a set and to provide this set in examples.
I read again the description: I think that you should put emphasis on this point:
I provided an extensive example in the description that is easy enough to understand. It is not uncommon that you have to read the text multiple times in order to understand it. I agree that for someone who doesn't know what compression is it is hard to understand. (I might look into adding something to the description.)
The given test case matches the exact example given in the description. You just have to read it.
By using a direct test case I limit people to implement it in a certain way (and the number of valid ones is in
O(len(frequencies(w)))
). I think in the end the test case you propose is much less understandable than the way it is now.Python translation added.
This comment has been hidden.
. (needed to update my previous message)
Coffeescript translation
In our example fs = [ [ 'a', 4 ], [ 'c', 2 ], [ 'b', 1 ] ]
I don't understand what're the differents in these test: 1) Test.assertEquals( decode( fs, "" ), "" ); Test.assertEquals( decode( [ ["a",1] ], "" ), null );
When my function has to return null? And when it has to return ""?
I don't know why it is that way. But
decode
should fail when the input is malformed or when an empty alphabet is used.A very nice kata. My JS-skills are nothing to brag about, so the code structure is messy. I would love to get some hints on katas that help to learn to create nice, readable, structured code in JS without using the "class" and "new" keywords, etc. which I heard "should be avoided" as they were introduced for the sake of java folk (like myself) to make them feel more "comfortable" with js ;)
I wouldn't say that the
class
syntax is to be avoided; in fact I personally prefer it, and I think the JS community as a whole is moving in that direction as well. I think the big thing about it is that you are correct in saying it was introduced to make people comfortable -- specifically people familiar with class-based OOP. And underneath the hood, there's none of that in JS -- it's still all prototypal inheritance.So the big gotcha is that even though we have the keyword
class
, there's still no such thing as actual classes in JS. Which, understandably, leads to a huge amount of confusion, especially for people who don't yet understand what class-based vs. prototype-based even means. So it's this thing introduced to make people more comfortable, which quite obviously made other people confused/uncomfortable, but I think it's gaining traction and you'll see it used more and more often, so long as we all keep understanding/teaching that JS is strictly prototypal.I finally completed this, after weeks of putting it off because I didn't want to take the time to understand it. One thing that helped me was realizing that it was kind-of open-ended in that you decided exactly how it was coded, as long as you decoded it in the same manner.
I'm quite surprised that my solution was the shortest so far by a landslide. After completing the
frequencies
function, I set my aim to keep it short, and I'm pleased with the result. Sure, it's probably not readable, but I left some comments under my solution if anyone is interested in how I kept it so short. And I challenge any golfers out there to beat it.It's not intended to be open-ended. You got away with not using Huffman encoding, because the only one-way test is with "aaabcc" as input (and a bunch that expect errors). This is not String Compression Challenge, although I actually like what you're doing. :]
I challenge any golfers out there, including you, huff, to implement proper Huffman encoding.
Muesli, we may have to expand the fixed tests. Or not. I don't want to stifle all creativity.
Based on the
frequencies
functions you could figure out the mapping of theencode
function. Then test whether the length is appropriate for the corresponding frequency. I will probably look into this later.Should be relatively simple this way and limiting enough to actually force people to use the algorithm. ;)
This comment has been hidden.
Hmmm, I guess I didn't fully understand the tree business. One thing that puzzled me is how do you know the length of each letter in the encoded string? That's what led me to do what I did.
@hufftheweevil I used a comprehensive example in the description. If there is anything unclear with it let me know.
Do you mean based on the
decode
function? Because then you just follow the path (a leaf terminates). It is uniquely defined by the frequencies argument.Once you have 3 subtrees (e.g. 3 letters) with the same frequency you won't be able to encode all 3 with the same length, since binary only has two symbols.
Yeah it was the decoding part that I was confused about. After re-reading the description, I see that I missed the one sentence that described how to decode. I'm not sure how I couldn't figure it out either way, but perhaps that could be expanded just a little bit.
Now that I understand it better, I will try to redo it with the correct encoding. And I'll still try to keep it short ;)
If you omit semicolons in order to get a smaller footprint you might as well remove all whitespace and add semicolons.
One does not omit semicolons to get a smaller footprint. One omits semicolons because it's cleaner looking and easier to read. Removing all whitespace would make it nearly impossible to read.
EDIT: This is in regards to the JavaScript translation.
The description explains what Huffman encoding is (which the web has an abundance of information on), but doesn't explain at all what is required of this kata.
encode
anddecode
functions? One of the sample tests is:Test.assertEquals( encode( fs, s ).length, 10 );
, expecting a value with a length of10
. I'm failing that test because my solution returns a string of length2
. So what isencode
supposed to return exactly? Also, is thedecode
function expected to return anything besides just the original uncompressed string?That's one problem in a dynamically typed language and a problem the Haskell version doesn't have. I will add a type signature to the functions.
encode
should return a string with binary digits (i.e.encode [["a", 2], ["b", 1]] "aab" === "0010"
). This is under the assumption that a node is formed in the same order as the queue (or node list sorted after frequencies) and that the left side uses an encoding of"0"
. However, you may also encode it differently and that's perfectly fine as long as yourdecode
works the same way (i.e.decode(fs, encode(fs, s)) === s
).No.
Thanks for your suggestions. I will try to improve the description and JavaScript version.
Ok, that helps; my original solution was completing the operation by converting the bitstream into ASCII and extended ASCII characters.
The only issue now is with the third test for each test case. I'm not sure what it's testing for, but it seems to fail every time. So, what does it test for?
You mean the random tests? That means your frequencies do not match up with the input text. (I wonder if I can better name the tests, but I'm not the author of the JavaScript translation.)
I don't believe that is the case. My
decode
function returns the original string before being converted by theencode
function.I tested this the following way (using an example from the random tests):
The resulting
v2
string returns the originalstr
value. The result I get is:But there's another test after both
encode
anddecode
functions are run. The result I get from that latter test is:For this latter test, neither the
encode
nor thedecode
functions are run.EDIT: grammar corrections
That third test is
Test.assertEquals( "".concat( ...fs.map( ([c,n]) => c.repeat(n) ).sort() ), s.split("").sort().join("") );
wherefs = frequencies(s);
and it tests the output from thefrequencies
function.The first example test is
Test.assertDeepEquals( [...fs].sort(), [ ["a",4], ["b",1], ["c",2] ] );
wherefs = frequencies("aaaabcc");
; I thought that would have made clear what the expected output is.I've changed the type signatures in the Initial Solution a bit, because "tuple" may not be a familiar term to a JS programmer, and in JS, Strings are not Arrays of Characters (Characters as such don't even exist, they're just Strings of length 1).
Hi guys, just passing by... ;-o
@Johan: did you see my message in your 7x7 skyscrapers?
Bye!
@JohanWiltink
: Completed the kata and identified the problem. For thefrequencies
function, there was some ambiguity about the expected output. The example test case has an expected output of[['a',4], ['b',1], ['c',2]]
. This leaves open to interpretation the correct structure of the array.For example, if you have different characters that share the same frequency, it's unclear whether the array should be the first or the second type below:
To remedy this, the sample test case string could be changed to something like:
var str = 'aaaabbcd
All in all, it's still a very good kata.
The type hint
[ [String,Int] ]
in the solution setup should point people in the correct direction, I should hope.cool! I have a very inefficient solution but it was fun to figure out :)
This was fun. :]
I wouldn't approve it until I had solved it, but there you are.
RSN I'll get the JS translation up. ( I actually solved it in JS first, then translated. I wonder if it's visible in my code. :P )
I'm glad you liked it and looking forward to a translation. I probably should improve the tests a bit to be more verbose about failed tests.
I'm not entirely sure. Things I noticed:
decode
can be written in logarithmic time instead of linear (even constant with a vector lookup table, although that might waste a lot of space).freqsToTree
could cache the frequencies instead of recomputing them (although amortized constant time when using the tree a lot).I haven't been worrying too much about performance.
decode
uses a Map dictionary; I think it'll be pretty fast actually.freqsToTree
actually had cached frequencies. I took them out in the interest of simplicity. ( And there's always time complexity vs. space complexity. :)Most glaring example I see, afterwards:
code++[Z]
instead ofZ:code
and reversingcode
when inserting into the dictionary. I considered that, and then decided wrong on how often what things would be executed. So I left it the JS way, where appending is cheaper than prepending.The translation is in. Just published. Have a look!
@JohanWiltink
, seeing as how you authored the JavaScript translation, would you mind answering my question about the fourth test that's run for each test case? Please see my comment chain above.I think you mean third, not fourth. See above.