กระดานหมากรุกจีน


21

เกมหมากรุกจีนเล่นบนกระดานโดยมีช่องว่างในรูปดาวหกแฉก:

ภาพบอร์ด

ภาพจาก Wikipedia

เราสามารถสร้างตัวแทน ASCII-art ของกระดานนี้โดยใช้.สำหรับจุดที่ว่างเปล่าและตัวอักษร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

คำตอบ:


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

Ungolfed ในโปรแกรมทดสอบ

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]

ไม่ดี แต่นี่คือการเสนอราคาเริ่มต้นของฉัน

กฎช่องว่างเพิ่มจำนวนไบต์ สำหรับการเปรียบเทียบนี่เป็นโปรแกรม Python 3 ขนาด 120 ไบต์ที่ถูกต้องทางสายตาเท่านั้นและไม่เป็นไปตามกฎช่องว่าง:

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 byte 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

นี่คือการหวนกลับวิธีที่ผิดสำหรับงูใหญ่ แต่ฉันโพสต์ไว้ที่นี่ในกรณีที่มีคนสามารถใช้มันได้ แทนที่จะอธิบายระเบียบของรหัสนี้ฉันจะพยายามพูดแนวคิดที่อยู่เบื้องหลัง

ความคิดที่จะใช้พิกัดสามเหลี่ยมซึ่งในสามเหลี่ยมตาข่ายสอดคล้องกับจำนวนเต็มอเนกประสงค์ด้วย(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

  • หากไม่มีเราอยู่ตรงกลางและพิมพ์จุด
  • ถ้าตรงคือเราอยู่ในหนึ่งในหกสามเหลี่ยมด้านนอกและพิมพ์ตัวอักษรที่สอดคล้องกับดัชนี
  • หากมีสองคนขึ้นไปเราอยู่นอกบอร์ดและพิมพ์เว้นวรรค

สี่เหลี่ยม bounding ต้องการให้เราทำเช่นนี้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
.
 #
#

ใช้อินพุตเป็น unary

แต่ละบรรทัดควรไปที่ไฟล์ของตนเองและ#ควรเปลี่ยนเป็นบรรทัดใหม่ในไฟล์ สิ่งนี้ไม่สามารถใช้งานได้ แต่คุณสามารถเรียกใช้รหัสได้เช่นเดียวกับไฟล์ที่มีการ-sตั้งค่าสถานะรักษา#เครื่องหมายและอาจเปลี่ยนเป็นบรรทัดใหม่ในผลลัพธ์เพื่อให้สามารถอ่านได้หากคุณต้องการ

รหัสมีความซับซ้อน regex น้อยที่สุด ขั้นตอนหลักในการสร้างมีดังนี้:

  • สร้างGบรรทัดสุดท้ายและบรรทัดแรกB.Y(คั่นด้วยเครื่องหมายijkและ letetrs ที่ใช้จริงคือRPO)
  • ทำซ้ำGบรรทัดบนสุดด้วยช่องว่างบวกลบ G จนกว่าจะมีเพียงหนึ่งกรัม
  • ทำซ้ำB.Yบรรทัดล่างด้วยการเว้นวรรคและจุดบวกลบ a BและYจนกว่าจะไม่มีBและYเหลือ
  • คัดลอกทุกบรรทัดในลำดับที่กลับหลังสตริงปัจจุบัน (ด้วยความช่วยเหลือของเครื่องหมายq) เราเก็บเครื่องหมาย ( w) ไว้ตรงกลาง
  • เราเปลี่ยนตัวอักษรRPOเป็นGBYถ้าอยู่ข้างหน้าเครื่องหมาย
  • เพิ่มช่องว่างในระหว่างที่ขาดหายไป

ผลลัพธ์หลังแต่ละจุดด้านบน (คั่นด้วย='s) สำหรับอินพุต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.