中文棋盘格


21

中国跳棋的游戏是在棋盘上进行的,棋盘上的空间为六角星状:

董事会形象

图片来自维基百科

我们可以创建此板的ASCII美术表示形式,.用于空白点和GYORPB六个彩色起始位置的字母:

            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

为了使其更有趣,我们还可以更改大小。我们将通过板的三角形起始位置的边长来测量板的尺寸:上面的板的尺寸为4。

由于手动键入所有内容确实很麻烦,所以让我们编写一个程序(或函数)来完成它!

细节

您的代码应通过STDIN,ARGV或函数参数采用一个正整数来表示电路板的大小。将棋盘图案输出到STDOUT(如果您提交的是函数,则可以交替将其作为字符串返回)。

输出必须

  • 根本没有尾随空格,或者
  • 具有恰好足够的尾随空格以将图案填充为宽度为6 * N + 1 的理想矩形。

输出可能有尾随换行符。不允许使用其他任何多余的(前导,尾随)空格。

例子

尺寸1:

   G
B . . Y
 . . .
P . . O
   R

尺寸2:

      G
     G G
B B . . . Y Y
 B . . . . Y
  . . . . .
 P . . . . O
P P . . . O O
     R R
      R

尺寸4:

            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

计分

这是:以字节为单位的最短代码获胜。


输出之前和之后可以有空行吗?
xnor

我要说不。
DLosc

您提到了尾随空格,但是前导空格呢?图像是否需要向左平移,或者每行上是否可以有相等的前导空格?
Sp3000

向左冲洗,如示例输出所示。
DLosc

右边缘上方是否有空间,但仍形成矩形?
xnor

Answers:


2

红宝石,141 127

返回一个矩形字符串

->n{(-2*n..2*n).map{|i|j=i.abs
k=j>n ?0:j 
(([i>0??P:?B]*k+[j>n ?i>0??R:?G:?.]*(2*n+1-j)+[i>0??O:?Y]*k)*" ").center(6*n+1)}*$/}

取消测试程序

f=->n{
  (-2*n..2*n).map{|i|                    #Iterate rows from -2*n to 2*n
    j=i.abs                              #Absolute value of i
    k=j>n ?0:j                           #Value of j up to n: for PBYO
    (                                    #An array of characters forming one line
      ([i>0??P:?B]*k+                    #B or P * (k=j or 0 as appropriate)
       [j>n ?i>0??R:?G:?.]*(2*n+1-j)+    #R,G or . * (2*n+1-j) to form centre diamond
       [i>0??O:?Y]*k                     #O or Y * (k=j or 0 as appropriate)
      )*" "                              #Concatenate the array of characters into a string separated by spaces.
    ).center(6*n+1)                      #pad the string to the full width of the image, adding spaces as necessary.
  }*$/                                   #Concatenate the array of lines into a string separated by newlines.
}

puts f[gets.to_i]

8

Python 2,140字节

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]

不太好,但这是我的初始出价。

空格规则增加了很多字节。为了进行比较,下面是一个120字节的Python 3程序,该程序仅在视觉上是正确的,并且不遵循空格规则:

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)

这是我稍长一些的递归149字节Python 3尝试:

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}))]

7

蟒蛇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

回想起来,这是Python的错误方法,但是我在这里发布了它,以防有人使用。与其解释这种混乱的代码,不如说出它背后的想法。

想法是使用三角坐标,其中三角晶格对应于(a,b,c)带有的整数三元组a+b+c=0

在此处输入图片说明

(此处,晶格点绘制为六边形。)

我们可以将笛卡尔坐标转换为三角坐标

a = (x+y)/2
b = (x-y)/2
c = -x

请注意,x并且y必须具有相同的奇偶校验,否则,它是非棋盘格,我们应该打印一个空格。

在三角坐标系中,六面星形的边界线具有以下方程式:a==n, b==n, c==n, a==-n, b==-n, c==-n

因此,我们可以确定哪个区域[a,b,c,-a,-b,-c]大于n

  • 如果没有,则我们在中心并打印一个点。
  • 如果正好是一个,则我们位于六个外部三角形之一中,并打印与索引相对应的字母。
  • 如果有两个或更多,则我们不在黑板上,并打印一个空格。

边界矩形要求我们x在封闭间隔[-2 * n,2 * n]和y封闭间隔[-3 * n,3 * n]中执行此操作。


该代码对我不起作用。
BadAtGeometry

@BadAtGeometry 对我有用。
xnor

您使用什么版本?
BadAtGeometry

@BadAtGeometry TIO正在使用2.7.15。运行它会怎样?
xnor

7

视网膜,234个字节

.
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
.
 #
#

一元输入。

每行应转到其自己的文件,并且#应在文件中更改为换行符。这是不切实际的,但是您可以将代码与带有-s标志的一个文件一样直接运行,保留#标记,并且可以根据需要将标记更改为输出中的换行符。

该代码具有最小的正则表达式复杂度。生成的主要步骤如下:

  • 创建最后G一行和第一B.Y行(由标记ijk和实际使用的字母分隔RPO)。
  • 将最上面的G行复制一个加号,减去一个G直到只有一个G。
  • 将底线B.Y用加号和点号(减去a)重复BY直到没有BY剩下。
  • 在当前字符串之后以相反的顺序复制所有行(借助标记q)。我们w在中间保留一个标记()。
  • 我们改封RPOGBY,如果他们的标志之前。
  • 添加缺少的中间空格。

=输入的上述每个点之后的结果(以分隔)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

4

JavaScript(ES6)228

逐行施工。与@ Sp3000相比,执行时间长得令人难以置信。

使用模板字符串为换行符再保存3个字节。所有换行符都很重要且已计数。

f=w=>(i=>{r=(n,s=b=' ')=>s.repeat(n),l=c=>(c='GBYPOR'[c])+r(i,b+c),t=n=>r(w*3-i)+l(n)+`
`,s=n=>r(w-1-i)+l(n)+b+r(w+w-i,'. ')+l(n+1)+`
`;for(o='',q=r(w)+r(w+w,'. ')+`.
`;++i<w;o+=t(0))q+=s(3);for(;i--;o+=s(1))q+=t(5)})(-1)||o+q

// LESS GOLFED

u=w=>{
  r =(n,s=b=' ') => s.repeat(n),
  l = c => (c='GBYPOR'[c])+r(i, b+c),
  t = n => r(w*3-i) + l(n) + '\n',
  s = n => r(w-1-i) + l(n) + b + r(w+w-i,'. ') + l(n+1) + '\n',
  o = '',
  q = r(w) + r(w+w,'. ') + '.\n';
  for(i=0; i<w; i++)
    o += t(0), q += s(3);  
  for(;i--;)
    o += s(1), q += t(5);
  return o+q
}  

go=()=> O.innerHTML=f(I.value|0)

go()
<input id=I value=5><button onclick='go()'>-></button><br>
<pre id=O></pre>

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.