階乗通りの数字列を生成するプログラム | Photoshop CC Tutorials
今回は階乗通りの数字列を生成するプログラムを作成しました。
アルゴリズムは完全独自のものです。
何度も数字を並び替えたものを紙に書いて共通の法則を見つけ出し作成しました。

$ピック社長のブログ

実行結果(1,2,3,4,5の120通りの並べ方です。)
$ピック社長のブログ

Main.as
package 
{
import flash.display.Sprite;
import flash.events.Event;

/**
* 階乗通りの数字列を生成するプログラム
*/
public class Main extends Sprite
{
public var cnt:int = 0;
public var string:String;

public function Main():void
{
// 値を代入
Common.arrayNum = new Array();
Common.arrayNum = [1, 2, 3, 4, 5];

for (var i:int; i < Common.arrayNum.length; i++ ) {
Common.masuArray[i] = new MasuWork();
}

Common.usingNumArray = new Array(); // 共通の使用中配列初期化
this.cnt = Common.culcFactorial(Common.arrayNum.length);
//trace("全部で" + this.cnt + "通り");

for (i = 0; i < cnt; i++ ) {
for (var j:int = 0; j < Common.arrayNum.length; j++ ) {
string += Common.arrayNum[Common.masuArray[j].getNum()];;
}
string += " ";
if ((i+1) % 10 == 0) {
string += "\n";
}
Common.usingNumArray = new Array(); // 共通の使用中配列初期化

//trace(int(i + 1).toString() + "通りの目の数字は" + string);
//string = new String();
}
trace(string);
}

}

}


MasuWork.as
package  
{
/**
* マスの作業クラス
*/
public class MasuWork
{
public var masuPos:int;
public var arrayIndexNum:int;
public var cnt:int;
public var usedNumArray:Array = new Array();
public var index:int;
public var endIndexNumFlag_01:Boolean = false; // 末尾のマスかどうか
public var endIndexNumFlag_02:Boolean = false; // 末尾から二番目のマスかどうか
public var mixUsedNumArray:Array = new Array(); // 共通、自身の使用インデックス配列を格納する

// コンストラクタ
public function MasuWork()
{
this.index = Common.search(Common.usingNumArray); // 配列インデックスを取得
Common.usingNumArray.push(index); // 使用中として配列に格納する
cnt = Common.culcCnt(this.index); // 回数を計算
if (cnt == 1) {
endIndexNumFlag_02 = true;
}
if (cnt == 0) {
endIndexNumFlag_01 = true;
}
//trace(this.index + "番目は");
//trace(cnt + "通り");
}

// 配列インデックスを取得
public function getNum():int
{
//trace("番号" + index + "の状態");
//------------------------------
// 末尾のマスの処理
if (endIndexNumFlag_01) {
//trace("末尾です。");
this.arrayIndexNum = Common.search(Common.usingNumArray); // インデックス番号取得
//trace("取得した番号は" + arrayIndexNum + "です。");
return this.arrayIndexNum;
}

//------------------------------
// 末尾から二番目のマスの処理
if (endIndexNumFlag_02) {
//trace("末尾から二番目です。");
this.mixUsedNumArray = new Array(); // 混合配列を初期化する
mixUsedNumArrayFunc(Common.usingNumArray, usedNumArray); // 混合の使用中配列を作成
this.arrayIndexNum = Common.search(mixUsedNumArray); // インデックス番号取得
Common.usingNumArray.push(arrayIndexNum); // 共通の使用中配列に積む
this.usedNumArray.push(arrayIndexNum); // 使用中配列に積む

//trace("取得した番号は" + arrayIndexNum + "です。");
return this.arrayIndexNum;
}

--cnt;
//------------------------------
// 変換一歩手前の処理
if (cnt == 0) {
//trace("一歩手前の処理です。");
this.mixUsedNumArray = new Array(); // 混合配列を初期化する
mixUsedNumArrayFunc(Common.usingNumArray, usedNumArray); // 混合の使用中配列を作成
this.arrayIndexNum = Common.search(mixUsedNumArray); // インデックス番号取得
this.usedNumArray.push(arrayIndexNum); // 使用中配列に積む
Common.usingNumArray.push(arrayIndexNum); // 共通の使用中配列に積む
//trace("取得した番号は" + arrayIndexNum + "です。");
return this.arrayIndexNum;
//------------------------------
// 変換の処理
}else if (cnt == -1) {
//trace("変換の処理です。");
this.mixUsedNumArray = new Array(); // 混合配列を初期化する
mixUsedNumArrayFunc(Common.usingNumArray, usedNumArray); // 混合の使用中配列を作成
this.arrayIndexNum = Common.search(mixUsedNumArray); // インデックス番号取得
Common.usingNumArray.push(arrayIndexNum); // 共通の使用中配列に積む
cnt = Common.culcCnt(this.index); // 回数を再び計算
cnt = cnt -1;

Common.masuArray[this.index + 1].usedNumArray = new Array(); // 自身の右のマスの使用配列を初期化する
//trace("取得した番号は" + arrayIndexNum + "です。");
return this.arrayIndexNum;
}
// 平時
if (Common.usingNumArray.length == 0 && this.usedNumArray.length == 0) {
this.arrayIndexNum = Common.search(Common.usingNumArray); // インデックス番号取得
}else {
mixUsedNumArrayFunc(Common.usingNumArray, usedNumArray); // 混合の使用中配列を作成
this.arrayIndexNum = Common.search(mixUsedNumArray); // インデックス番号取得
}

Common.usingNumArray.push(arrayIndexNum); // 共通の使用中配列に積む
this.mixUsedNumArray = new Array(); // 混合配列を初期化する
//trace("取得した番号は" + arrayIndexNum + "です。");

return this.arrayIndexNum;
}

public function mixUsedNumArrayFunc(commonUsedArr:Array, usedArr:Array):void
{
for (var i:int = 0; i < commonUsedArr.length; i++ ) {
this.mixUsedNumArray.push(commonUsedArr[i]);
}

if (usedArr.length != 0) {
for (i = 0; i < usedArr.length; i++ ) {
this.mixUsedNumArray.push(usedArr[i]);
}
}

}

}

}


Common.as
package  
{
/**
* 共通のクラス
*/
public class Common
{
public static var arrayNum:Array = new Array();
public static var usingNumArray:Array = new Array();
public static var masuArray:Array = new Array();

public function Common()
{

}

// 回数計算
public static function culcCnt(_arrayIndexNum:int):int
{
return culcFactorial((Common.arrayNum.length - 1) - _arrayIndexNum);
}

// 階乗計算
public static function culcFactorial(num:int):int
{
var cnt:int = num;
while (cnt--) {
if (cnt == 0) break;
num = num * cnt;
}

return num;
}

// 検索 : 使用していない配列インデックスを取得する。
public static function search(numArray:Array):int
{
var indexNum:int;
if (numArray.length == 0) {
indexNum = 0;
return indexNum;
}

for (var i:int = 0; i < Common.arrayNum.length; i++ ) {
var hitCnt:int = 0;
for (var j:int = 0; j < numArray.length; j++ ) {
if (numArray[j] == i) {
break;
}else {
hitCnt++;
if (hitCnt == numArray.length) {
return i;
}
}
}
}

return indexNum;
}
}

}