PencilBoxが好きだ

カックロを作るときの話なんですが、最初から全部の数字を入れては作りません。こんな感じ。

破綻しやすいのであまりお勧めしませんが、まあこういう作り方をしたとして、こんな感じにしてくれる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_"をつけたもの。

です。作成意図により、途中まででも埋まるところだけ埋めてくれます。
こんな感じ。



適当に作った問題で恐縮ですが、カンペンで解きたい方はこちらから。

http://www.kanpen.net/kakuro.html?problem=9/9/0_0_0_0/0_1_0_17/0_2_0_42/0_3_0_0/0_4_0_35/0_5_0_16/0_6_0_30/0_7_0_0/0_8_0_0/1_0_16_0/1_3_24_17/1_7_0_42/1_8_0_0/2_0_42_0/2_8_0_24/3_0_0_0/3_1_24_6/3_5_24_34/4_0_10_0/4_3_34_14/5_0_32_0/5_6_17_10/6_0_6_0/6_4_23_11/6_8_0_4/7_0_0_0/7_1_29_0/8_0_0_0/8_1_0_0/8_2_10_0/8_6_11_0/