Project Euler #019

by hycro forked from Project Euler #018 (diff: 70)
♥0 | Line 68 | Modified 2010-03-08 23:09:48 | MIT License
play

ActionScript3 source code

/**
 * Copyright hycro ( http://wonderfl.net/user/hycro )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/DEk2
 */

// forked from hycro's Project Euler #018
package {
	import flash.display.Sprite;
	import flash.text.TextField;
	
	public class ProjectEuler extends Sprite {
		private var _textField:TextField;
		
		public function ProjectEuler() {
			initialize();
			writeAnswer(new Problem019);
		}
		
		private function writeAnswer(problem:AbstractProblem):void {
			var answer:String = problem.getAnswer();
			_textField.appendText(answer);
		}
		
		private function initialize():void {
			_textField = new TextField();
			_textField.width = stage.stageWidth;
			_textField.height = stage.stageHeight;
			addChild(_textField);
			_textField.wordWrap = true;
		}
	}
}

class AbstractProblem {
	final public function getAnswer():String {
		var answer:String;
		try {
			answer = solve().toString();
		} catch (err:Error) {
			answer = err.getStackTrace();
		}
		return answer;
	}
	
	protected function solve():Number {
		throw new Error("unsolved");
	}
}

// べっ、別に解けなかった訳じゃないんだからねっ!
class Problem019 extends AbstractProblem {
	override protected function solve() : Number {
		var answer:Number = 0;
		
		var year:uint = 1901;
		var month:uint = 1;
		var totalDays:uint = 1;
		
		while (year < 2001) {
			if (totalDays % 7 == 6) {
				answer++;
			}
			totalDays += getDaysOfMonth(year, month);
			month = month < 12 ? month + 1 : (year++, 1);
		}
		
		return answer;
	}
	
	// 日数を取得
	private function getDaysOfMonth(year:uint, month:uint):uint {
		switch (month) {
			case 2:
				return isLeap(year) ? 29 : 28;
			case 4:
			case 6:
			case 9:
			case 11:
				return 30;
			default:
				return 31;
		}
	}
	
	// システムが year を閏年として認識しているかどうか
	private function isLeap(year:uint):Boolean {
		return !(year % 4) && (year % 100) || !(year % 400);
	}
}