Project Euler 244

by uwi
@see http://projecteuler.net/index.php?section=problems&id=244
♥0 | Line 86 | Modified 2010-05-29 22:01:32 | MIT License
play

ActionScript3 source code

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

package {
	import flash.display.Sprite;
	import flash.text.TextField;
	import flash.utils.getTimer; 
	// @see http://projecteuler.net/index.php?section=problems&id=244
	public class Euler244 extends Sprite {
		private var _tf : TextField;
  
		public function Euler244() {
			_tf = new TextField();
			_tf.width = 465;
			_tf.height = 465;
			addChild(_tf);
			
			var s : int = getTimer();
			tr(solve());
			var g : int = getTimer();
			tr((g - s) + " ms");
		}

		private var NEXTS : Array = [
			[1, 4],
			[0, 2, 5],
			[1, 3, 6],
			[2, 7],
			[0, 5, 8],
			[1, 4, 6, 9],
			[2, 5, 7, 10],
			[3, 6, 11],
			[4, 9, 12],
			[5, 8, 10, 13],
			[6, 9, 11, 14],
			[7, 10, 15],
			[8, 13],
			[9, 12, 14],
			[10, 13, 15],
			[11, 14]
			];
			
		// 状態数が2^16*16程度なので普通にWFS
		// red,white:0, blue:1
		private function solve() : Number
		{
			var ASCII : Array = [];
			ASCII[-1] = 82;
			ASCII[1] = 76;
			ASCII[-4] = 68;
			ASCII[4] = 85;
			
			var state : Vector.<uint> = new Vector.<uint>((1 << 16) * 16);
			var queue : Vector.<uint> = new Vector.<uint>();
			state[0 << 16 | 0x3333] = 0;
			queue.push(0 << 16 | 0x3333);
			for(var step : uint = 0;step < 40 && !state[0x5a5a] && queue.length > 0;step++){
//				var next : Vector.<uint> = new Vector.<uint>();
				var next : Object = {};
				for each(var ind : uint in queue){
					var dir : int = (ind >> 20) - 4;
					ind &= 0xfffff;
					var s : uint = state[ind];
					var pos : uint = ind >> 16;
					for each(var p : uint in NEXTS[pos]){
						var c : uint = code(ind, pos, p);
						if(state[c] || c == 0x3333)continue;
						if(!next[c])next[c] = 0;
						next[c] += s * 243 + ASCII[p - pos];
						next[c] %= 100000007;
					}
				}
				
				queue = new Vector.<uint>();
				for(var key : String in next){
					queue.push(uint(key));
					state[uint(key)] = next[key];
				}
//					queue = next;
				tr(queue.length);
			}
			
			return state[0x5a5a];
		}
		
		private function code(s : uint, from : uint, to : uint) : uint
		{
			var f : uint = (s >> (15 - from)) & 1;
			var t : uint = (s >> (15 - to)) & 1;
			if(f != t){
				return to << 16 | ((s & 0xffff) ^ (1 << (15 - from)) ^ (1 << (15 - to)));
			}else{
				return to << 16 | (s & 0xffff);
			}
		}

		private function tr(...o : Array) : void
		{
			_tf.appendText(o + "\n");
			_tf.scrollV = _tf.maxScrollV;
		}
	}
}