flash on 2010-4-4

by hycro
あなたのスキルで飯は食えるか?
@see http://www.itmedia.co.jp/enterprise/articles/1004/03/news002.html

夜中の2時頃に書いたせいか色々とひどいコードです。

同一牌は4枚とかカンチャン待ちとかを考慮していなかったので修正。
トータル3時間は超えてるなぁ・・・。

チートイ?何それおいしいの?
♥0 | Line 269 | Modified 2010-04-04 16:52:50 | 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/hXGo
 */

package
{
	import flash.display.Sprite;
	import flash.text.TextField;
	
	/**
	 * あなたのスキルで飯は食えるか?
	 * @see http://www.itmedia.co.jp/enterprise/articles/1004/03/news002.html
	 * 
	 * 夜中の2時頃に書いたせいか色々とひどいコードです。
	 *
	 * 同一牌は4枚とかカンチャン待ちとかを考慮していなかったので修正。
	 * トータル3時間は超えてるなぁ・・・。
	 * 
	 * チートイ?何それおいしいの?
	 */
	public class MySkill extends Sprite
	{
		public function MySkill()
		{
			var tf:TextField = new TextField();
			tf.width = stage.stageWidth;
			tf.height = stage.stageHeight;
			addChild(tf);
			
			var input:String = "1112224588899";
			check(input, tf);
			var input:String = "1111234567789";
			check(input, tf);
			var input:String = "1333456789999";
			check(input, tf);
			var input:String = "1112345678999";
			check(input, tf);
		}
		
		private var answers:Vector.<Tehai>;
		private function check(input:String, tf:TextField):void {
			answers = new Vector.<Tehai>();
			var arr:Array = input.split("");
			var narr:Array = [];
			for each (var s:String in arr) {
				narr.push(parseInt(s));
			}
			narr.sort();
			var tehai:Tehai = new Tehai();
			tehai.nokori = narr;
			answers.push(tehai);
			
			for (var i:uint=1; i<=7; i++) {
				findJuntsu(i);
			}
			for (var i:uint=1; i<=9; i++) {
				findKoutsu(i);
			}
			for (var i:uint=1; i<=9; i++) {
				findJanto(i);
			}
			
			tf.appendText(input + "\n");
			for each (var answer:Tehai in answers) {
				if (answer.isTempai()) {
					tf.appendText(answer.toString() + "\n");
				}
			}
			tf.appendText("===================================\n");
		}
		
		private function findJanto(n:uint):void {
			var count:uint = 0;
			var newList:Vector.<Tehai> = new Vector.<Tehai>();
			
			for each (var te:Tehai in answers) {
				count = 0;
				if (te.janto.length != 0) {
					continue;
				}
				for each (var nn:uint in te.nokori) {
					if (nn == n) {
						count++;
					}
				}
				if (count >= 2) {
					newList.push(te.clone());
					
					te.janto = (te.nokori.splice(te.nokori.indexOf(n), 2));
				}
			}
			
			for each (var newTehai:Tehai in newList) {
				answers.push(newTehai);
			}
		}
		
		private function findKoutsu(n:uint):void {
			var count:uint = 0;
			var newList:Vector.<Tehai> = new Vector.<Tehai>();
			for each (var te:Tehai in answers) {
				count = 0;
				for each (var nn:uint in te.nokori) {
					if (nn == n) {
						count++;
					}
				}
				if (count >= 3) {
					newList.push(te.clone());
					
					te.kakutei.push(te.nokori.splice(te.nokori.indexOf(n), 3));
				}
			}

			for each (var newTehai:Tehai in newList) {
				answers.push(newTehai);
			}
		}
		
		private function findJuntsu(n:uint):void {
			var newList:Vector.<Tehai> = new Vector.<Tehai>();
			var n2:uint = n+1;
			var n3:uint = n+2;
			var nflag:Boolean = false;
			var n2flag:Boolean = false;
			var n3flag:Boolean = false;
			
			for each (var te:Tehai in answers) {
				do {
					nflag = false;
					n2flag = false;
					n3flag = false;
					for each (var nnn:uint in te.nokori) {
						if (nnn == n) {
							nflag = true;
						}
						if (nnn == n2) {
							n2flag = true;
						}
						if (nnn == n3) {
							n3flag = true;
						}
					}
					if (nflag && n2flag && n3flag) {
						newList.push(te.clone());
						te.nokori.splice(te.nokori.indexOf(n), 1);
						te.nokori.splice(te.nokori.indexOf(n2), 1);
						te.nokori.splice(te.nokori.indexOf(n3), 1);
						te.kakutei.push([n, n2, n3]);
					}
				} while (nflag && n2flag && n3flag)
			}
			for each (var newTehai:Tehai in newList) {
				answers.push(newTehai);
			}
		}
		
		
	}
}

class Tehai {
	public var kakutei:Array = []; // 順子、刻子として確定した牌
	public var janto:Array = [];   // 雀頭として確定した牌
	public var nokori:Array = [];  // 上記以外
	
	public function clone():Tehai {
		
		var te:Tehai = new Tehai();
		for each (var ar:Array in this.kakutei) {
			var a:Array = [];
			for each (var i:uint in ar) {
				a.push(i);
			}
			te.kakutei.push(a);
		}
		
		for each (var l:uint in this.janto) {
			if (l) {
				te.janto.push(l);
			}
		}
		
		for each (var k:uint in this.nokori) {
			if (k) {
				te.nokori.push(k);
			}
		}
		return te;
	}
	
	 public function toString():String {
		var str:String = "";
		
		for each (var ar:Array in this.kakutei) {
			str += "("
			for each (var p:uint in ar) {
				str += p;
			}
			str += ")";
		}
		if (janto.length != 0) {
			str += "(";
			for each (var pp:uint in this.janto) {
				str += pp;
			}
			str += ")";
		}
		
		str += "[";
		for each (var ppp:uint in this.nokori) {
			str += ppp;
		}
		str += "]";
		
		return str;
	}
	 
	 public function isTempai():Boolean {
		 var temp:Boolean = this.kakutei.length + (this.janto.length == 2 ? 1 : 0) == 4;
		 
		 if (!temp) {
			 return false;
		 }
		 
		 var count:uint = 0;
		 var count2:uint = 0;
		 
		 if (this.nokori.length == 1) {
			 for each (var k:Array in kakutei) {
				 for each (var n:uint in k) {
					 if (n == nokori[0]) {
						 count++
					 }
				 }
			 }
			 if (count < 3) {
				 return true;
			 } else {
				 return false;
			 }
		 } else if (nokori.length == 2) {
			 if (Math.abs(nokori[0] - nokori[1]) == 1) {
				 if (nokori[0] == 1) {
					 count = 4;
				 }
				 if (nokori[1] == 9) {
					 count2 = 4;
				 }
				 
				 for each (var k:Array in kakutei) {
					 for each (var n:uint in k) {
						 if (n == nokori[0]-1) {
							 count++
						 }
						 if (n == nokori[1]+1) {
							 count2++
						 }
					 }
				 }
				 for each (var n:uint in janto) {
					 if (n == nokori[0]-1) {
						 count++
					 }
					 if (n == nokori[1]+1) {
						 count2++
					 }
				 }
				 if (count < 4 || count2 < 4) {
					 return true;
				 } else {
					 return false;
				 } 
			 } else if (Math.abs(nokori[0] - nokori[1]) == 2) {
				 for each (var k:Array in kakutei) {
					 for each (var n:uint in k) {
						 if (n == nokori[0]+1) {
							 count++
						 }
					 }
				 }
				 for each (var n:uint in janto) {
					 if (n == nokori[0]+1) {
						 count++
					 }
				 }
				 if (count < 4) {
					 return true;
				 } else {
					 return false;
				 } 
			 } else if (nokori[0] == nokori[1]){
				 for each (var k:Array in kakutei) {
					 for each (var n:uint in k) {
						 if (n == nokori[0]) {
							 count++
						 }
					 }
				 }
				 for each (var n:uint in janto) {
					 if (n == nokori[0]) {
						 count++
					 }
				 }
				 if (count < 2) {
					 return true;
				 } else {
					 return false;
				 }
			 }
		 }
		 
		 return false;
	 }
}