カバラ数秘術

2011年中で、誕生数33になるのは
2011年7月22日だけ といった事を調査できます。

実行環境 WinHugs
http://cvs.haskell.org/Hugs/pages/downloading.htm

2011/01/15 投稿
2011/01/16 生まれ日、支配数算出を追加
 課題
 ・型が汚い showとreadを取り除きたい
 ・検索速度が遅い

検証

Hugs> kabbalahSumYMD' 19690117
[[[1,9,6,9],[25],[2,5],[7]],[[1],[1]],[[1,7],[8]]]
Hugs> kabbalahSumYMD 19690117
16
Hugs> kabbalah 19690117
7

# kabbalahSumYMD' は、年月日を分解して、各々を合算します。1969 分解-> 1,9,6,9 合算-> 25 分解-> 2,5 合算->71 分解-> 1       合算-> 117 分解-> 1,7     合算-> 8 

# kabbalahSumYMD は、年月日の合算結果を合算します。7 +1 +8 = 16

  16 分解-> 1,6 合算-> 7

# kabbalah は、上記の計算を一括して行います。

  1969/01/17生まれの場合、誕生数は 7


* 条件の検証

# 条件(B),(C)の検証

Hugs> kabbalahSumYMD' 19691122
[[[1,9,6,9],[25],[2,5],[7]],[[11],[11]],[[22],[22]]]
Hugs> kabbalahSumYMD' 19690111
[[[1,9,6,9],[25],[2,5],[7]],[[1],[1]],[[11],[11]]]


# 条件(A)の検証

Hugs> kabbalahSumYMD' 19840101
[[[1,9,8,4],[22]],[[1],[1]],[[1],[1]]]
 年の合算が、22に到達した時点で止まっている。OK


# 有名人の誕生日と誕生数を照合

http://ja.wikipedia.org/wiki/島田陽子
1953517日 
Hugs> kabbalahSumYMD' 19530517
[[[1,9,5,3],[18],[1,8],[9]],[[5],[5]],[[1,7],[8]]]
Hugs> kabbalah 19530517
22


# 誕生数に該当する年月日を検索する

2011年中で、誕生数22になる日付を検索

Hugs> findKabbalah 22 20110101 20111231
[20110711,20110729,20110909,20110918,20110927,20111107,20111116,20111125]


2011年中で、誕生数33になる日付を検索

Hugs> findKabbalah 33 20110101 20111231
[20110722]


# 誕生数の動きを見る

20111月の誕生数

Hugs> kabbalahList 20110101 20110131
[6,7,8,9,1,11,3,4,5,6,7,8,9,1,11,3,4,5,6,7,8,9,1,11,3,4,5,6,7,8,9]


# 生まれ日 と、ペルソナを求める
Hugs>  kabbalah' 19990701 "tarou"
[9,1,2]

# ペルソナの計算過程を確認
Hugs> kabbalahRuleNo' "tarou"
[[4,1,2,7,6],[20]]


ソース

import Data.Time
------------------------------------------------------
{- カバラ誕生数 -}
{- ** 仕様 **
誕生数の導き方
ttp://www2.interbroad.or.jp/naniwa/kabbalah/fate.html
生年月日を単数変換し、それを合計します。
合計が2桁となった場合、さらに単数変換します。
但し、11と22は特別な数字の為、単数変換は行いません。

(例)1969117日生まれの場合

(A)1969年→1+9+6+9=25 →2+5=7
(B)1月 →1
(C)17日 →1+7=8
(D)A+B+C → 7+1+8=16 →1+6=7

誕生数「7」となります。

(注)数字が1122の場合は変換を行いません。
((A)の単数変換の結果が11or22の場合、
 (B)11月生まれの場合、
 (C)11日、22日生まれの場合、
 (D)合計が1122の場合)
-}

-- 指定した期間内で、指定した誕生数に一致する生年月日を検索
-- format)findKabbalah n  YYYYMMDD YYYYMMDD
--     ex)findKabbalah 11 20100101 20110101
findKabbalah n startYMD endYMD  = [ymd|ymd<-[startYMD..endYMD],(isDate ymd) && (kabbalah ymd == n)]

-- 指定した期間内の誕生数の動きを見る
kabbalahList startYMD endYMD  = [kabbalah ymd|ymd<-[startYMD..endYMD],(isDate ymd)]

-- 指定した生年月日の誕生数を求める
-- format)kabbalah YYYYMMDD
--     ex)kabbalah 20101114
kabbalah ymd = kabbalahSum(monthDateToList(kabbalahSumYMD ymd))

-- 指定した年月日の誕生数、覚醒数(生まれ日)と、姓名からペルソナ(支配数)を求める
-- format)kabbalah' YYYYMMDD name
--     ex)kabbalah' YYYYMMDD "yoshida tarou"
kabbalah' ymd name =  [kabbalahSum(monthDateToList(kabbalahSumYMD ymd))]
                   ++ [kabbalahSum(monthDateToList(getDayFromYMDNum ymd))]
                   ++ [kabbalahRuleNo name]

-- 年月日リスト化
kabbalahSumYMD ymd 
    = show(
        kabbalahSum(numStrToList(getYearFromYMDNum ymd))
        + kabbalahSum(monthDateToList(getMonthFromYMDNum ymd))
        + kabbalahSum(monthDateToList(getDayFromYMDNum ymd))
        )
kabbalahSumYMD' ymd 
    =  [kabbalahSum'(numStrToList(getYearFromYMDNum ymd))]
    ++ [kabbalahSum'(monthDateToList(getMonthFromYMDNum ymd))]
    ++ [kabbalahSum'(monthDateToList(getDayFromYMDNum ymd))]
    
-- 年月日抽出
getYearFromYMDNum  x = show( x `div` 10000)
getMonthFromYMDNum x = show((x `mod` 10000) `div` 100)
getDayFromYMDNum   x = show( x              `mod` 100)

-- 合計
kabbalahSum  xs | isKabbalahNo(sum xs) = sum xs
                | otherwise            = kabbalahSum(numToList(sum xs))
kabbalahSum' xs | isKabbalahNo(sum xs) = [xs] ++ [[sum xs]]
                | otherwise            = [xs] ++ [[sum xs]] ++ kabbalahSum'(numToList(sum xs))

-- 数字を数値の配列に変換
numStrToList[]     =  []
numStrToList(x:xs) =  [read [x]::Integer] ++ numStrToList xs

-- 数値を数値の配列に変換
numToList x =  numStrToList(show x)

-- 月、日に適用する合算条件
monthDateToList[] = []
monthDateToList x | isKabbalahNo (read x) = [read x]
                  | otherwise             = numStrToList x

-- カバラで使用できる数を定義
--isKabbalahNo  x = (x == 11) || (x == 22) || (x `div` 10 == 0 ) -- 例外は11と22のみの場合
isKabbalahNo    x = (x `mod` 11 == 0)      || (x `div` 10 == 0 ) -- 誕生数33,44等を含む場合
--http://homepage2.nifty.com/ssry/u/kabara3.html

------------------------------------------------------
-- カバラ支配数

-- ペルソナ(カバラ支配数)を求める
-- format)kabbalahRuleNo name
--     ex)kabbalahRuleNo "tarou"
kabbalahRuleNo  xs = kabbalahSum(monthDateToList(show(ruleNo  xs)))
kabbalahRuleNo' xs =  [ruleNo' xs]
                   ++ [[ruleNo xs]]

ruleNo []     = 0
ruleNo (x:xs) = seimeiMatch x + ruleNo xs

ruleNo' []     = []
ruleNo' (x:xs) = [seimeiMatch x] ++ ruleNo' xs

-- 文字変換
seimeiMatch c = if (length f == 0) then 0 else (f !! 0)
    where f = [x|x<-[1..((length seimeiPtn)-1)],inArray c (seimeiPtn !!x)] 

-- 変換表定義 0番目は使用しない
--http://www.aa.alpha-net.ne.jp/nekomata/sub4/kabara.html
seimeiPtn = ["","aiqjy","bkr","cgls","dmt","ehn","uvwx","oz","fp"]

-- ヒンドゥー数霊術の場合
--http://trpggasuki.com/bluebird/seimei.php
--seimeiPtn = ["","aijqy","bckr","gls","dmt","ne","uvwx","oz","fhp"]

-- 配列に含まれる場合True
inArray a []     = False
inArray a (x:xs) = if (x == a) then True else inArray a xs

------------------------------------------------------
-- 存在する日付か判定
isDate ymd = show(ymd) == (getGregorianYMD y m d)
    where y = read(getYearFromYMDNum  ymd)
          m = read(getMonthFromYMDNum ymd)
          d = read(getDayFromYMDNum   ymd)

getGregorianYMD y m d = delHyphen(show(fromGregorian y m d))
delHyphen       :: [Char] -> [Char]
delHyphen[]     = []
delHyphen(x:xs) | x == '-'  = ""  ++ delHyphen(xs)
                | otherwise = [x] ++ delHyphen(xs)