中国語チェッカーボード


21

中国のチェッカーのゲームは、6つの尖った星の形をしたスペースのあるボードでプレイされます。

ボード画像

ウィキペディアからの画像

.空のスポットとGYORPB6色の開始位置の文字を使用して、このボードのASCIIアート表現を作成できます。

            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

回答:


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

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

振り返ってみると、これはPythonの間違ったアプローチですが、誰かがそれを利用できるように、ここに投稿しています。この大量のコードを説明するのではなく、その背後にあるアイデアを述べようとします。

考えは三角座標を使用することです、三角格子はで整数トリプルに対応(a,b,c)a+b+c=0ます。

ここに画像の説明を入力してください

(ここでは、格子点は六角形として描かれています。)

デカルト座標を三角座標に変換することができます

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

ことを指摘xし、y同じパリティを持たなければならない、またはそれ以外の場合は、オフチェッカーボードだと私たちは宇宙を印刷する必要があります。

三角座標では、6面の星の境界線には次の方程式がありますa==n, b==n, c==n, a==-n, b==-n, c==-n

だから、私たちはどのによってにいるどの地域を決定することができます[a,b,c,-a,-b,-c]よりも大きいですn

  • ない場合は、中心にあり、ドットを印刷します。
  • 正確に1つである場合、6つの外側の三角形のいずれかにあり、インデックスに対応する文字を印刷します。
  • 2つ以上ある場合、ボードの外にいて、スペースを印刷します。

境界矩形では、これをx閉区間[-2 * n、2 * n]およびy閉区間[-3 * n、3 * n]で行う必要があります。


このコードは私には機能しません。
BadAtGeometry


どのバージョンを使用していますか?
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フラグを付けたまま1つのファイルとしてコードを実行し、#マーカーを保持し、必要に応じて出力の改行に変更して読みやすくすることができます。

コードの正規表現の複雑さは最小限です。生成の主な手順は次のとおりです。

  • 最後のG行と最初のB.Y行を作成します(マーカーijkで区切られ、実際に使用されるletetrはRPO)。
  • GGが1つだけになるまで、最上部の行をプラススペースでマイナスGで複製します。
  • 下重複しないB.Yプラススペースで行をし、ドット、マイナスBY何があるまで、BそしてY左。
  • 現在の文字列の後、逆の順序ですべての行をコピーします(マーカーを使用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>

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.