중국어 바둑판


21

중국 체커 게임은 6 각형 별 모양의 공간이있는 보드에서 진행됩니다.

보드 이미지

Wikipedia의 이미지

.빈 자리와 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

파이썬 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

이것은 돌이켜 보면 파이썬에 대한 잘못된 접근 방식이지만 누군가가 그것을 사용할 수 있도록 여기에 게시하고 있습니다. 이 코드 엉망을 설명하기보다는 그 아이디어를 말하려고 노력할 것입니다.

아이디어는 사용하는 삼각형의 좌표 ,있는 삼각형 격자 대응 정수 트리플 (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 개의 외부 삼각형 중 하나에 있고 인덱스에 해당하는 문자를 인쇄합니다.
  • 둘 이상인 경우 우리는 보드 외부에 있고 공간을 인쇄합니다.

경계 사각형은 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플래그를 사용하여 하나의 파일처럼 코드를 실행하여 #마커를 유지하고 원하는 경우 가독성을 위해 출력에서 ​​개행으로 변경할 수 있습니다.

코드는 정규식 복잡성을 최소화합니다. 세대의 주요 단계는 다음과 같습니다.

  • 마지막 G행과 첫 번째 B.Y행을 작성하십시오 (마커 ijk및 실제 사용 된 letetrs는로 구분됨 RPO).
  • GG가 하나만 나올 때까지 +를 빼고 맨 위 줄을 더합니다.
  • 바닥 중복되지 B.Y더하기 공간 라인과 점, 마이너스 BY더 없을 때까지 B하고 Y떠났다.
  • 현재 문자열 다음에 모든 줄을 역순으로 복사하십시오 (marker의 도움으로 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

자바 스크립트 ( 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.