Python, <s>250</s> 245 characters = A very different approach which ended up beating out my other one! Input processing code is similar but that's about it. N='J'+raw_input()+' ' X=N[1]>'G' a,b,c=N[X:3+X] z=ord(a)*7/2-246-(ord(b)+3)%7 M=' -' for r in range(21): F=(' ',M[2<r<12])[r%2];L=M[r%2] if min(3,z)<=r<=max(11,z):print F+((L,'|')[8>z<r<z+4],(L,c)[M<c])[r==z]+(L,'o')[r==z]+(L,'|')[z-4<r<z>7]+F I mapped out each character's value based on the row and column and then golfed the printing: #given row r, with note on row n, how to print each char? #rows are: # HB : 0 # --- HA : 1 # HG : 2 # ----- HF : 3 # HE : 4 # ----- HD : 5 # HC : 6 # ----- B : 7 # A : 8 # ----- G : 9 # F : 10 # ----- E : 11 # D : 12 # --- C : 13 # LB : 14 # --- LA : 15 # LG : 16 # --- LF : 17 # LE : 18 # --- LD : 19 # LC : 20 #chars are: # 0 | 1 | 2 | 3 | 4 # # 0,4: # if r%2: # if 2<r<12: '-' # else ' ' # else: ' ' # 1: ' -b#|' # if r==n: # if A: c # else: ' -'[r%2] # elif n<8 and n<r<n+4: '|' # else: ' -'[r%2] # 2: ' -o' # if r==n: 'o' # else: ' -'[r%2] # 3: ' -|' # if n>7 and n-4<r<n: '|' # else: ' -'[r%2]