flash on 2010-4-4
あなたのスキルで飯は食えるか?
@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
archived:2017-03-20 17:15:46
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;
}
}