Hi,
A tweet can contain 140 UTF-16 characters.
An UTF-16 character can be composed of 2 16-bits surrogates.
A UTF-16 surrogate can be used to store 10 bits.
An ASCII character is 7 bits long.
So, a tweet can encode 140 x 2 x 10 = 2800 bits = 400 plain ASCII characters.
The challenge is to make an encoder (converting 400 - or more - ASCII chars in 140 UTF-16 chars) and a decoder (doing the opposite) that can both fit in a tweet.
NB: the encoder and decoder can be packed with this: https://gist.github.com/xem/7086007
NB2: non-printable characters 0x00 to 0x1F and 0x7F can be omitted.
Have fun!
Encodes 400 ASCII chars.
Encoder: 190 chars minified, 140 chars packed
e=function(e,c,b,d){d=b="";for(c in e)b+=(0+e.charCodeAt(c).toString(2)).slice(-7);for(c=0;b;b=b.slice(10))d+=String.fromCharCode((c++%2?56320:55296)+parseInt(b.substring(0,10),2));return d}
// or
eval(unescape(escape("𩐽𩡵𫡣𭁩𫱮𛁣𛁢𛁤𩀽𨠽𘠢𫱲𘁩𫠠𩐩𨠫🐨𩐮𨱨𨑲𠱯𩁥𠑴𭁯𤱴𬡩𫡧𫁩𨱥𫱲🐰👢𫁩𨱥𤱴𬡩𫡧𬡯𫑃𪁡𬡃𫱤𩐨𝠳𞠵𝐲𬁡𬡳𩑉𫡴𭑢𬱴𬡩𫡧𛀱𛀲𞱲𩑴𭑲𫠠𩁽").replace(/uD./g,'')))
Decoder: 159 chars minified, 124 chars packed
e=function(e,d,b,c){c=b="";for(d=0;400>d;)b=b.slice(7)+e.charCodeAt(d++).toString(2).slice(-10),c+=String.fromCharCode(parseInt(b.substring(0,7),2));return c}
// or
eval(unescape(escape("𩀽𩡵𫡣𭁩𫱮𛁤𛁢𛁣𨰽𨠽𘠢𫱲🐰🡤𨠽𨠮𬱬𪑣𩐨𪁡𬡃𫱤𩑁𭀨𩀫𫱓𭁲𪑮𩰨𫁩𨱥𨰫👓𭁲𪑮𩰮𩡲𫱭𠱨𨑲𠱯𩁥𨑲𬱥𢑮𭀨𨠮𬱵𨡳𭁲𪑮𩰨𛀲𞱲𩑴𭑲𫠠𨱽").replace(/uD./g,'')))
Demo and source code:
I suppose, it's impossible to beat the compression ratio, the only option is to make the encoder and decoder smaller.
By the way, why are
e=
andd=
packed in? It's a global scope pollution as far as I understand.