读书笔记:(游戏文字)大衍梅花起卦机

Programming Bitcoin第4章Base58小节的启发,特发明此起卦机🐶。

前言

昔夫邵子赏梅即占,创梅花易数。今等而效之,见字即见卦,随字而起卦,故曰梅花起卦机。易传曰:大衍之数五十,其用四十有九。文王六十四卦中的单卦恰有四十九个,合此大衍之数。因本起卦机仅将文字转化为六十四卦中的四十九个单字卦,故曰大衍梅花起卦机。

古有圣贤莱布尼茨氏,肇作二进制数学,又见伏羲八卦,乃异其同。由是终悟文字、数目之内通款曲。吾今感念先贤之伟大,乃颂曰:万物都在言语,言语都在文字,文字都在数字,数字都在卦序。嗟夫,微斯人,吾谁与归?!

起卦机的原理

  • 使用utf-8编码,可将任意字符串转化为一系列的bytes。

    "大衍易".encode(encoding="utf-8")
    >>> b'\xe5\xa4\xa7\xe8\xa1\x8d\xe6\x98\x93'
    
  • 任何一组bytes可看作是一个256进制的整数:

    \xe5\xa4\xa7\xe8\xa1\x8d\xe6\x98\x93 = 229*256^8 + 164*256^7 + 167*256^6 + 232*256^5 + 161*256^4 + 141*256^3 + 230*256^2 + 152*256 + 147 = 4236169100403386259603
    

    直接用Python代码转化:

    int.from_bytes(b'\xe5\xa4\xa7\xe8\xa1\x8d\xe6\x98\x93', byteorder='big')
    >>> 4236169100403386259603
    
  • 可将上述整数以任意进制表示。因为大衍易数为49,我们用49进制数来表示。就像10进制数采用了10个阿拉伯数字作为其字母表:0123456789。我们的大衍49进制使用49个单字卦卦名为字母:

    DAYANYI_ALPHABET = "乾坤屯蒙需讼师比履泰否谦豫随蛊临观贲剥复颐坎离"\ 
    + "咸恒遁晋睽蹇解损益夬姤萃升困井革鼎震艮渐丰旅巽兑涣节"
    

    这里需要一个算法把10进制整数转换为我们新定义的49进制整数:

    num = 4236169100403386259603
    result = ''
    while num > 0:
        num, mod = divmod(num, 49)
        result = DAYANYI_ALPHABET[mod] + result
    print(result)
    >>> 离讼离涣蹇随否巽节萃萃恒比
    
  • 经过上述过程,我们就将"大衍易"编码为了“离讼离涣蹇随否巽节萃萃恒比”。

完整代码

DAYANYI_ALPHABET = "乾坤屯蒙需讼师比履泰否谦豫随蛊临观贲剥复颐坎离"\ 
+ "咸恒遁晋睽蹇解损益夬姤萃升困井革鼎震艮渐丰旅巽兑涣节"
def dayanmeihua(s):
    mybytes = s.encode(encoding='utf-8')
    num = int.from_bytes(mybytes, byteorder='big')
    result = ''
    while num > 0:
        num, mod = divmod(num, 49)
        result = DAYANYI_ALPHABET[mod] + result
    return result

print(dayanmeihua("2023年4月3日阿里巴巴股票行情"))
>>> 坤革升损履睽遁蒙困旅旅临渐蒙咸夬损损谦益颐丰屯颐临旅离艮节解需艮巽谦萃贲豫晋讼旅解蛊坎师恒节艮艮睽贲鼎谦蒙随姤益

声明

本发明已申请专利,侵权必究🐶!

蒙震履丰晋丰离渐艮鼎颐比兑观贲丰谦夬损颐颐履

参考书目

Song, Jimmy. Programming bitcoin: Learn how to program bitcoin from scratch. O'Reilly Media, 2019.