パソコン甲子園(2011年予選問題第2問)

前回に引き続いてパソコン甲子園(2011年予選問題第2問)を解いてみます。
入力データ
複数のデータセットの並びが入力として与えられます。入力の終わりはゼロひとつの行で示されます。各データセットは以下のとおりです。
1 行目 お菓子の数 n(整数)
2 行目 第 1 のお菓子の情報 i p q r(整数 整数 整数 整数;半角空白区切り)
3 行目 第 2 のお菓子の情報

n+1 番目 第 n のお菓子の情報
n+2 番目 各栄養素及びカロリーの制限値 P Q R C(整数 整数 整数 整数;半角空白区切り)

出力
入力データセットごとに、食べてもよいお菓子の番号または”NA”を出力します。

※問題の詳細は下記から見てください。
パソコン甲子園

以下ソース

# 2.awk
# usage : gawk -f 2.awk 2.txt
#

{
	if($0 == 0){
		exit;
	}
	if(set == 0){
		n   = $0;	# お菓子の数
		set = 1;
		num = 0;
		ans = 0;
	}else if(set == 1){
		if(n > 0){	# お菓子がまだ残っているなら
			i[num] = $1;		# お菓子の番号
			p[num] = $2;		# たんぱく質の重量
			q[num] = $3;		# 脂質の重量
			r[num] = $4;		# 炭水化物の重量
			c[num] = p[num] * 4 + q[num] * 4 + r[num] * 9;
			n--;		# お菓子の数を減らす
			num++;
		}else{		# お菓子が残っていないなら
			max_p = $1;
			max_q = $2;
			max_r = $3;
			max_c = $4;
			for(x = 0;x < num;x++){
				if((p[x] < max_p) && (q[x] < max_q) && (r[x] <max_r) && (c[num] < max_c)){
					    print i[x];
					    ans = 1;
				}
			}
			if(ans == 0){
				    print "NA";
			}
			set = 0;
			num = 0;
			ans = 0;
		}
	}
}

入力データ


4
1 7 14 47
2 5 35 55
3 6 3 59
4 6 5 15
10 15 50 400
2
1 8 10 78
2 4 18 33
10 10 50 300
0


実行してみる


gawk -f 2.awk 2.txt
1
4
NA
無事に動いている