Bàn cờ Trung Quốc


21

Trò chơi cờ đam Trung Quốc được chơi trên một bảng với các khoảng trống trong hình ngôi sao sáu cánh:

Hình ảnh bảng

Hình ảnh từ Wikipedia

Chúng ta có thể tạo một đại diện nghệ thuật ASCII của bảng này, sử dụng .cho các điểm trống và các chữ cái GYORPBcho sáu vị trí bắt đầu được tô màu:

            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

Để làm cho nó thú vị hơn, chúng ta cũng có thể thay đổi kích thước. Chúng tôi sẽ đo kích thước của một bảng theo chiều dài cạnh của các vị trí bắt đầu hình tam giác của nó: bảng ở trên là kích thước 4.

Vì thực sự rất khó để gõ tất cả những thứ đó bằng tay, hãy viết một chương trình (hoặc chức năng) để làm điều đó!

Chi tiết

Mã của bạn nên lấy một số nguyên dương biểu thị kích thước của bảng, thông qua STDIN, ARGV hoặc đối số hàm. Xuất mẫu bảng kiểm tra thành STDOUT (bạn có thể luân phiên trả nó dưới dạng chuỗi nếu trình của bạn là một hàm).

Đầu ra phải

  • không có dấu vết ở tất cả, hoặc
  • có chính xác đủ các khoảng trống để điền vào mẫu hình chữ nhật hoàn hảo có chiều rộng 6 * N + 1.

Đầu ra có thể tùy chọn có một dòng mới. Không có khoảng trắng bổ sung (hàng đầu, dấu) khác được cho phép.

Ví dụ

Kích thước 1:

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

Kích thước 2:

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

Kích thước 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

Chấm điểm

Đây là : mã ngắn nhất tính bằng byte thắng.


Đầu ra có thể có các dòng trống của không gian trước và sau không?
xnor

Tôi sẽ nói không.
DLosc

Bạn đã đề cập đến không gian dấu, nhưng những gì về không gian hàng đầu? Là hình ảnh cần phải được để lại bên trái, hoặc nó có thể có một số lượng không gian hàng đầu bằng nhau trên mỗi dòng?
Sp3000

Rửa sang trái, như thể hiện trong đầu ra mẫu.
DLosc

Có thể có không gian bên ngoài cạnh phải nhưng vẫn tạo thành một hình chữ nhật?
xnor

Câu trả lời:


2

Ruby, 141 127

Trả về một chuỗi hình chữ nhật

->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)}*$/}

Ungolfed trong chương trình thử nghiệm

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 byte

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]

Không tuyệt vời, nhưng đây là giá thầu ban đầu của tôi.

Các quy tắc khoảng trắng đã thêm rất nhiều byte. Để so sánh, đây là chương trình Python 3 120 byte chỉ đúng về mặt trực quan và không tuân theo các quy tắc về khoảng trắng:

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)

Và đây là nỗ lực đệ quy 149 byte Python 3 dài hơn một chút của tôi:

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

Con trăn 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

Đây là, nhìn lại, cách tiếp cận sai đối với Python, nhưng tôi sẽ đăng nó ở đây trong trường hợp ai đó có thể sử dụng nó. Thay vì giải thích mớ hỗn độn về mã này, tôi sẽ cố gắng nói ý tưởng đằng sau nó.

Ý tưởng là sử dụng tọa độ tam giác , trong đó mạng tam giác tương ứng với bộ ba số nguyên (a,b,c)với a+b+c=0.

nhập mô tả hình ảnh ở đây

(Ở đây, các điểm mạng được vẽ dưới dạng hình lục giác.)

Chúng ta có thể chuyển đổi tọa độ Descartes thành tọa độ tam giác như

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

lưu ý rằng xyphải có cùng tính chẵn lẻ, hoặc nếu không thì đó là bảng kiểm tra và chúng ta nên in một khoảng trắng.

Trong tọa độ tam giác, các đường giới hạn của ngôi sao sáu mặt có phương trình : a==n, b==n, c==n, a==-n, b==-n, c==-n.

Vì vậy, chúng ta có thể xác định khu vực nào chúng ta đang ở trong đó [a,b,c,-a,-b,-c]lớn hơn n.

  • Nếu không có, chúng tôi ở trung tâm và in một dấu chấm.
  • Nếu chính xác là một, chúng ta sẽ ở một trong sáu hình tam giác bên ngoài và in chữ cái tương ứng với chỉ mục.
  • Nếu hai hoặc nhiều hơn, chúng tôi ở ngoài bảng và in một khoảng trắng.

Hình chữ nhật giới hạn yêu cầu chúng tôi thực hiện điều này xtrong khoảng thời gian đóng [-2 * n, 2 * n] và ytrong khoảng thời gian đóng [-3 * n, 3 * n].


Mã không hoạt động đối với tôi.
BadAtGeometry


Phiên bản nào bạn đang sử dụng?
BadAtGeometry

@BadAtGeometry TIO đang sử dụng 2.7.15 . Điều gì xảy ra khi bạn chạy nó?
xnor

7

Võng mạc , 234 byte

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

Đưa đầu vào trong unary.

Mỗi dòng nên đi đến tệp riêng của nó và #nên được thay đổi thành dòng mới trong tệp. Điều này là không thực tế nhưng bạn có thể chạy mã dưới dạng một tệp với -scờ, giữ các #điểm đánh dấu và có thể thay đổi chúng thành dòng mới trong đầu ra để dễ đọc nếu bạn muốn.

Mã này có độ phức tạp regex tối thiểu. Các bước chính trong thế hệ là như sau:

  • Tạo Gdòng cuối cùng và dòng đầu tiên B.Y(được phân định bởi các điểm đánh dấu ijkvà letetrs thực tế được sử dụng RPO).
  • Nhân đôi Gdòng trên cùng với một khoảng trắng cộng, trừ một G cho đến khi chỉ còn một G.
  • Nhân đôi B.Ydòng dưới cùng với dấu cách và dấu chấm, trừ đi một BYcho đến khi không còn BYtrái.
  • Sao chép tất cả các dòng theo thứ tự ngược sau chuỗi hiện tại (với sự trợ giúp của điểm đánh dấu q). Chúng tôi giữ một điểm đánh dấu ( w) ở giữa.
  • Chúng tôi thay đổi các chữ cái RPOđể GBYnếu họ trước khi đánh dấu.
  • Thêm khoảng trống ở giữa.

Kết quả sau mỗi điểm trên (được phân định bởi ='s) cho đầu vào 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

Thi công theo đường dây. Cực kỳ dài so với @ Sp3000 cũng vậy.

Sử dụng chuỗi mẫu để lưu thêm 3 byte cho dòng mới. Tất cả các dòng mới là quan trọng và được tính.

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>

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.