Tic Tac Toe encoder/decoder
C++, 168 + 135 = 303 bytes



EDIT: saved one byte by requiring uppercase input

I like doing these in C++ because I get to do all sorts of fun nastiness I would never ever do in C++ code.

Encoder (168):

Takes a string of uppercase letters and spaces as an argument.

#include&lt;cstdio&gt;
int main(int h,char**c){c[0][3]=0;for(c++;h=**c;c[0]++){h=h&amp;32?26:h-65;for(int d=2,e;d+1;d--){h=(h-(e=h%3))/3;c[-1][d]=e&amp;2?88:e*47+32;}printf(c[-1]);}}


Readable:

#include&lt;cstdio&gt;
int main(int h,char**c)
{
    c[0][3]=0;
    for(c++;h=**c;c[0]++)
    {
        h=h&amp;32?26:h-65;
        for(int d=2,e;d+1;d--)
        {
            h=(h-(e=h%3))/3;
            c[-1][d]=e&amp;2?88:e*47+32;
        }
        printf(c[-1]);
    }
}


Decoder (135):

Takes a string of X, O, and space as an argument.

#include&lt;cstdio&gt;
int b=9,v;int main(int h,char**c){for(c++;h=**c;c[0]++){v+=(h&amp;16?2:h&amp;1)*b;b/=3;if(!b)putchar(v==26?32:v+97),v=0,b=9;}}


Readable:

#include&lt;cstdio&gt;
int b=9,v;
int main(int h,char**c)
{
    for(c++;h=**c;c[0]++)
    {
        v+=(h&amp;16?2:h&amp;1)*b;
        b/=3;
        if(!b)putchar(v==26?32:v+97),v=0,b=9;
    }
}