今日は趣向を変えて風水のプログラミングをしてみます。
風水?オカルト?
「そんなの風水師が適当なこと言ってるんじゃないの?」
と思う人もいるかもしれません。
いいえ、そんなことはありません。
風水、九星気学、四柱推命は計算のアルゴリズムがしっかりと確立していて、入力が同じならば出力は同じになるという特徴を持っています。
成立した経緯はわかりませんが、昔の中国の人がたくさんの運命を見てきて統計的な法則を見つけたけどわかりにくいから陰陽五行にあてはめてみたとかそういう類じゃないかと思います。
例えば、風水ならば、竣工年と建物の向きが決まれば、結果は一意に定まります。
四柱推命も誕生の年月日と時間で結果は一意に決まります。
入力が決まれば出力も一意に決まる っていいですね。
そのアルゴリズムはちゃんとした本を読めば書いてあります。陰陽五行の話とかいろいろ出てくるのですが、結局のところは、
- 足し算や引き算をする
- テーブルを引く
- 割り算して余りを求める
- if文で分類して、パターンを減らす
ということを繰り返しています。
ロジカルで、まさにプログラミングにぴったりですね!
作ったプログラムの一部を示しましょう。
まずは基本のチャートを描くためのもの。
$a = array();
$a[0] = $basenum + 8;
$a[1] = $basenum + 4;
$a[2] = $basenum + 6;
$a[3] = $basenum + 7;
$a[4] = $basenum + 0;
$a[5] = $basenum + 2;
$a[6] = $basenum + 3;
$a[7] = $basenum + 5;
$a[8] = $basenum + 1;
$text = "";
for($i = 0; $i < 9;$i++ )
{
$text .= strval(($a[$i] - 1) % 9 + 1);
if($i != 8) $text .= ",";
}
次は、運星から山星・水星を求めるプログラム。ちょっと複雑になってくるので変数名がaとかだと破綻します。
$運星 = array(); //
$運星["東南"] = 剰余($era + 8); //
$運星["南" ] = 剰余($era + 4); //
$運星["南西"] = 剰余($era + 6); //
$運星["東" ] = 剰余($era + 7); //
$運星["中央"] = 剰余($era + 0); //
$運星["西"] = 剰余($era + 2); //
$運星["北東"] = 剰余($era + 3); //
$運星["北"] = 剰余($era + 5); //
$運星["北西"] = 剰余($era + 1); //
switch($向) {
case "N1": case "N2": case "N3":
$中央水星 = $運星["北"];
$中央山星 = $運星["南"];
break;
case "NE1": case "NE2": case "NE3":
$中央水星 = $運星["北東"];
$中央山星 = $運星["南西"];
break;
case "E1": case "E2": case "E3":
$中央水星 = $運星["西"];
$中央山星 = $運星["東"];
break;
case "SE1": case "SE2": case "SE3":
$中央水星 = $運星["東南"];
・・・(中略)・・・
case "NW1": case "NW2": case "NW3":
$中央水星 = $運星["北西"];
$中央山星 = $運星["東南"];
break;
}
$山星 = array();
if( (preg_match("/[23]/",$向) && !($中央山星 % 2)) // 偶数で区分2か3
|| (preg_match("/[1]/",$向) && ($中央山星 % 2))) { // 奇数で区分1
$山星順行 = true;
}
else {
$山星順行 = false;
}
$水星 = array();
if( (preg_match("/[23]/",$向) && !($中央水星 % 2)) // 偶数で区分2か3
|| (preg_match("/[1]/",$向) && ($中央水星 % 2))) { // 奇数で区分1
$水星順行 = true;
・・・(中略)・・・
if($中央山星 == 5) { // 5は特別扱い
if( (preg_match("/[23]/",$向) && !($era % 2)) // 偶数で区分2か3
|| (preg_match("/[1]/",$向) && ($era % 2))) { // 奇数で区分1
$山星順行 = true;
}
else {
$山星順行 = false;
}
}
怪しげな変数名が並んでいます。
PHPは変数名に普通に漢字が使えるし、連想配列が使えるのでわかりやすく書けました。
もし、英数字しか使えないとどうやって英語に訳せばよいかわからなくて困っていたことでしょう。
こういう計算を延々とやっていくと、下の図のようなチャートが作られます。
こうして年飛星まで入ったチャートをPNGファイルで出力するPHPのプログラムが出来ました。
この数字を求めるところまでは機械的にできるのですが、数字を解釈するところに風水師の経験や勘といったものが必要になります。もちろん、私にはできません。
ある程度の一般的な解釈まではプログラムでもできるかもしれませんが、最終的には人間がいるのでしょう。