1 of 2

C, 233 bytes

char*t="  0 _ _0 ___0 _ _   0_. (0=./_0=._*0=.\\_0_. ) 4 \\  (2.oO-1,._ 3.oO-)5 /  4< / (6 ]> 6:   6 [< )5> \\  (7 \"_ 7: _ 7 \"_ ) ";i,r,d;f(char*p){for(;r<35;++r){d=t[i]-48;putchar(t[d<0?i:i+p[d]-48]);i+=d<0?1:5;r%7-6?0:puts("");}}


With newlines and whitespace for better readability:

char* t = "  0 _ _0 ___0 _ _   0_. (0=./_0=._*0=.\\_0_. ) 4 \\  (2.oO-1,._ 3.oO-)5 /  4< / (6 ]> 6:   6 [< )5> \\  (7 \"_ 7: _ 7 \"_ ) ";
i, r, d;
f(char* p)
{
for ( ; r < 35; ++r)
{
d = t[i] - 48;
putchar(t[d < 0 ? i : i + p[d] - 48]);
i += d < 0 ? 1 : 5;
r % 7 - 6 ? 0 : puts("");
}
}


The whole thing is fairly brute force. It uses a table that contains one entry for each of the 35 (5 lines with length 7) characters. Each entry in the table is either:

• A constant character: , (, ). Length of table entry is 1 character.
• Index of body part, followed by the 4 possible characters depending on the part selection in the input. Length of table entry is 5 characters.

The code then loops over the 35 characters, and looks up the value in the table.

Looking at this now, I think I can save at least 3 more characters.