ASCII Sanat Satranç Tahtası


12

Bu meydan okumada, aşağıdaki satranç tahtasını çizmeniz ve hamle yapılmasına izin vermeniz gerekiyor.

1. Çizim

Her beyaz karede 5x9 boşluk vardır.

Her siyah karede 5x9 sütun bulunur.

Tahta iki nokta üst üste ile çevrilidir.

Parçalar 5 karakter genişliğindedir ve merkezdeki karenin alt sırasına oturur.

Piyonlar 4 karakter genişliğindedir. Solda 3 boş kare ve sağda 2 boş kare ile hafifçe sağdan merkeze otururlar. Meydanın dibinde bir çizgi oturuyorlar.

İsteğe bağlı bir takip eden yeni satır haricinde, yönetim kurulu alanının dışında boşluk bulunmayacaktır.

Yönetim kurulu ve satranç figürleri aşağıdakiler dışında aynen gösterildiği gibi çizilecektir:

  1. :Siyah karelerdeki ve kenarlardaki farklı bir sembolün yerini alabilir @ve siyah parçalardaki farklı bir sembolün yerine kullanabilirsiniz (ancak siyah kareler için kullanılanla aynı değil).

  2. İsterseniz piyonları bir karakter sola taşıyabilirsiniz.

.

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:         :::::::::         :::www:::   _+_   :::::::::         ::::::::::
:  |_|_|  :: _,,:::   (/)   :::)@(:::   )@(   :::(/):::   _,,   ::|_|_|:::
:   |@|   ::"- \~::   |@|   :::|@|:::   |@|   :::|@|:::  "- \~  :::|@|::::
:   |@|   :::|@|:::   |@|   :::|@|:::   |@|   :::|@|:::   |@|   :::|@|::::
:  /@@@\  ::/@@@\::  /@@@\  ::/@@@\::  /@@@\  ::/@@@\::  /@@@\  ::/@@@\:::
::::::::::         :::::::::         :::::::::         :::::::::         :
:::::():::    ()   ::::():::    ()   ::::():::    ()   ::::():::    ()   :
:::::)(:::    )(   ::::)(:::    )(   ::::)(:::    )(   ::::)(:::    )(   :
::::/@@\::   /@@\  :::/@@\::   /@@\  :::/@@\::   /@@\  :::/@@\::   /@@\  :
::::::::::         :::::::::         :::::::::         :::::::::         :
:         :::::::::         :::::::::         :::::::::         ::::::::::
:         :::::::::         :::::::::         :::::::::         ::::::::::
:         :::::::::         :::::::::         :::::::::         ::::::::::
:         :::::::::         :::::::::         :::::::::         ::::::::::
:         :::::::::         :::::::::         :::::::::         ::::::::::
::::::::::         :::::::::         :::::::::         :::::::::         :
::::::::::         :::::::::         :::::::::         :::::::::         :
::::::::::         :::::::::         :::::::::         :::::::::         :
::::::::::         :::::::::         :::::::::         :::::::::         :
::::::::::         :::::::::         :::::::::         :::::::::         :
:         :::::::::         :::::::::         :::::::::         ::::::::::
:         :::::::::         :::::::::         :::::::::         ::::::::::
:         :::::::::         :::::::::         :::::::::         ::::::::::
:         :::::::::         :::::::::         :::::::::         ::::::::::
:         :::::::::         :::::::::         :::::::::         ::::::::::
::::::::::         :::::::::         :::::::::         :::::::::         :
::::::::::         :::::::::         :::::::::         :::::::::         :
::::::::::         :::::::::         :::::::::         :::::::::         :
::::::::::         :::::::::         :::::::::         :::::::::         :
::::::::::         :::::::::         :::::::::         :::::::::         :
:         :::::::::         :::::::::         :::::::::         ::::::::::
:    ()   ::::():::    ()   ::::():::    ()   ::::():::    ()   ::::()::::
:    )(   ::::)(:::    )(   ::::)(:::    )(   ::::)(:::    )(   ::::)(::::
:   /__\  :::/__\::   /__\  :::/__\::   /__\  :::/__\::   /__\  :::/__\:::
:         :::::::::         :::::::::         :::::::::         ::::::::::
::::::::::         :::::::::   www   :::_+_:::         :::::::::         :
:::|_|_|::   _,,   :::(/):::   ) (   :::) (:::   (/)   :::_,,:::  |_|_|  :
::::| |:::  "- \~  :::| |:::   | |   :::| |:::   | |   ::"- \~::   | |   :
::::| |:::   | |   :::| |:::   | |   :::| |:::   | |   :::| |:::   | |   :
:::/___\::  /___\  ::/___\::  /___\  ::/___\::  /___\  ::/___\::  /___\  :
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

2. Taşınma

Sütunlar soldan sağa AH, aşağıdan yukarıya 1 ila 8 olarak etiketlenmiştir. Kullanıcı aşağıdaki biçimde bir hamle girebilmelidir:

<start column><start row><space><destination column><destination row>

Örneğin B1 C3şövalyeyi piskoposun piyonunun önündeki kareye taşıyın (oyunun yeni başladığını varsayarak).

Alternatif olarak, sütunların A ila H yerine 1 ila 8 olarak etiketlendiği ICCF sistemi kullanılabilir, böylece yukarıda belirtilen şövalye hareketi olur 21 33.

Aşağıdaki görüntü ( kaynak ) her iki sistemi de netleştirir:

resim açıklamasını buraya girin

Hareket gerçekleştirilecek ve yeni tahta gösterilecektir. Ortaya çıkan herhangi bir yakalama, hareketli satranççının hedef meydandaki satranççuyu tahtadan kaldırmasıyla gerçekleşecektir.

Diğer zorluklarda ele alındığı için yasal bir satranç hamlesini kontrol etmeye gerek yoktur: En küçük satranç programı ve En küçük Satranç hakemi Kullanıcı boş bir kareden taşınmaya çalışırsa, programınız veya işleviniz hareketi yok saymalıdır. Kullanıcı dostane bir parça yakalamaya çalışırsa, taşımayı yoksayabilir veya sabit parçanın yakalanmasına izin verebilirsiniz.

Yolcu veya rıhtımı desteklemeye gerek yoktur.

Girişin iyi biçimlendirileceğini, yani her zaman yukarıda açıklanan biçimde olduğunu varsayabilirsiniz. Harfler her zaman aynı durumda olacak, bunun ne olduğuna karar verebilirsiniz.

3. Puanlama ve Bonuslar

Bu kod golf. En kısa kod kazanır.

Programınız veya işleviniz tanıtım için izin veriyorsa -10% bonus. Kullanıcı bu kez aşağıdaki harflerden biri olan üçüncü bir girdi girer: QBR N. Buna sadece hareketin son satırda bir piyonla bitmesi durumunda izin verilmelidir. Piyon belirtilen parça ile değiştirilir. QBRN.

Programınız veya işleviniz, hamleleri tersine çevirmek için özel bir "geri al" hareketi uygularsa% 10 bonus (gerekirse oyunun başlangıcına kadar.) Açıkçası amatör oyuncuların yasadışı hamleler yapması mümkündür ve onları geri almak için. Kullanıcının bu "geri al" hareketi için vermesi gereken girdiyi tanımlayabilirsiniz (her zaman aynı olmalıdır.) Kullanıcı oyunun başlangıcından sonra geri almaya çalıştığında davranış tanımsızdır.

İkramiye toplamı, yani her iki ikramiye için giderseniz -20% alırsınız.


İlk başta "bir hamle girin" diyorsunuz ve benim için "sadece 1 hamle" demek. Sonra "başlangıç ​​olarak" geri almak için bonus var: bu yüzden sadece bir değil, tam bir hamle serisi ... lütfen açıklayın
edc65

@ edc65 tam bir hamle serisidir. İlk satıra bakın "hamle yapılmasına izin ver". Belirtmediğim tek şey döngü için çıkış koşulu. Krallardan biri ele geçirildiğinde durmak bir fikir olabilir, ancak mevcut cevabın sonsuz bir döngü var, bu özellik altında yazılı olarak kabul edilebilir, bu yüzden bırakacağım.
Level River St

Siyah karelerdeki iki şövalyenin biçimlendirmesi uyuşmuyor. Hangisi doğru?
JWT

@JWT vay, daha önce kimse fark etmedi! Bu aşamada ikisini de kabul etmek zorundayım. Cevabınızı biraz daha golf oynadığınızı görüyorum. Cevabınızı test etmeden ve kabulü değiştirmeden önce bitirdiniz mi?
Level River St

@ steveverril Bitirdim, evet.
JWT

Yanıtlar:


4

Oktav, 776688 bayt

688:

  • ana döngüye yerleştirilmiş fonksiyonlar (her ikisi de sadece bir kez kullanıldı),
  • {'foo','bar'}{i}biraz daha uzun yerine kullanılan hücre gösterimi['foo';'bar'](i,:)

Hala hiçbir bonus uygulanmadı.


ICCF sistemini kullanır.

Taşıma açıklamasında önde gelen boşluklar olmayabilir ve kaynak ve hedef alanın tek bir boşlukla ayrılması gerekir; bu nedenle 42 44, doğru 42 44ve doğru 42 44değildir.

R=@repmat;s=[t='BFJbRJFB';R(('@    A')',1,8);t+1]';while 1q=' ';c=R(':',42,74);m=R([m=R(q,5,9) l=m+26;l m],4,4);c(2:41,2:73)=m;for i=1:8 for j=1:8 f=s(i,j);z=@(c)bitand(+f,c);if z(64)b=z(1)+1;W={') (',')@('}{b};U=43-5*j;Z=9*i-2;T=Z-2:Z;Q=Z-3:Z+1;if z(2)c(U+3,Q)={'/___\','/@@@\'}{b};a=c(U+2,T)={'| |','|@|'}{b};if z(4)c(U+1,Q)='"- \~';c(U,Z-3:Z)=' _,,';else c(U+1,T)=a;if z(8)c(U,T)='(/)';elseif z(16)||z(32)c(U,T)=W;c(U-1,T)={'_+_','www'}{1+z(32)/32};else c(U,Q)='|_|_|';end
end
else c(U+2,Z-2:Z+1)={'/__\','/@@\'}{b};c(U:U+1,Z-1:Z)=['()';')('];end;end;end;end;c
m=input(q,'s')-'0';x=m(1);y=m(2);X=m(4);Y=m(5);if s(x,y)~=q&&(s(X,Y)==q||mod(s(x,y)-s(X,Y),2))s(X,Y)=s(x,y);s(x,y)=q;end
end

Biraz çözülmemiş versiyon:

# draw an empty chessboard
function n=cb
R=@repmat;
n=R(':',42,74);
m=R([m=R(' ',5,9) m+26;m+26 m],4,4);
n(2:41,2:73)=m;
end

# function n=put(n,f,c,r) :
#
# put a chessman f on column c and row r of chessboard n,
# returning new chessboard
# chessman is described by single character defined following way
# (please excuse naming bits by value rather than position):
# bit valued  127 -     unused
# bit valued  64  -     0 = field empty, 64 = field occupied.
# bits valued 32,16,8 - 0 = rook, 8 = bishop, 16 = king, 32 = queen
# bit valued  4 -       0 = not knight 4 = knight (only checked if "other piece" bit is set)
# bit valued  2 -       0 = pawn       2 = other piece
# bit valued  1 -       0 = white      1 = black

# this gives the following chars:

# pawns   - 64      (+1)  => @ , A
# knights - 64+4+2  (+1)  => F , G
# rooks   - 64+2    (+1)  => B , C
# bishops - 64+8+2  (+1)  => J , K
# kings   - 64+16+2 (+1)  => R , S
# queens  - 64+32+2 (+1) =>  b , a
# empty space - any character with bit valued 64 unset (space char does)

function n=put(n,f,c,r)
z=@(n)bitand(f-0,n);
if z(64)
    b=z(1);
    W=') ()@('(1+3*b:3+3*b);
    R=5*r;C=9*c;
    if z(2)
            n(46-R,C-5:C-1)='/___\/@@@\'(1+5*b:5+5*b);
            a=n(45-R,C-4:C-2)='| ||@|'(1+3*b:3+3*b);
            if z(4) # knight
                    n(44-R,C-5:C-1)='"- \~';
                    n(43-R,C-5:C-2)=' _,,';
            else
                    n(44-R,C-4:C-2)=a;
                    if z(8) # bishop
                            n(43-R,C-4:C-2)='(/)';
                    elseif z(16) # king
                            n(43-R,C-4:C-2)=W;
                            n(42-R,C-4:C-2)='_+_';
                    elseif z(32) # queen
                            n(43-R,C-4:C-2)=W;
                            n(42-R,C-4:C-2)='www';
                    else  # rook
                            n(43-R,C-5:C-1)='|_|_|';
                    end
            end
    else
            n(45-R,C-4:C-1)='/  \/@@\'(1+4*b:4+4*b);
            n(43-R:44-R,C-3:C-2)=['()';')('];
    end
end
end

# here we can easily define the chessboard.
s=['BFJbRJFB';repmat(('@    A')',1,8);'CGKcSKGC']';
c=cb;for i=1:8 for j=1:8 c=put(c,s(i,j),i,j);end;end
c

# We scan five characters. They must be positions in ICCF without leading spaces separated by single space.
while m=input('','s')-'0'
x=m(1)
y=m(2)
X=m(4)
Y=m(5)
# if the move is not allowed (capture piece of the same color or the start field is blank,
# do nothing
if s(x,y)==' ' || (s(X,Y) ~=' ' && mod(s(x,y)-s(X,Y),2)==0) continue; end;
# make the move
s(X,Y)=s(x,y);
s(x,y)=' ';
# redraw the board
c=cb;for i=1:8 for j=1:8 c=put(c,s(i,j),i,j);
end end
c
end

Bunu ideone.com'da çalıştırdım ve panoyu gösterdim ancak herhangi bir girişi kabul edemedim. Tutorialspoint.com/codingground.htm adresinde harika çalışıyor (kral ve kraliçenin tersine çevrilmesi dışında - tecrübeli herhangi bir satranç oyuncusu size bir fark yarattığını söyleyecektir.) Bir dostun yakalanmasına izin vermediğiniz için size ekstra bir +1 verirdim. parça, ve eğer yapabilirsem iyi bir açıklama için bir tane daha.
Level River St

@steveverrill Gerçekten de, kral ve kraliçe pozisyonları tersine döndü, bunu işaret ettiğiniz için teşekkürler. Şimdi düzeltildi.
pawel.boczarski

5

Yakut, 715 696 693 683 bayt

Bu oldukça dağınık bir çözüm ama şu anda daha fazla temizlemek için sabrım yok.

İkisi de yapılmadı.

ICCF sistemini kullanır.

a,b,c=->f,x,y,p{p.map{|ln|ln.gsub(/\d/){|z|f*(z.to_i)}.tr('AB',x+y)}},Array.new(64){|i|((i%56<8?[4,2,3,5,6,3,2,4][i%56]:(i-8)%40<8?1:0)<<2)+(i<16?2:0)},':'*74
loop{puts c
b.each_slice(8).with_index{|r,y|d,*e=r.map.with_index{|v,x|a[*([[' '],[':']][(x+y)%2]+[[' ','_'],['@','@']][v&2==2?1:0]+[('9@9@9@9@9;9@4()3@4)(3@3/BB\2@9;9@3_,,3@2"- \~2@3|A|3@2/BBB\2;9@3(/)3@3|A|3@3|A|3@2/BBB\2;9@2|_|_|2@3|A|3@3|A|3@2/BBB\2;3www3@3)A(3@3|A|3@3|A|3@2/BBB\2;3_+_3@3)A(3@3|A|3@3|A|3@2/BBB\2'.split(';').map{|s|s.split '@'})[v>>2]])]}
d.zip(*e).each{|r|puts ":#{r.join}:"}}
puts c
gets.scan(/(.)(.) (.)(.)/){|f,g,h,i|j,k=63+(f.to_i)-(g.to_i)*8,63+(h.to_i)-(i.to_i)*8
b[k],b[j]=b[j]>0?b[j]: b[k],0}}

Mükemmel, mükemmel çalışıyor gibi görünüyor!
Level River St

@LevelRiverSt Bu cevap şu anda kabul edilen yanıttan daha kısa görünüyor.
Outgolfer Erik

3

Python, 1136 890 753 bayt

Kısmi cevap için özür dilerim ama ben bir acemiyim ve bu zorluğun tadını çıkardım. Muhtemelen çok ayrıntılı olduğunu biliyorum ama işte benim kaba taslağım:

y=':'*9
z=' '*9
b='::/___\::'
c=':::|@|:::'
d=':::)@(:::'

ps = {'r': [y,'::|*|*|::', c, c,b],'n': [y,':::,,::::', '::"- \~::', c,b],'b': [y,':::(/):::',c,c,b],'k': [':::www:::',d,c,c,b],'q': [':::*+*:::',d,c,c,b],'p': [y, '::::():::','::::)(:::',':::/__\::',y]}

def cell(p,c):
  if p == '!':
    return ([z]*5,[y]*5)[c]
  s = []
  for l in ps[p.lower()]:
    l = (l.replace('@', ' '), l.replace('_', '@'))[p.islower()]
    l = (l.replace(':', ' '), l)[c].replace('*', '_')
    s.append(l)
  return s


b = {8:'rnbkqbnr',7:'p'*8,2:'P'*8}
b[1] = b[8].upper()
for i in range(3,7):
  b[i] = '!'*8

o=[y*8]
c=0
for r in b:
  l=['']*5
  for p in b[r]:
    cc=cell(p,c)
    for i in range(0,5):
      l[i]+=cc[i]
    c=not c
  o.extend(l)
  c=not c
o.append(o[0])
for l in o:
  print ':'+l+':'

Cevap için teşekkürler. Dil ve bayt sayısı ile cevaplara bir başlık satırı eklemek bizim gelenekimizdir. Bu hangi dil? Python gibi görünüyor ama ideone.com üzerinde çalıştırmak için alamadım
Level River St

1
Etrafındaki tüm boşlukları kaldırın =ve eğer bir forveya ifsadece içinde bir çizgi varsa, hepsi aynı çizgide olabilir. Python'da İpuçları Golf için bir göz atın .
mbomb007
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.