给孩子取名是一件很讲究的事情,有的直接花钱让人算,有的用族谱排字,有的用特别喜欢的诗歌或历史事件。暂时不管封建迷信是不是,这是父母美好愿望最直接的体现。毕竟人活着还是需要精神上的满足。本文的理论基础主要是五格剖象法与八字四柱五行相结合,试图用JS脚本实现半自动命名。
背景
我有个朋友对中国传统文化更感兴趣,周易、八字、中医、冥想等都研究过一点,五行八卦等原则也几乎了解了七七八八。最近需要给孩子起名,没有族谱,没有特别喜欢的诗,只能自己研究命名。他朋友问,为什么不自己花钱?码农,不花钱的地方肯定不花钱。怎么会错过这么好的研究数学的机会,最好用自己的轮子。
据说五格剖象法是由日本熊崎健翁于1918年初创造的。因此,严格地说,它只是基于中国传统文化理论创造的一种实践方式,可以简单地理解为用名字笔画幸运数字。这里就不赘述具体的规则和原则了,想了解细节的同学请自行查阅。
因为五格剖象法只是用数字看吉凶,维度太单一。汉字分为五行,普通人都知道一个道理:八字缺什么就补什么(其实比较复杂,有藏干之类的),比如苗、鑫、林、森这个词在名字里很常见。因此,笔者结合八字【四柱五行】补充了五格的实践。不幸的是,四柱五行的规律过于复杂,不适合零造轮,因此直接使用现成软件。
这几乎是市场上收钱命名的套路,最后,综合考虑寓意和平仄,那么名字肯定不会差,废话不多说我们来看演示结果!
效果展示
假设孩子姓【赵】,缺【金】【土】,女孩。
启动脚本并使用:
我们看看运行脚本后的结果:
随便挑一个测一下,比如【宸巍】:
感兴趣的学生可以自己试试。除了外观(不重要),这个名字是吉祥的。此外,作者还添加了拼音,因为成千上万的结果,所以一旦你确定了你最喜欢的发音,你可以根据拼音搜索。
正文
使用说明
毕竟是半自动的,所以还是要有一些人工操作。另外需要注意的是,在使用这个脚本之前,你必须至少使用github和nodejs的一些基本操作。当然,如果你只想看热闹,也很受欢迎。
基础数据
首先,准备基本数据:文字库、五格吉凶数字库,如下:直接上代码!
文字库
数据格式用 ts 表示如下:
// 五行 enum Ele { wood, fire, earth, metal, water, } // key 就是 字 Record<string, { char: string; // 字 ele: Ele; // 五行 strokes: number; // 笔画 sound: string; // 拼音 }>
看到JSON结果,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}` ); } }); } }); } });
结语
可以看到,逻辑其实非常简单,实现成本也不大,一两天就能搞出来。