Chinese checkerboard
Python 2, 152
n=input();x=N=2*n
while~N<x:s='';y=n*3;exec"a=x+y;q=[0,a>N,x-y>N,-x>n,-a>N,y-x>N,x>n,1];s+=' BYROPG.'[q.index(sum(q)<~a%2*3)];y-=1;"*(y-~y);print s;x-=1
This is, in retrospect, the wrong approach for Python, but I'm posting it here in case someone can make use of it. Rather than explaining this mess of code, I'll try to say the idea behind it.
The idea is to use triangular coordinates, in which the triangular lattice corresponds to integer triples (a,b,c)
with a+b+c=0
.
(Here, the lattice points are drawn as hexagons.)
We can convert Cartesian coordinates to triangular ones as
a = (x+y)/2
b = (x-y)/2
c = -x
noting that x
and y
must have the same parity, or otherwise it's off-checkerboard and we should print a space.
In triangular coordinates, the bounding lines of the six-sided star have equations: a==n, b==n, c==n, a==-n, b==-n, c==-n
.
So, we can determine what region we're in by which of [a,b,c,-a,-b,-c]
are greater than n
.
- If none are, we're in the center and print a dot.
- If exactly one is, we're in one of the six outer triangles, and print the letter corresponding to the index.
- If two or more are, we're outside the board, and print a space.
The bounding rectangle requires that we do this for x
in the closed interval [-2*n,2*n] and y
in the closed interval [-3*n,3*n].
Python 2, 140 bytes
n=input()
for k in range(4*n+1):x=abs(k-2*n);y=2*n-x;p,q,r=" BP G..R YO "[(k-~k)/(n-~n)::4];print(" "*y+" ".join(p*x+q*-~y+r*x)+" "*y)[n:-n]
Not great, but here's my initial bid.
The whitespace rules added a lot of bytes. For comparison, here's a 120 byte Python 3 program which is only correct visually, and doesn't follow the whitespace rules:
def f(n):
for k in range(4*n+1):x=abs(k-2*n);y=2*n-x;p,q,r=" BP G..R YO "[(k-~k)//(n-~n)::4];print(" "*y,*p*x+q*-~y+r*x)
And here's my slightly longer recursive 149 byte Python 3 attempt:
def f(n,k=0):x=2*n-k;s=" ".join(["B"*x+"."*-~k+"Y"*x,"G"*-~k][k<n]).center(6*n+1);print(s);k<n*2and[f(n,k+1),print(s.translate({71:82,66:80,89:79}))]
Retina, 234 bytes
.
P
.+
iP$0$0x$0j$0x$0Px$0kqw
P(?=P*xP*j)
s
P(?=P*j)
R
P(?=P*xP*k)
c
P(?=P*k)
O
x
+`i(s+R+)R
is$1#$1R
+`(s*)P(P*c*)(O*)O(?=k)
$0#s$1$2c$3
j|k
#
s
+`([^#]+#)q(.*)
q$1$2$1
R(?=.*w)
G
P(?=.*w)
B
O(?=.*w)
Y
w[^#]*#|q|i
\w
$0
c
.
#
#
Takes input in unary.
Each line should go to its own file and #
should be changed to newline in the file. This is impractical but you can run the code as is as one file with the -s
flag, keeping the #
markers and maybe changing them to newlines in the output for readability if you wish.
The code has minimal regex-complexity. The main steps in the generation are the followings:
- Create the last
G
line and the firstB.Y
line (delimited by markersijk
and actual used letetrs areRPO
). - Duplicate the topmost
G
line with a plus space, minus a G until there is only one G. - Duplicate the bottom
B.Y
line with a plus space and dot, minus aB
andY
until there are noB
andY
left. - Copy all the lines in reverse order after the current string (with the help of the marker
q
). We keep a marker (w
) in the middle. - We change the letters
RPO
toGBY
if they are before the marker. - Add the missing in-between spaces.
The results after each of the above points (delimited by =
's) for the input 1111 (unary 4)
:
1111
==============================
isssssssssRRRRjPPPPcccccOOOOkqw
==============================
issssssssssssR
sssssssssssRR
ssssssssssRRR
sssssssssRRRRjPPPPcccccOOOOkqw
==============================
issssssssssssR
sssssssssssRR
ssssssssssRRR
sssssssssRRRRjPPPPcccccOOOO
sPPPccccccOOO
ssPPcccccccOO
sssPccccccccO
ssssccccccccckqw
==============================
qi R
RR
RRR
RRRR
PPPPcccccOOOO
PPPccccccOOO
PPcccccccOO
PccccccccO
ccccccccc
w ccccccccc
PccccccccO
PPcccccccOO
PPPccccccOOO
PPPPcccccOOOO
RRRR
RRR
RR
i R
==============================
qi G
GG
GGG
GGGG
BBBBcccccYYYY
BBBccccccYYY
BBcccccccYY
BccccccccY
ccccccccc
w ccccccccc
PccccccccO
PPcccccccOO
PPPccccccOOO
PPPPcccccOOOO
RRRR
RRR
RR
i R
==============================
G
G G
G G G
G G G G
B B B B . . . . . Y Y Y Y
B B B . . . . . . Y Y Y
B B . . . . . . . Y Y
B . . . . . . . . Y
. . . . . . . . .
P . . . . . . . . O
P P . . . . . . . O O
P P P . . . . . . O O O
P P P P . . . . . O O O O
R R R R
R R R
R R
R