#include <stdio.h>
char *k=" \0歩\0香\0桂\0銀\0金\0角\0飛\0王",d[81]={2,3,4,5,8,5,4,3,2,0,7},h[64 \
],b[9],a=32,c=16,t,i,j,u,m,v,w,s,*p;int C(){m=*(p=d+i);u=d[j];if(j==i||m&&m<<5==
u<<5||(u&a)==t)return 0;m=j-i;m*=-t/c+1;s=u%a;v=7<m&m<11;w=m==1|m==-1;if(s<2&m==
9|s==3&(m==19|m==17)|s==4&(v|m==-8|m==-10)|(s&8|21<s)&(v|w|-7<m&m<-11)|(s==5|c<s
&s<22)&(v|w|m==-9))goto l;v=j;do v+=s%c==6&(m%8==0|m%10==0)?(b[2]>*b?1:-1)+(b[3]
>b[1]?9:-9):s%c==7?m%9?j>i?-1:1:j>i?-9:9:m&&s==2&m%9==0?t?9:-9:1;while(v!=i&!d[ \
v]);if(v==i)goto l;return 0;l:for(m=a-t;m<64-t;m++)if(!h[m]){h[m]=*p%c;break;}d
[j]=0;*p=u;if(s<8&(t&&j>53&i<54||!t&&i<27&j>26)){puts("成る?y/n");for(m=0;m!=' \
y'&m!='n';scanf("%c",&m));if(m=='y')*p+=c;}return 1;}void main(){d[c]=6;for(i=18
;i<27;)d[i++]=1;for(i=0;i<28;)d[80-i++]=d[i]+(d[i]?a:0);for(;;){p=d;for(i=0;i<81
;){u=*p++;j=u%c;m=(u&c)>>4;u>>=5;if(!j)u=2;printf("|%c%s%c",m?43:a,k+j*3,u>1?a:!
u?94:95);if(i++%9==8)puts("|\n");}puts("先手");for(i=63;i+1;){if(h[i])printf("% \
s",k+h[i]*3);if(i--==a)puts("\n後手");}printf("\n%s手入力\n",t?"後":"先");for(i=
0;i<64;)if(h[i++]&8){printf("%s手の勝利",i<a?"後":"先");return;}l:scanf("%4s",b)
;for(i=0;i<4;)b[i++]-=49;b[2]=8-b[2];i=b[2]+b[3]*9;if(*b==63){j=b[1]+1;if(i>81||
d[i])goto l;if(j==1)for(u=i%9;u<81;)if(d[u+=9]==1+t)goto l;for(u=a-t;u<64-t;u++)
if(h[u]==j){h[u]=0;t=a-t;d[i]=j+t;}}else{*b=8-*b;j=*b+b[1]*9;t=C()?a-t:t;}}}

18行。うぉぉちぢまらねぇ!