カックロを作るときの話なんですが、最初から全部の数字を入れては作りません。こんな感じ。
破綻しやすいのであまりお勧めしませんが、まあこういう作り方をしたとして、こんな感じにしてくれるawkスクリプトを以下にあげます。
BEGIN{
j=0;
knum = 0;
}
{
if(NR==1){
tatemax = $0;
#ファイル名の処理 初回だけ
f_name = "a_" FILENAME;
}
if(NR==2){
yokomax = $0;
}
if(NF==4){
if($3+$4 == 0){
data[$1*yokomax+$2] = "kr";
}else if($3 == 0){
data[$1*yokomax+$2] = "ky";
}else if($4 == 0){
data[$1*yokomax+$2] = "kt";
}else{
data[$1*yokomax+$2] = "kn";
}
kdata[knum] = $0;
knum++;
}
if(NF>5){
for(i=0;i<yokomax;i++){
if(data[j*yokomax+i] !~ /^k/){
if($(i+1) == "."){
data[j*yokomax+i] = "kh";
}else{
data[j*yokomax+i] = $(i+1);
}
}
}
j++;
}
}
END{
printf("%d\n%d\n",tatemax,yokomax) > f_name;
for(i=0;i<knum;i++){
split(kdata[i],temp," ");
tate = 0;
yoko = 0;
if(temp[4] == 0){
for(j=temp[1]+1;j<tatemax+1;j++){
if(data[(j*yokomax+temp[2])] ~/^k/){
if(data[(j*yokomax+temp[2])]=="kh"){
tate = 0;
}
break;
}
tate += data[(j*yokomax+temp[2])];
}
temp[4] = tate;
}
if(temp[3] == 0){
for(j=temp[2]+1;j<yokomax+1;j++){
if(data[(yokomax*temp[1]+j)] ~/^k/){
if(data[(yokomax*temp[1]+j)]=="kh"){
yoko = 0;
}
break;
}
yoko += data[(yokomax*temp[1]+j)];
}
temp[3] = yoko;
}
printf("%d %d %d %d\n",temp[1],temp[2],temp[3],temp[4]) > f_name;
}
printf("\n") > f_name;
for(i=0;i<tatemax*yokomax;i++){
if(data[i] !~ /^k/){
printf data[i] " " > f_name;
}else{
printf ". " > f_name;
}
if(i%yokomax == yokomax-1){
printf "\n" > f_name;
}
}
}入力はPencilBoxのテキスト形式ファイル。
出力はPencilBoxのテキスト形式ファイルで、入力ファイル名の先頭に"a_"をつけたもの。
です。作成意図により、途中まででも埋まるところだけ埋めてくれます。
こんな感じ。
適当に作った問題で恐縮ですが、カンペンで解きたい方はこちらから。



