Çin dama tahtası


21

Çin daması oyunu altı köşeli yıldız şeklinde boşluklu bir tahtada oynanır:

Yönetim Kurulu resmi

Wikipedia'dan görüntü

.Boş panoları GYORPBve altı renkli başlangıç ​​yeri için harfleri kullanarak, bu tahtanın ASCII-sanat gösterimini oluşturabiliriz :

            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

Daha ilginç hale getirmek için, boyutunu da değiştirebiliriz. Bir tahtanın boyutunu üçgen başlangıç ​​konumlarının yan uzunluğuyla ölçeceğiz: yukarıdaki tahtanın boyutu 4'tür.

Bunları elle yazmak gerçekten acı verici olduğundan, bunu yapmak için bir program (veya işlev) yazalım!

ayrıntılar

Kodunuz, kartın boyutunu temsil eden, STDIN, ARGV veya fonksiyon argümanı yoluyla pozitif bir tamsayı almalıdır. Dama tahtası desenini STDOUT'a gönder (gönderiminiz bir işlevse, dönüşümlü olarak dizge olarak döndürebilirsiniz).

Çıktı ya olmalı

  • hiç iz bırakma alanı yoksa veya
  • Deseni, 6 * N + 1 genişliğinde mükemmel bir dikdörtgene doldurmak için tam olarak yeterli izler vardır .

Çıktı isteğe bağlı olarak takip eden bir yeni satıra sahip olabilir. Başka hiçbir ekstra (önde, izleyen) boşluk bırakılamaz.

Örnekler

Boyut 1:

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

Boyut 2:

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

Boyut 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

puanlama

Bu : bayt cinsinden en kısa kod kazanır.


Çıktıdan önce ve sonra boş satır boşlukları olabilir mi?
xnor

Hayır diyeceğim.
DLosc

Sondaki boşluklardan bahsettiniz, peki ya önde gelen alanlar? Görüntünün sola yaslanması gerekiyor mu, yoksa her satırda eşit miktarda öncü boşluk olabilir mi?
Sp3000,

Numune çıkışında gösterildiği gibi sola doğru yıkayın.
DLosc

Sağ kenarın ötesinde fakat yine de bir dikdörtgen oluşturan boşluklar olabilir mi?
xnor

Yanıtlar:


2

Ruby, 141 127

Dikdörtgen bir dize döndürür

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

Test programında 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 bayt

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]

Harika değil, ama işte ilk teklifim.

Boşluk kuralları çok fazla bayt ekledi. Karşılaştırma için, burada yalnızca görsel olarak doğru olan ve beyaz boşluk kurallarına uymayan 120 baytlık bir Python 3 programı verilmiştir:

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)

Ve işte biraz daha uzun özyinelemeli 149 byte Python 3 denemem:

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

Bu, geçmişe bakıldığında, Python için yanlış bir yaklaşım, ancak birinin kullanması ihtimaline karşı buraya gönderiyorum. Bu kod karmaşasını açıklamak yerine, arkasındaki fikri söylemeye çalışacağım.

Fikri kullanmaktır üçgen koordinat , burada üçgen kafes tekabül tam sayı üç katına (a,b,c)sahip a+b+c=0.

görüntü tanımını buraya girin

(Burada, kafes noktaları altıgenler olarak çizilir.)

Kartezyen koordinatlarını üçgen şekillere dönüştürebiliriz.

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

buna dikkat edin xve yaynı pariteye sahip olmalı, aksi halde kontrolden çıkmış olmalı ve bir boşluk basmalıyız.

Üçgen koordinatlarda, altı yüzlü yıldızın sınırlayıcı hatları denklemler var: a==n, b==n, c==n, a==-n, b==-n, c==-n.

Böylece hangi bölgede bulunduğumuz bölgeden [a,b,c,-a,-b,-c]daha büyük olduğunu belirleyebiliriz n.

  • Hiçbiri değilse, merkezdeyiz ve bir nokta yazdırın.
  • Tam olarak biri ise, altı dış üçgenden birindeyiz ve dizine karşılık gelen mektubu yazdırın.
  • İki ya da daha fazla ise, tahtanın dışındayız ve bir alan yazdırın.

Sınırlama dikdörtgeni bunu xkapalı aralıkta [-2 * n, 2 * n] ve ykapalı aralıkta [-3 * n, 3 * n] yapmamızı gerektirir .


Kod benim için çalışmıyor.
BadAtGeometry

@BadAtGeometry Benim için çalışıyor .
xnor

Hangi sürümü kullanıyorsun?
BadAtGeometry

@BadAtGeometry TIO 2.7.15 kullanıyor . Koşarken ne olacak?
xnor

7

Retina , 234 bayt

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

Tekli girişi alır.

Her satır kendi dosyasına gitmeli ve dosyadaki #yeni satırla değiştirilmelidir. Bu pratik değildir, ancak kodu bir -sbayrakla olduğu gibi çalıştırabilir, #işaretçileri tutar ve belki de okunabilir olması için çıktıda yeni satırlara değiştirirsiniz.

Kodun minimal regex karmaşıklığı var. Nesillerdeki ana adımlar aşağıdaki gibidir:

  • Son Gsatırı ve ilk B.Ysatırı yarat (işaretçilerle ayrılmış ijkve gerçek kullanılmış harfler RPO).
  • En üst Gçizgiyi artı boşlukla çoğaltın , sadece bir G olana kadar bir G eksi.
  • Alt B.Yçizgiyi artı boşluk ve nokta, eksi a Bve eksi ve sola Ykalana kadar çoğaltın .BY
  • Geçerli dizgeden sonra tüm satırları ters sırayla kopyalayın (marker yardımı ile q). wOrtada bir kalem ( ) tutarız .
  • Biz harfleri değiştirmek RPOiçin GBYonlar işaretleyici önce ise.
  • Eksik boşluklar arasına ekle.

=Girdi için yukarıdaki noktaların her birinin ( 'lar tarafından sınırlandırılmış ) sonraki sonuçları 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

Satır satır satır. Aynı şeyi yapan @ Sp3000 ile karşılaştırıldığında inanılmaz derecede uzun.

Newlines için 3 bayt daha kaydetmek için şablon dizesini kullanma. Tüm yeni satırlar önemlidir ve sayılır.

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>

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.