Project Euler #018

by hycro forked from Project Euler #017 (diff: 126)
♥0 | Line 88 | Modified 2010-03-07 16:02:34 | 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/c2bm
 */

// forked from hycro's Project Euler #017
package {
	import flash.display.Sprite;
	import flash.text.TextField;
	
	public class ProjectEuler extends Sprite {
		private var _textField:TextField;
		
		public function ProjectEuler() {
			initialize();
			writeAnswer(new Problem018);
		}
		
		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;
		}
	}
}

// スペルが間違っていたでござるの巻 orz (Abstruct => Abstract に修正)
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 Problem018 extends AbstractProblem
{
	override protected function solve() : Number {
		var answer:Number;
		
		var data:Array = [
		"75",
		"95 64",
		"17 47 82",
		"18 35 87 10",
		"20 04 82 47 65",
		"19 01 23 75 03 34",
		"88 02 77 73 07 63 67",
		"99 65 04 28 06 16 70 92",
		"41 41 26 56 83 40 80 70 33",
		"41 48 72 33 47 32 37 16 94 29",
		"53 71 44 65 25 43 91 52 97 51 14",
		"70 11 33 28 77 73 17 78 39 68 17 57",
		"91 71 52 38 17 14 91 43 58 50 27 29 48",
		"63 66 04 68 89 53 67 30 73 16 69 87 40 31",
		"04 62 98 27 23 09 70 98 73 93 38 53 60 04 23"];
		
		var nodes:Vector.<Vector.<Node>> = new Vector.<Vector.<Node>>(data.length);
		
		// ノード生成
		for (var i:int = data.length-1; i >= 0; i--) {
			var rowData:Array = String(data[i]).split(" ");
			var rowNodes:Vector.<Node> = new Vector.<Node>();
			for (var j:int = 0; j < rowData.length; j++) {
				if (i != data.length - 1) {
					rowNodes[j] = new Node(parseInt(rowData[j]), nodes[i+1][j], nodes[i+1][j+1]);
				} else {
					rowNodes[j] = new Node(parseInt(rowData[j]));
				}
			}
			nodes[i] = rowNodes;
		}
		
		// 下から2番目の層から順に上位層へ
		for (var depth:int = nodes.length-2; depth >= 0; depth--) {
			// 現在の層の各ノードについて、下位の層のノードのうち値の大きい方を自分自身に加算する
			for each (var node:Node in nodes[depth]) {
				node.value += Math.max(node.left.value, node.right.value);
			}
		}
		
		answer = nodes[0][0].value;
		
		return answer;
	}
}

class Node {
	public var value:uint;
	public var left:Node;
	public var right:Node;
	
	public function Node(value:uint, left:Node=null, right:Node=null) {
		this.value = value;
		this.left = left;
		this.right = right;
	}
}

Forked