C、827 799 522
ゴルフ:
#define N for(
#define F(W,X,Y,Z) N i= W;i X Y;i Z)
#define C(A,B,C) if(c[A][B]==C)
#define S(W,X,Y,Z,A,B) p=1;F(W,X,Y,Z)C(A,B,120)p=0;if(p){F(W,X,Y,Z){C(A,B,46){c[A][B]='x';z++;Q();break;}}}else{F(W,X,Y,Z){C(A,B,120)break;else c[A][B]='o';}}
p,m,z,w,h,o,i,u,l,x,y;char c[16][16];Q(){N u=0;u<h;u++)N l=0;l<w;l++)if(c[u][l]=='o'){x=u;y=l;S(x,>,m,--,i,y)S(y,>,m,--,x,i)S(y,<,w,++,x,i)S(x,<,h,++,i,y)}}main(int a, char **v){h=atoi(v[1]);w=atoi(v[2]);N m=-1;o<h;o++)N i=0;i<w;i++)scanf("%c",&c[o][i]);Q();printf("%d",z);}
入力は高さとコマンドライン引数として与えられ、グリッドは次のように標準./a.out 6 7 < input
入力で単一の文字列として読み込まれます:入力はこの形式(左から右、上から下)にあります:
x..xxxxx..x--xx.xx--xx.ooo-.x.ooo-.xxxxxxx
「読み取り可能」:
#define F(W,X,Y,Z) for(i= W;i X Y;i Z)
#define C(A,B,C) if(c[A][B]==C)
#define S(W,X,Y,Z,A,B) p=1;F(W,X,Y,Z)C(A,B,120)p=0;if(p){F(W,X,Y,Z){C(A,B,46){c[A][B]='x';z++;Q();break;}}}else{F(W,X,Y,Z){C(A,B,120)break;else c[A][B]='o';}}
/*Example of an expanded "S" macro:
p=1;
for(i=x;i>m;i--) if(c[i][y]==120) p=0;
if(p)
{
for(i=x;i>m;i--)
{
if(c[i][y]==46)
{
c[i][y]='x';
z++;
Q();
break;
}
}
}
else
{
for(i= x;i > m;i --)
{
if(c[i][y]==120) break;
else c[i][y]='o';
}
}
*/
p,m,z,w,h,o,i,u,l,x,y;
char c[16][16];
Q(){
for(u=0;u<h;u++)
for(l=0;l<w;l++)
if(c[u][l]=='o')
{
x=u;y=l;
S(x,>,m,--,i,y)
S(y,>,m,--,x,i)
S(y,<,w,++,x,i)
S(x,<,h,++,i,y)
}
}
main(int a, char **v)
{
h=atoi(v[1]);
w=atoi(v[2]);
for(m=-1;o<h;o++)
for(i=0;i<w;i++)
scanf("%c",&c[o][i]);
P();
Q();
printf("%d\n",z);
P();
}
//Omitted in golfed version, prints the map.
P()
{
for(o=0;o<h;o++)
{
for (i=0;i<w;i++) printf("%c",c[o][i]);
printf("\n");
}
}
@Claudiuによるソリューションほど短いものではありませんが、非常に高速に実行されます。端からあふれるのではなく、野営地を見つけ、「o」トークンから外側に向かって働きます。
- 野営地の隣の不安定な地面に遭遇すると、野営地をその上に拡大します。
- グリッド上の陣営に各方向に少なくとも1つの壁がない場合、壁を構築できるまでその方向に移動します。
- 新しい壁セクションが配置されるたびに、次の壁セクションを見つけるために再帰します。
サンプル壁の配置:
x..xxxx x..xxxx
x..x--x x..xoox
x.xx--x x3xxoox
x.ooo-. <-- results in this --> xooooo1
x.ooo-. xooooo2
xxxxxxx xxxxxxx