程序员怎么给娃起名?当然是写个脚本!

9,447 阅读6分钟

导读

给孩子起名是个挺讲究的事,有的直接花钱让人算,有的用族谱排字辈,有的用特别喜欢的诗词或历史事件。是不是封建迷信咱暂且不论,这是为人父母美好心愿的一种最直接体现,毕竟人活着还是需要精神上的满足的。本文的理论基础主要是五格剖象法八字四柱五行相结合,尝试用 JS 脚本实现半自动化起名。

背景

笔者对中国传统文化比较感兴趣,周易、八字、中医、打坐什么的都研究过一点,五行八卦之类的原理也差不多了解个七七八八。最近需要给孩子起名,没有族谱,也没什么特别喜欢的诗词,那么就只能自己研究起名了。有朋友问了,为什么不自己花钱起呢?码农嘛,能不花钱的地方肯定就不花钱了,这么好的研究数理的机会怎么能错过呢,而且自己造的轮子才最好用不是。

五格剖象法据说是 1918 年初,由日本人熊崎健翁开创。所以严格来说只算是基于中国传统文化的理论创造的一种实践方式,可以简单理解为用名字笔画数凑“幸运数字”。具体规则和原理这里就不做赘述了,想了解详情的同学请自行查阅。

因为五格剖象法只是简单的用数字来看吉凶,维度太单一。汉字是分五行的,老百姓都知道的一个道理:八字里缺什么,就补什么(实际上更复杂一些,有藏干之类的),比如淼、鑫、林、森这些字在名字当中就是很常见的。于是笔者又结合八字的【四柱五行】补充了五格的实践。可惜的是,四柱五行的规律太复杂了,不适合从零造轮子,所以是直接使用现成的软件。

市面上收钱起名字的也差不多是这个套路了。最后,再综合考虑一下寓意和平仄,那么起出来的名字肯定不会差。

PS:貌似现在只能起三个字的名字了,据说是防止重名的太多。

效果展示

假设孩子姓【赵】,缺【金】【土】,女孩。

启动脚本并使用:

image.png

结果文件:

image.png

随便挑一个测一下,比如【宸巍】:

image.png

有兴趣的同学可以自己试一下,这个名字除了外格(不重要),都是吉数。另外,笔者把拼音也加上了,因为出的结果动不动就上万个,所以一旦确定了喜欢的发音,就可以按拼音搜索了。

正文

使用说明

毕竟是半自动的,所以还是要有一些人工操作在的。另外需要说明一下,你得起码会使用 github 和 nodejs 的一些基本操作,才能用这个脚本。当然如果你只是想看个热闹,那也是非常欢迎的。

  1. 八字排盘软件查看五行情况,选出需要补强的五行属性,注意要看藏干后的结果;
  2. git clone 笔者的 github 项目,进入目录执行 npm i && npm run build
  3. 运行 npm start 根据提示输入信息并查看结果;
  4. 综合考虑平仄韵律和寓意等,选取一些心仪的名字;
  5. 找个姓名打分软件测一下分数(一定要有结合八字的),选出满意的名字。不过这个网站某些字的笔画数会错,跟脚本的文字库不一样,要以康熙字典为准,如果发现脚本库的数据不对,请留言。

小技巧:进行完第 3 步时,先随便选个名字组合,去第 5 步的网站测一下,看看五行是不是取对了。如果没取对就重新取五行。

实现

具体代码就不贴了,可以到github 仓库查看,这里只说一下代码实现的基本逻辑。

基础数据

首先需要准备基本数据:文字库,五格吉凶数字库,如下:

文字库

数据格式用 ts 表示如下:

// 五行
enum Ele {
  wood,
  fire,
  earth,
  metal,
  water,
}

// key 就是 字
Record<string, {
  char: string; // 字
  ele: Ele; // 五行
  strokes: number; // 笔画
  sound: string; // 拼音
}>

eg:

{
  "一":{"char":"一","ele":2,"strokes":1,"sound":"yi"},
  "乙":{"char":"乙","ele":2,"strokes":1,"sound":"yi"},
  "刁":{"char":"刁","ele":1,"strokes":2,"sound":"diao"},
  // ...
}

五格吉凶数字库

数据格式用 ts 表示如下:

enum Sex {
  female,
  male,
}

Array<{
  desc: string;
  score: -2 | -1 | 0 | 1 | 2; // 吉正数;凶负数,处理的时候要剔除
  sex?: Sex; // 部分吉凶只针对男性或女性,使用时会根据性别进行过滤
  nums: number[];
}>

eg:

[  
  {
    "desc": "女德运暗示数(具有妇德,品性温良,助夫爱子)",
    "score": 1,
    "sex": 0,
    "nums": [5, 6, 11, 13, 15, 16, 24, 32, 35]
  },
  {
    "desc": "女性孤寡运暗示数(难觅夫君,家庭不和,夫妻两虎相斗,离婚,严重者夫妻一方早亡)",
    "score": -2,
    "sex": 0,
    "nums": [21, 23, 26, 28, 29, 33, 39]
  },
]

核心逻辑

  1. 根据性别五格吉凶数字库生成所有吉的数字,并去重;
  2. 暴力三层遍历:
    • 先选取一个吉数,即【总格】。减去【姓】的笔画,得到剩余笔画数,即【地格】,并保证【地格】是吉数
    • 暴力遍历所有笔画相加等于剩余笔画数的两个字,当然前提是经过了五行的筛选,另外还要保证【姓】+【第二个字】的笔画数,即【人格】是吉数
    • 跳回第一层,选取另一个吉数,执行下一个循环。 这样做的效果是:【总格】、【人格】、【地格】肯定是吉数;【天格】不受控(取决于姓);【外格】不保证效果,但由于外格没那么重要所以就随缘了;
  3. 将结果数据进行友好性处理,生成文件。

小提示:由于有拼音在,所以可以试着直接搜一下自己想要的发音。 贴一点核心代码片段,大家意思意思

  numData.nums.forEach((totalScore) => {
    const earthScore = totalScore - surStks;
    if (allGoodNums.includes(earthScore)) {
      chars.forEach((secd) => {
        const manScore = surStks + secd.strokes;
        const lastRest = earthScore - secd.strokes;
        if (
          lastRest > 0 &&
          secd.ele === eles[0] &&
          allGoodNums.includes(manScore)
        ) {
          chars.forEach((last) => {
            if (
              lastRest === last.strokes &&
              last.ele === eles[1]
            ) {
              const { cosmos, man, earth, outside, total } = getNameScore({
                surnameData,
                secondNameData: secd,
                lastnameData: last,
              });
              const fiveRes = `总${total}${man}${earth}${cosmos}${outside}`;
              result.push(
                `${secd.char}${last.char}${secd.sound}${last.sound}):${fiveRes}`
              );
            }
          });
        }
      });
    }
  });

结语

可以看到,逻辑其实非常简单,实现成本也不大,一两天就能搞出来。想想也是,笔者也不可能因为给娃起个名投入一周开发这么个玩意(嗯。。。好像也不一定)。不过既然搞出来了,干脆优化一下发出来得了,一是给大家图个乐子,二是万一谁真的用了那岂不是功德一件。

所以本文娱乐性要多一点,实用性就那么回事,反正笔者是通过这个给娃起的名字,分还挺高。虽然自己也知道不一定靠谱,但起码咱跑分高。

夫五行者。盖造化之根源。人伦之资始。万品禀其变易。百灵因其感通。本乎阴阳。散乎精像。周竟天地。布极幽明。子午卯酉为经纬。八风六律为纲纪。故天有五度以垂象。地有五材以资用。人有五常以表德。万有森罗。——《五行大义》

参考文献