实现双向链表的运势解读

本文涉及的产品
实时数仓Hologres,5000CU*H 100GB 3个月
智能开放搜索 OpenSearch行业算法版,1GB 20LCU 1个月
实时计算 Flink 版,5000CU*H 3个月
简介: 【5月更文挑战第4天】我们实现了用Go语言处理周易卦象的功能。 这个项目结合了双向链表和周易知识,有助于理解两者并提供运势占卜功能。

我们做了些什么?

这一小节我们将能看到我们做了一些什么事情,还记得第一小节的链表查询函数吗? 没错就是display,在第二小节中,我们将每次的爻变记录 和 爻值存入了链表,现在我们显示它。

1 准备材料

1.0 准备解释材料

世界的变化都在天地之间,人类关注的内容主要就是 天,地,人 三才。 解释文本,找到运势卦象后 通过此函数获得对应的 卦象解释和对应数字。

func (ic *ICh) CommonText(arrays []int) (string, int) {
    if len(arrays) != ic.Num {
        return ic.Warn + fmt.Sprintf("%v", arrays), 0
    }

    if ic.CompSlice(arrays, []int{1, 1, 1, 1, 1, 1}) {
        return `
        第一卦 乾 乾为天 乾上乾下 

        乾:元,亨,利,贞。 
        ....

在显示卦象时,提示用户爻变的位置和解释方式

    AnySis = map[int]string{
        0: "  六爻全不变,以本 卦卦辞占   ----- 不变 只看本卦 ",
        1: "一爻变,以本卦变爻的爻辞占          ----- 变卦前 的那一 变爻 含义",
        2: " 如果两个爻发生变动,使用本卦的两个变爻占辞判断吉凶,以位置靠上的为主   ----- 变卦前 的 第一变爻 含义",
        3: " 三爻变,以本卦及之卦的卦辞占,以本卦的卦辞为主    ----- 变卦前后都看, 本卦及之卦 含义  本卦为主",
        4: "  四爻变,以之卦中二不变的爻辞占,以下爻的爻辞为主   ----- 变卦 后 看,  之卦 含义  二不变的爻辞占,以下爻的爻辞为主",
        5: "  五爻表,以之卦中不变的爻辞占卜   ----- 变卦 后 看,  之卦 含义  不变的爻辞占 ",
        6: "  六爻全变,乾坤两卦以用九和用六的辞占卜,并参考之卦卦辞,余六十二卦占以之卦卦辞  ----- 变卦 后 看,  之卦 含义,乾坤 用九和用六 ,其他卦全看",
    }

由于全部 64项内容过多,如果希望查看全部内容,请到我的仓库查看

      https://github.com/XFrankly/amz_golang/tree/exerice/30.0_data_struct_linked_list/1.0_linked_list/1.1_linkeds/taodata/taodata.go

1.1 格式化输出, 让我们漂亮地查看爻的卦象,

添加读取函数, 6爻卦象 变卦后,解释其含义。

   func (dt *DataTao) KanGua(gua []int, n int) (string, int) {
            /*
               解释卦 的含义
               :param gua: 转 7, 8 为 1, 0
               :return:
            */
            newG := []int{}
            for _, g := range gua {
                    if g == 7 {
                            newG = append(newG, 1)
                    }
                    if g == 8 {
                            newG = append(newG, 0)
                    }
            }

            nc := ICApp
            means, nob := nc.CommonText(newG)
            nc.HowAnysis(n)
            guas := dt.Common(newG)
            print(means)
            result := guas + "\n" + means
            return result, nob
    } 

在结构体中展示, 格式化输出

func (dt *DataTao) FormatShow(cont string) string {
        /*
                :param cont:  需要显示的内容
                :return:
        */
        spaceStr := []string{} //{" ", dt.Indent}
        for i := 0; i < dt.Indent; i++ {
                spaceStr = append(spaceStr, " ")
        }
        msg := strings.Join(spaceStr, "") + cont
        print(msg)
        return msg + "\n"
}

转变 6 爻为 卦象后再显示卦象。

func (dt *DataTao) Common(gua []int) string {
        /*
           gua 转变后的列表,只应该有 0,1
                  :param gua: example [1,0,1,0,1,0]
                  :return: string
        */
        guas := ""
        for _, g := range gua {
                if g == 0 { // 0 表示阴爻
                        guas += dt.FormatShow("__ __ (阴)")
                } else if g == 1 { // 1 表示阳爻
                        guas += dt.FormatShow("_____ (阳)")
                } else {
                        guas += dt.FormatShow("")
                }
        }

        return guas
}

2 查看卦象。

变化 6爻卦象 显示原始卦象。

func (dt *DataTao) KanGuaOrigin() ([]int, int) {
    c := "n"  //是否显示此卦象,默认为显示
    guas := dt.SuanGua()
    gua := guas.display()
    v := 0 //# 变爻次数
    fmt.Println("卦象已出:")
    if c == "n" {
        for _, g := range gua {
            if g == 6 || g == 8 {
                if g == 6 {
                    dt.FormatShow("__ __ (6 " + dt.DefMean[6] + ")\n")
                    dt.GuaData = append(dt.GuaData, 7) //# 只写入变卦后的 少阳 少阴
                    v += 1
                }
                if g == 8 {
                    dt.FormatShow("__ __ (8 " + dt.DefMean[8] + ")\n")
                    dt.GuaData = append(dt.GuaData, g) //# 只写入变卦后的 少阳 少阴
                }

            } else if g == 7 || g == 9 {
                if g == 7 {
                    dt.FormatShow("_____ (7 " + dt.DefMean[7] + ")\n")
                    dt.GuaData = append(dt.GuaData, g) //# 只写入变卦后的 少阳 少阴
                }

                if g == 9 {
                    dt.FormatShow("_____ (9 " + dt.DefMean[9] + ")\n")
                    dt.GuaData = append(dt.GuaData, 8) //# 只写入变卦后的 少阳 少阴
                    v += 1
                }

            } else {
                dt.FormatShow("")
            }
        }
    } else {
        for _, g := range gua {
            if g == 6 || g == 8 {
                if g == 6 {
                    dt.FormatShow("_____ (6 " + dt.DefMean[6] + " -> 7 " + dt.DefMean[7] + ")\n")
                    dt.GuaData = append(dt.GuaData, 7) //# 只写入变卦后的 少阳 少阴
                    v += 1
                }

                if g == 8 {
                    dt.FormatShow("__ __ (8 " + dt.DefMean[8] + ")\n")
                    dt.GuaData = append(dt.GuaData, g) //# 只写入变卦后的 少阳 少阴
                }

            } else if g == 7 || g == 9 {
                if g == 7 {
                    dt.FormatShow("_____ (7 " + dt.DefMean[7] + ")\n")
                    dt.GuaData = append(dt.GuaData, g) //# 只写入变卦后的 少阳 少阴
                }

                if g == 9 {
                    dt.FormatShow("__ __ (9 " + dt.DefMean[9] + "-> 8 " + dt.DefMean[8] + ")\n")
                    dt.GuaData = append(dt.GuaData, 8) //# 只写入变卦后的 少阳 少阴
                    v += 1
                } else {
                    dt.FormatShow("")
                }

            }
        }

    }
    return dt.GuaData, v
}

3 最后保存

让我们把计算结果保存到本地,以日期格式作为标题

            fmt.Println("回车保存结果并退出:")
    var act = ""
    fmt.Scanln(&act)
    fmt.Println(".", act)
    fileName := "guali_" + time.Now().String()[:18]
    fileNames := strings.Replace(fileName, " ", "", -1)
    fileNames = strings.Replace(fileNames, ":", ".", -1)
    fileNames = strings.Replace(fileNames, "-", ".", -1) + ".txt"
    f, err := os.Create(fileNames)
    if err != nil {
        msg := fmt.Sprintf("Can not write data:%v\n", err)
        panic(msg)
    }
    f.WriteString(fileNames + "\n联系作者:hahamx@foxmail.com" + "\n")
    f.WriteString(result)
    f.Close()
    fmt.Println("已保存:", fileNames)

并且把结果变得更漂亮一些 添加程式启动提示,您可以自己定义格式

start = `

           _______
           _______
           _______
           .......
___ ___....元亨利贞...._______ 

___ ___....运势占卜...._______

_______....大吉大利....___ ___ 

           .......
           ___ ___
           ___ ___
           ___ ___

`

4 结语

我们可以计算一万次,并统计64卦 分别出现多少次,从而知道中有多少人与自己的运势相同

小练习: 实现计算10000次,并统计次数。

本文介绍了 双向链表的实现和在周易算卦中的简单实现,我们可以理解其具有广泛民众基础的算卦如何运作
也可以对双向链表加深理解,本项目是本人众多项目中的一个,希望能对看官有所益。

如果有任何疑问,和深入解读的兴趣,在本文留言
目录
相关文章
|
7月前
|
存储 Go
实现双向链表计算运势
【5月更文挑战第4天】本文提供链表构造、判断空链表、头部添加和尾部添加节点的方法,以及显示链表值的功能。 这些将在后续的运势解读部分发挥作用
38 0
|
7月前
|
算法
LeetCode刷题---19. 删除链表的倒数第 N 个结点(双指针-快慢指针)
LeetCode刷题---19. 删除链表的倒数第 N 个结点(双指针-快慢指针)
|
7月前
【移除链表元素】LeetCode第203题讲解
【移除链表元素】LeetCode第203题讲解
|
6月前
|
存储 SQL 算法
LeetCode力扣第114题:多种算法实现 将二叉树展开为链表
LeetCode力扣第114题:多种算法实现 将二叉树展开为链表
|
6月前
|
存储 SQL 算法
LeetCode 题目 86:分隔链表
LeetCode 题目 86:分隔链表
|
6月前
|
存储 算法 Java
【经典算法】Leetcode 141. 环形链表(Java/C/Python3实现含注释说明,Easy)
【经典算法】Leetcode 141. 环形链表(Java/C/Python3实现含注释说明,Easy)
60 2
|
7月前
<数据结构>五道LeetCode链表题分析.环形链表,反转链表,合并链表,找中间节点.
<数据结构>五道LeetCode链表题分析.环形链表,反转链表,合并链表,找中间节点
53 1
|
6月前
|
算法
【经典LeetCode算法题目专栏分类】【第7期】快慢指针与链表
【经典LeetCode算法题目专栏分类】【第7期】快慢指针与链表
|
6月前
|
存储 SQL 算法
LeetCode 83题:删除排序链表中的重复元素【面试】
LeetCode 83题:删除排序链表中的重复元素【面试】
|
6月前
|
存储 SQL 算法
LeetCode 题目 82:删除排序链表中的重复元素 II
LeetCode 题目 82:删除排序链表中的重复元素 II