Papan Catur Seni ASCII


12

Dalam tantangan ini, Anda harus menggambar papan catur di bawah ini, dan memungkinkan gerakan dilakukan.

1. Menggambar

Setiap kotak putih memiliki ruang 5x9.

Setiap kotak hitam memiliki 5x9 titik dua.

Papan dikelilingi oleh batas titik dua.

Potongannya adalah 5 karakter lebar dan duduk di baris bawah dari alun-alun di tengah.

Pion berukuran 4 karakter. Mereka duduk sedikit dari tengah ke kanan, dengan 3 kotak kosong di sebelah kiri dan 2 kotak kosong di sebelah kanan. Mereka duduk satu baris di atas bagian bawah alun-alun.

Tidak akan ada spasi putih di luar area board, dengan pengecualian dari trailing newline opsional.

Papan dan catur harus ditarik persis seperti yang ditunjukkan, kecuali bahwa:

  1. Anda dapat mengganti :dalam dalam kotak hitam dan perbatasan untuk simbol yang berbeda, dan Anda dapat mengganti @dalam keping hitam untuk simbol yang berbeda (tetapi tidak sama dengan yang digunakan untuk kotak hitam.)

  2. Anda dapat memindahkan bidak satu karakter ke kiri jika Anda mau.

.

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

2. Bergerak

Kolom diberi label AH dari kiri ke kanan dan 1 hingga 8 dari bawah ke atas. Pengguna harus dapat memasukkan langkah dalam bentuk berikut:

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

Misalnya B1 C3berarti memindahkan ksatria ke alun-alun di depan bidak uskup (dengan asumsi permainan baru saja dimulai).

Atau sistem ICCF dapat digunakan, di mana kolom diberi label 1 hingga 8 bukan A ke H. Jadi, gerakan ksatria yang disebutkan di atas menjadi 21 33.

Gambar ( sumber ) berikut menjelaskan kedua sistem:

masukkan deskripsi gambar di sini

Langkah ini akan dieksekusi dan papan baru ditampilkan. Setiap penangkapan yang dihasilkan harus terjadi dengan catur bergerak memindahkan catur di alun-alun tujuan dari papan.

Tidak perlu memeriksa kepindahan catur yang legal, seperti yang telah dicakup dalam tantangan lain: Program catur terkecil dan wasit Catur terkecil Jika pengguna mencoba untuk pindah dari kotak kosong, program atau fungsi Anda harus mengabaikan kepindahan tersebut. Jika pengguna mencoba mengambil bagian yang ramah, Anda bisa mengabaikan gerakan atau membiarkan bagian yang tidak bergerak ditangkap.

Tidak perlu mendukung en passant atau castling.

Anda dapat berasumsi bahwa input akan terbentuk dengan baik, yaitu selalu dalam format yang dijelaskan di atas. Surat akan selalu dalam kasus yang sama, Anda dapat memutuskan kasus apa itu.

3. Penilaian dan Bonus

Ini golf kode. Kode terpendek menang.

-10% bonus jika program atau fungsi Anda memungkinkan untuk promosi. Pengguna memasukkan input ketiga, kali ini salah satu dari surat-surat berikut: QBR N. Ini hanya boleh diizinkan jika langkah berakhir dengan pion di baris terakhir. Gadai ditukar dengan bagian yang disebutkan. QBRN.

-10% bonus jika program atau fungsi Anda menerapkan gerakan "undo" khusus untuk pembalikan gerakan (sejauh awal permainan jika diperlukan.) Jelas mungkin bagi pemain amatir untuk membuat gerakan ilegal, dan mereka mungkin berharap untuk membatalkannya. Anda dapat menentukan input yang harus diberikan pengguna untuk langkah "undo" ini (harus selalu sama.) Perilaku tidak terdefinisi jika pengguna mencoba untuk membatalkan di luar permulaan permainan.

Bonus jumlah, yaitu jika Anda memilih kedua bonus, Anda mendapat -20%.


Pada awalnya Anda mengatakan "masukkan langkah", dan bagi saya itu berarti "hanya 1 langkah". Lalu ada bonus untuk undo "sejauh awal": jadi ini adalah rangkaian lengkap langkah, bukan hanya satu ... mohon klarifikasi
edc65

@ edc65 ini adalah serangkaian gerakan lengkap. Lihat baris pertama "izinkan gerakan dibuat." Satu hal yang saya tidak tentukan adalah kondisi keluar untuk loop. Mungkin ide untuk berhenti ketika salah satu raja ditangkap, tetapi jawaban yang ada memiliki loop tak terbatas, yang dapat diterima di bawah spesifikasi sebagaimana ditulis, jadi saya akan meninggalkannya.
Level River St

Format pada dua ksatria di kotak hitam tidak cocok. Yang mana yang benar?
JWT

@ JWT wow, tidak ada yang memperhatikan sebelumnya! Pada tahap ini saya harus menerima keduanya. Saya melihat Anda telah golf jawaban Anda sedikit lebih. Sebelum saya menguji jawaban Anda dan mengubah penerimaan, sudahkah Anda selesai?
Level River St

@ steveverril saya sudah selesai, ya.
JWT

Jawaban:


4

Oktaf, 776 688 byte

688:

  • fungsi yang diuraikan ke dalam loop utama (keduanya hanya digunakan sekali),
  • notasi sel bekas {'foo','bar'}{i}agak lebih lama['foo';'bar'](i,:)

Masih belum ada bonus yang diterapkan.


Menggunakan sistem ICCF.

Mungkin tidak ada spasi utama dalam deskripsi langkah dan bidang sumber dan tujuan harus dipisahkan oleh spasi putih, sehingga 42 44benar, sementara 42 44dan 42 44tidak.

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

Versi agak janggal:

# 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

Saya menjalankan ini di ideone.com dan menampilkan papannya tetapi tidak dapat menerima masukan apa pun. Ini bekerja sangat baik di tutorialspoint.com/codingground.htm (kecuali Anda memiliki raja dan ratu terbalik - setiap pemain catur musiman akan memberi tahu Anda itu membuat perbedaan.) Saya akan memberi Anda +1 ekstra untuk tidak mengizinkan penangkapan persahabatan sepotong, dan satu lagi untuk penjelasan yang layak, jika aku bisa.
Level River St

@steveverrill Memang, posisi raja dan ratu dibalik, terima kasih telah menunjukkan ini. Sudah diperbaiki sekarang.
pawel.boczarski

5

Rubi, 715 696 693 683 byte

Ini adalah solusi yang cukup berantakan tetapi saya tidak memiliki kesabaran untuk membersihkannya lebih jauh saat ini.

Tidak ada bonus yang dilakukan.

Menggunakan sistem ICCF.

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

Luar biasa, tampaknya bekerja dengan sempurna!
Level River St

@LevelRiverSt Sepertinya jawaban ini lebih pendek dari yang diterima saat ini.
Erik the Outgolfer

3

Python, 1136 890 753 byte

Permintaan maaf untuk jawaban parsial tapi saya seorang pemula dan saya sangat menikmati tantangan ini. Saya tahu itu mungkin benar-benar bertele-tele, tapi inilah konsep kasar saya:

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+':'

Terima kasih atas jawabannya. Sudah menjadi kebiasaan kami untuk menyertakan baris judul pada jawaban, dengan jumlah bahasa dan byte. Bahasa apa ini? Sepertinya python tapi saya tidak bisa menjalankannya di ideone.com
Level River St

1
Hapus semua spasi di sekitar =, dan jika a foratau ifhanya memiliki satu baris di dalamnya, semuanya bisa pergi pada baris yang sama. Lihatlah Tips untuk Bermain Golf dengan Python .
mbomb007
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.