กระดานหมากรุกศิลปะ ASCII


12

ในการท้าทายนี้คุณต้องวาดกระดานหมากรุกด้านล่างและอนุญาตให้มีการเคลื่อนไหว

1. การวาดภาพ

สี่เหลี่ยมสีขาวแต่ละอันมีช่องว่าง 5x9

สี่เหลี่ยมจัตุรัสสีดำแต่ละอันมี 5x9 colons

กระดานล้อมรอบด้วยเส้นขอบของทวิภาค

ชิ้นส่วนมีความกว้าง 5 ตัวอักษรและนั่งที่แถวด้านล่างของจัตุรัสตรงกลาง

เบี้ยมีความกว้าง 4 ตัวอักษร พวกเขานั่งตรงกลางด้านขวาเล็กน้อยโดยมีช่องว่าง 3 ช่องทางด้านซ้ายและช่องว่าง 2 ช่องทางด้านขวา พวกเขานั่งหนึ่งบรรทัดเหนือด้านล่างของจัตุรัส

จะต้องไม่มีช่องว่างด้านนอกพื้นที่ของคณะกรรมการยกเว้นการขึ้นบรรทัดใหม่ที่เป็นตัวเลือก

กระดานและหมากรุกจะถูกวาดตามที่แสดงยกเว้นว่า:

  1. คุณอาจยอมให้:ช่องสี่เหลี่ยมสีดำและเส้นขอบเป็นสัญลักษณ์ที่แตกต่างกันและคุณอาจแทนที่ส่วนที่@เป็นสีดำเป็นสัญลักษณ์อื่น (แต่ไม่ใช่แบบเดียวกับที่ใช้สำหรับสี่เหลี่ยมสีดำ)

  2. คุณสามารถย้ายเบี้ยหนึ่งตัวไปทางซ้ายหากคุณต้องการ

.

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

2. การเคลื่อนย้าย

คอลัมน์มีชื่อ AH จากซ้ายไปขวาและ 1 ถึง 8 จากล่างขึ้นบน ผู้ใช้จะสามารถป้อนการย้ายในแบบฟอร์มต่อไปนี้:

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

ยกตัวอย่างเช่นB1 C3ย้ายอัศวินไปที่จตุรัสหน้าโรงรับจำนำของบิชอป (สมมติว่าเกมเพิ่งเริ่มต้น)

อีกวิธีหนึ่งคือระบบ ICCF สามารถนำมาใช้ซึ่งในคอลัมน์ที่มีความโดดเด่น 1-8 21 33แทนที่จะเป็นเอชจึงย้ายอัศวินดังกล่าวข้างต้นจะกลายเป็น

อิมเมจ ( แหล่งที่มา ) ต่อไปนี้อธิบายระบบทั้งสอง:

ป้อนคำอธิบายรูปภาพที่นี่

การย้ายจะดำเนินการและบอร์ดใหม่จะปรากฏขึ้น การจับกุมที่เกิดขึ้นใด ๆ จะเกิดขึ้นกับผู้เคลื่อนย้ายผู้เคลื่อนย้ายผู้เคลื่อนย้ายผู้เล่นหมากรุกที่จัตุรัสปลายทางออกจากกระดาน

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

ไม่จำเป็นต้องมีการสนับสนุน en passant หรือ castling

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

3. เกณฑ์การให้คะแนนและโบนัส

นี่คือรหัสกอล์ฟ รหัสที่สั้นที่สุดชนะ

โบนัส -10% หากโปรแกรมหรือฟังก์ชั่นของคุณอนุญาตให้มีการโปรโมต ผู้ใช้ป้อนอินพุตที่สามเวลานี้หนึ่งในตัวอักษรต่อไปนี้: QBR N ซึ่งควรได้รับอนุญาตเฉพาะเมื่อการย้ายลงท้ายด้วยเบี้ยบนแถวสุดท้าย เบี้ยจะถูกแลกเปลี่ยนสำหรับชิ้นส่วนที่มีชื่อ QBRN

โบนัส -10% ถ้าโปรแกรมหรือฟังก์ชั่นของคุณใช้การย้าย "ยกเลิก" พิเศษสำหรับการพลิกกลับของการเคลื่อนไหว (เท่าที่ย้อนกลับไปถึงจุดเริ่มต้นของเกมถ้าจำเป็น) เห็นได้ชัดว่าเป็นไปได้สำหรับผู้เล่นมือสมัครเล่นในการเคลื่อนไหวผิดกฎหมาย เพื่อเลิกทำ คุณสามารถกำหนดอินพุตที่ผู้ใช้ต้องให้สำหรับการย้าย "เลิกทำ" นี้ (จะต้องเหมือนกันเสมอ) พฤติกรรมไม่ได้กำหนดไว้หากผู้ใช้พยายามที่จะเลิกทำหลังจากเริ่มเกม

ผลรวมโบนัสคือถ้าคุณไปสำหรับโบนัสทั้งสองคุณจะได้รับ -20%


ตอนแรกคุณพูดว่า "enter a move" และสำหรับฉันแล้วมันหมายถึง "เพียงแค่ 1 การเคลื่อนไหว" จากนั้นมีโบนัสสำหรับการยกเลิก "เท่าที่เริ่มต้น": ดังนั้นจึงเป็นเซเรียอาการเคลื่อนไหวที่สมบูรณ์ไม่ใช่แค่หนึ่ง ... โปรดอธิบาย
edc65

@ edc65 เป็นชุดการเคลื่อนไหวที่สมบูรณ์ ดูบรรทัดแรก "อนุญาตให้มีการเคลื่อนไหว" สิ่งหนึ่งที่ฉันไม่ได้ระบุคือเงื่อนไขการออกจากลูป มันอาจเป็นความคิดที่จะหยุดเมื่อหนึ่งในราชาถูกจับ แต่คำตอบที่มีอยู่นั้นมีวงวนไม่สิ้นสุดซึ่งเป็นที่ยอมรับภายใต้สเป็คที่เขียนดังนั้นฉันจะทิ้งมันไว้
เลเวลริเวอร์เซนต์

การจัดรูปแบบบนอัศวินสองตัวบนสี่เหลี่ยมสีดำไม่ตรงกัน อันไหนถูกต้อง?
JWT

@JWT ว้าวไม่มีใครสังเกตเห็นมาก่อน! ในขั้นตอนนี้ฉันจะต้องยอมรับทั้งคู่ ฉันเห็นว่าคุณเล่นกอล์ฟคำตอบของคุณอีกเล็กน้อย ก่อนที่ฉันจะทดสอบคำตอบของคุณและเปลี่ยนการตอบรับคุณเคยทำเสร็จหรือยัง?
เลเวลริเวอร์เซนต์

@ steveverril ฉันเสร็จแล้วใช่
JWT

คำตอบ:


4

Octave, 776 688 bytes

688:

  • ฟังก์ชั่นอินไลน์เข้าไปในวงหลัก (ทั้งสองถูกใช้เพียงครั้งเดียว)
  • สัญกรณ์ใช้แล้ว{'foo','bar'}{i}แทนอีกต่อไปเล็กน้อย['foo';'bar'](i,:)

ยังไม่มีโบนัสใช้งาน


ใช้ระบบ ICCF

อาจไม่มีช่องว่างนำหน้าในคำอธิบายการย้ายและเขตข้อมูลต้นทางและปลายทางต้องคั่นด้วยช่องว่างเดียวจึง42 44ถูกต้องในขณะที่ 42 44และ42 44ไม่อยู่

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

รุ่นที่ค่อนข้างไม่ได้รับการปรับแต่ง:

# 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

ฉันวิ่งบน ideone.com และแสดงบอร์ด แต่ไม่สามารถรับข้อมูลใด ๆ ได้ มันทำงานได้ดีที่tutorialspoint.com/codingground.htm (ยกเว้นคุณมีพระมหากษัตริย์และพระราชินีตรงกันข้าม - ผู้เล่นหมากรุกเก๋าจะบอกคุณมันทำให้ความแตกต่าง.) ฉันต้องการให้คุณเป็นพิเศษ +1 สำหรับการไม่อนุญาตให้จับเป็นมิตร ชิ้นและอีกหนึ่งสำหรับคำอธิบายที่เหมาะสมถ้าฉันสามารถ
เลเวลริเวอร์เซนต์

@ สตีฟเวอร์ริลล์แน่นอนว่าตำแหน่งของกษัตริย์และราชินีกลับกันแล้วขอบคุณที่ชี้ให้เห็น ตอนนี้ได้รับการแก้ไขแล้ว
pawel.boczarski

5

ทับทิม, 715 696 693 683 ไบต์

นี่เป็นวิธีที่ยุ่งเหยิงพอสมควร แต่ฉันไม่มีความอดทนในการทำความสะอาดเพิ่มเติมในขณะนี้

ไม่มีการทำโบนัส

ใช้ระบบ 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}}

ยอดเยี่ยมดูเหมือนว่าจะทำงานได้อย่างสมบูรณ์แบบ!
เลเวลริเวอร์เซนต์

@LevelRiverSt ดูเหมือนว่าคำตอบนี้จะสั้นกว่าคำตอบที่ยอมรับในปัจจุบัน
Erik the Outgolfer

3

Python 1136 890 753 ไบต์

ขอโทษสำหรับคำตอบบางส่วน แต่ฉันเป็นมือใหม่และฉันสนุกกับการท้าทายนี้มาก ฉันรู้ว่ามันอาจจะ verbose จริง ๆ แต่นี่คือร่างคร่าวๆของฉัน:

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

ขอบคุณสำหรับคำตอบ. มันเป็นประเพณีของเราที่จะรวมบรรทัดชื่อเรื่องในคำตอบด้วยภาษาและจำนวนไบต์ นี่คือภาษาอะไร? ดูเหมือนว่าไพ ธ อน แต่ฉันไม่สามารถเรียกใช้บน ideone.com
Level River St

1
ลบช่องว่างทั้งหมดรอบ ๆ=และหาก a forหรือมีifเพียงหนึ่งบรรทัดในนั้นก็สามารถไปในบรรทัดเดียวกัน ลองดูที่เคล็ดลับสำหรับการมีสนามเล่นกอล์ฟในหลาม
mbomb007
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.