カックロを作るときの話なんですが、最初から全部の数字を入れては作りません。こんな感じ。
破綻しやすいのであまりお勧めしませんが、まあこういう作り方をしたとして、こんな感じにしてくれる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_"をつけたもの。
です。作成意図により、途中まででも埋まるところだけ埋めてくれます。
こんな感じ。
適当に作った問題で恐縮ですが、カンペンで解きたい方はこちらから。