プログラミングを上達させたい

プログラミングの勉強を始めた、情報学専攻の大学院生です。モチベーション維持のため、ブログに勉強したことを書いていきます。→就職。IT全然関係ない仕事をしています

PascalでAtCoderBeginnerContest006のB問題とC問題

さて。
帰省中なのもあり、移動中や家族がかまってくれないときなど、時間が結構あるので、モリモリ進めていきます。
継続的な勉強が苦手なので、出来るときに一気に進めとかないといけません。

今回は、前回の続きで、AtCoder Beginner Contest #006のB問題とC問題をやりました。
なぜこの回かというと、唯一D問題まで解けている回だからです。
せっかくだから最後までやりたいですもんね。
配列も使うので、勉強になりそうです。

はい。
まず、B問題から。


普通に?解きます。

program solve(inout, output);

var
	n, counter : Longint;
	a1, a2, a3, answer : Integer;

begin
	readln(n);
	if n < 3
	then answer := 0
	else 
	begin
		a1 := 0;
		a2 := 0;
		a3 := 1;
		for counter := 4 to n do begin
			answer := (a1 + a2 + a3) mod 10007;
			a1 := a2;
			a2 := a3;
			a3 := answer;		
		end;
		answer := a3;
	end;
 
	writeln(answer);
end.

ideoneでの動作確認もクリア。提出してみると、ACでした。ちなみに実行時間は63ms。
Schemeで解こうとして、制限時間に苦しめられた過去を考えると、速いもんです。いいぞ、Pascal。

ちなみに、前これを解いたときはSchemeだったので、関数型言語的な考えのもと解きました。
Pascalの練習も兼ねて、関数を作るバージョンでも解いてみました。こんな感じのコード。

program solveWithFunction(input, output);
 
function trib(first,second,third : Integer; now, goal : Longint): Integer;
begin
	if now = goal
	then trib := first
	else trib := trib(second,third,(first+second+third) mod 10007,now+1,goal)	
end;
 
var
	n : Longint;
 
begin
	readln(n);
	writeln(trib(0,0,1,1,n));
	
end.

これでももちろんACになりました。ただ、実行時間が111msと、上の手続き的な解法に比べて時間がかかってしまいました。
場合にもよるんでしょうが、やっぱり手続き的に解いた方がいいんですかね。



続いて、ABC006のC問題も解きました。
こちらも簡単ですね。コードはコチラ。

program solve(input, output);

var
	n, m : Longint;
	adult, old, baby : Longint;

begin

	read(n);
	readln(m);

	if ((m < 2 * n) or (n * 4 < m))
	then
	begin
		adult := -1;
		old := -1;
		baby := -1;	
	end
	else
	begin
		if m <= 3 * n 
		then
		begin
			old := m - 2 * n;
			adult := 3 * n - m;
			baby := 0;
		end
		else
		begin
			baby := m - 3 * n;
			old := 4 * n - m;
			adult := 0;
		end
	end;

	writeln(adult,' ',old,' ',baby);
	
end.

注意点として、(当たり前かも知れませんが)"readln()"でやると、1つ要素を読んだ後、次の行に飛んでしまいます。
今回は2つの入力が同じ行で与えられるので、1つ目の入力は"read()"としなければなりません。ひっかかりました。

あと、elseのあとにbegin〜endを使うと、そこには;がいらないとか、どこまでが文でセットなのかを意識しないといけません。結構ややこしい。
また、Sublime Text 2のPascalモードで、対応するbeginとendをハイライトしてくれる機能があればいいのになーと思いました。自分でそれを追加できるほどの技術が欲しいところです・・・


さて、今回は以上です。
次のD問題も解いたら、まぁ今までJavaでやっていたことはあらかたPascalでも出来るようになった、と言えるんじゃないでしょうか。
頑張ってPascalとSchemeでやっていくぞ−!

広告を非表示にする