이 도전에서, 당신은 아래에 체스 판을 그리고 움직일 수 있도록해야합니다.
1. 그림
각 흰색 사각형에는 5×9 공백이 있습니다.
각 검은 사각형에는 5×9 콜론이 있습니다.
보드는 콜론의 경계로 둘러싸여 있습니다.
조각은 5 자 너비이며 중앙에있는 사각형의 맨 아래 줄에 있습니다.
폰의 너비는 4 자입니다. 왼쪽에서 3 개의 빈 사각형과 오른쪽에서 2 개의 빈 사각형으로 오른쪽 가운데에서 약간 떨어져 있습니다. 그들은 사각형의 바닥 위에 한 줄 위에 앉아 있습니다.
선택적인 후행 줄 바꿈을 제외하고 보드 영역 외부에는 공백이 없어야합니다.
보드와 체스 맨은 다음을 제외하고 그림과 같이 정확하게 그려야합니다.
-
당신은을 subsitute가 있습니다
:
다른 심볼에 대한 검은 색 사각형 및 테두리에, 당신은 대체 할 수 있습니다@
다른 심볼의 검은 조각을 (검은 색 사각형에 사용 된 것과 같은 일을하지만.) -
원하는 경우 폰을 한 문자 왼쪽으로 이동할 수 있습니다.
.
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
: ::::::::: :::www::: _+_ ::::::::: ::::::::::
: |_|_| :: _,,::: (/) :::)@(::: )@( :::(/)::: _,, ::|_|_|:::
: |@| ::"- \~:: |@| :::|@|::: |@| :::|@|::: "- \~ :::|@|::::
: |@| :::|@|::: |@| :::|@|::: |@| :::|@|::: |@| :::|@|::::
: /@@@\ ::/@@@\:: /@@@\ ::/@@@\:: /@@@\ ::/@@@\:: /@@@\ ::/@@@\:::
:::::::::: ::::::::: ::::::::: ::::::::: :
:::::()::: () ::::()::: () ::::()::: () ::::()::: () :
:::::)(::: )( ::::)(::: )( ::::)(::: )( ::::)(::: )( :
::::/@@\:: /@@\ :::/@@\:: /@@\ :::/@@\:: /@@\ :::/@@\:: /@@\ :
:::::::::: ::::::::: ::::::::: ::::::::: :
: ::::::::: ::::::::: ::::::::: ::::::::::
: ::::::::: ::::::::: ::::::::: ::::::::::
: ::::::::: ::::::::: ::::::::: ::::::::::
: ::::::::: ::::::::: ::::::::: ::::::::::
: ::::::::: ::::::::: ::::::::: ::::::::::
:::::::::: ::::::::: ::::::::: ::::::::: :
:::::::::: ::::::::: ::::::::: ::::::::: :
:::::::::: ::::::::: ::::::::: ::::::::: :
:::::::::: ::::::::: ::::::::: ::::::::: :
:::::::::: ::::::::: ::::::::: ::::::::: :
: ::::::::: ::::::::: ::::::::: ::::::::::
: ::::::::: ::::::::: ::::::::: ::::::::::
: ::::::::: ::::::::: ::::::::: ::::::::::
: ::::::::: ::::::::: ::::::::: ::::::::::
: ::::::::: ::::::::: ::::::::: ::::::::::
:::::::::: ::::::::: ::::::::: ::::::::: :
:::::::::: ::::::::: ::::::::: ::::::::: :
:::::::::: ::::::::: ::::::::: ::::::::: :
:::::::::: ::::::::: ::::::::: ::::::::: :
:::::::::: ::::::::: ::::::::: ::::::::: :
: ::::::::: ::::::::: ::::::::: ::::::::::
: () ::::()::: () ::::()::: () ::::()::: () ::::()::::
: )( ::::)(::: )( ::::)(::: )( ::::)(::: )( ::::)(::::
: /__\ :::/__\:: /__\ :::/__\:: /__\ :::/__\:: /__\ :::/__\:::
: ::::::::: ::::::::: ::::::::: ::::::::::
:::::::::: ::::::::: www :::_+_::: ::::::::: :
:::|_|_|:: _,, :::(/)::: ) ( :::) (::: (/) :::_,,::: |_|_| :
::::| |::: "- \~ :::| |::: | | :::| |::: | | ::"- \~:: | | :
::::| |::: | | :::| |::: | | :::| |::: | | :::| |::: | | :
:::/___\:: /___\ ::/___\:: /___\ ::/___\:: /___\ ::/___\:: /___\ :
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
2. 이사
열에는 왼쪽에서 오른쪽으로 AH, 아래쪽에서 위쪽으로 1-8이 표시됩니다. 사용자는 다음과 같은 형식으로 이동을 입력 할 수 있어야합니다.
<start column><start row><space><destination column><destination row>
예를 들어 B1 C3
, 나이트가 감독의 폰 앞 광장으로 기사를 옮기는 것을 의미합니다 (게임이 시작되었다고 가정).
또는 ICCF 시스템을 사용할 수 있는데, 여기서 A에서 H 대신에 1에서 8로 레이블이 붙습니다. 따라서 위에서 언급 한 기사 이동은 21 33
.
다음 이미지 ( source )는 두 시스템을 모두 나타냅니다.
이동이 실행되고 새로운 보드가 표시됩니다. 이동하는 체스 맨이 목적지 광장에서 체스 맨을 보드에서 제거하면 캡처 결과가 발생합니다.
: 그 다른 도전에 덮여있다으로 법적 체스 이동을 확인 할 필요가 없다 작은 체스 프로그램 과 작은 체스 중재자 사용자가 프로그램이나 기능은 움직임을 무시, 빈 광장에서 이동하려고합니다. 사용자가 친숙한 조각을 캡처하려고하면 이동을 무시하거나 고정 조각을 캡처 할 수 있습니다.
동반자 나 거세를지지 할 필요는 없습니다.
입력이 올바르게 구성되어 있다고 가정 할 수 있습니다. 즉 항상 위에서 설명한 형식으로되어 있습니다. 편지는 항상 같은 경우에, 어떤 경우인지 결정할 수 있습니다.
3. 점수 및 보너스
이것은 코드 골프입니다. 가장 짧은 코드가 승리합니다.
프로그램이나 기능이 프로모션을 허용하면 -10 % 보너스. 사용자는 세 번째 입력을 입력합니다. 이번에는 다음 문자 중 하나입니다. QBR N. 마지막 행에서 이동이 폰으로 끝나는 경우에만 허용됩니다. 폰은 명명 된 조각으로 교환됩니다. QBRN.
프로그램이나 기능이 이동을 취소하기 위해 특별한 “실행 취소”이동을 구현하는 경우 -10 % 보너스 (필요한 경우 게임 시작까지) 그들을 취소합니다. 사용자가이 “실행 취소”이동을 위해 입력해야하는 입력을 정의 할 수 있습니다 (항상 동일해야 함). 사용자가 게임 시작 이후에 취소를 시도하면 동작이 정의되지 않습니다.
보너스 합계, 즉 두 보너스를 모두 받으면 -20 %를 얻습니다.
답변
옥타브, 776 688 바이트
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
답변
루비, 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}}
답변
파이썬, 1136 890 753 바이트
부분 답변에 대한 사과하지만 나는 초보자이며 나는이 도전을 정말로 즐겼습니다. 아마 그것이 장황한 것 같지만 여기에 거친 초안이 있습니다.
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+':'