中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

中国DOS联盟论坛
现在时间是 2026-06-25 04:54
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [求助]谁能写一个类似街头"猜姓氏"的批处理 查看 4,488 回复 17
楼 主 [求助]谁能写一个类似街头"猜姓氏"的批处理 发表于 2007-01-06 04:14 ·  中国 辽宁 联通
银牌会员
★★★
积分 1,212
发帖 464
注册 2006-12-13 21:11
19年会员
UID 73417
性别 男
状态 离线
以前我看过有人在街头用几张写了"姓氏"(有的可能也不是姓氏)卡片,只要你指出你的姓氏在哪两张卡片里,所谓"算命"人就能指出你的姓氏,到现在也没有弄清楚是什么原理,希望哪位能写一个这样的批处理(VBS),再说一下是什么原理,谢谢!
2 发表于 2007-01-06 05:31 ·  中国 甘肃 甘南藏族自治州 合作市 电信
金牌会员
★★★★
积分 4,103
发帖 1,744
注册 2006-01-20 13:00
20年会员
UID 49241
性别 男
来自 甘肃.临泽
状态 离线
说的不够清楚,我也没有见过
3 发表于 2007-01-06 06:25 ·  中国 广东 电信
荣誉版主
★★★★
batch fan
积分 5,226
发帖 1,737
注册 2006-03-10 00:38
20年会员
UID 51697
来自 成都
状态 离线
  原理似乎是这样:两张卡片中,其中一张的内容绝对不可能作为姓氏出现。
尺有所短,寸有所长,学好CMD没商量。
考虑问题复杂化,解决问题简洁化。
4 发表于 2007-01-06 06:29 ·  中国 江苏 苏州 联通
银牌会员
★★★
积分 1,181
发帖 533
注册 2006-08-14 12:54
19年会员
UID 60484
状态 离线
似乎挺有意思,小时候看过,但不知道原理。
5 发表于 2007-01-06 14:56 ·  中国 江西 南昌 电信
银牌会员
★★★
天的白色影子
积分 2,343
发帖 636
注册 2004-03-06 00:00
22年会员
UID 19350
性别 男
状态 离线
实际上这是一个表的编码与解码问题

所有的姓氏构成一个表

其中的每个姓氏都是其中的一个项

如何对表项进行编码以利于快速解码(或者叫索引)有很多方法

---------------------------------

最简单的是顺序编号,然后按编号顺序解码或索引

但效率最低,最差情况下可能要遍历整个表

没有一个算命师会这样干的

--------------------------------------------------

再复杂一些的就是二维编码,然后按维度值索引

效率相对高一些,最差情况下要索引二个维度的总和

比如一个有100项的表,可以分解为10*10的二维矩阵

此时最差要索引10+10次

有些现代的低级算命师采用类似的算法

很容易被人识破

-------------------------------------

更复杂一些的就是二进制编码,实际上它是一种多维编码

将二维的长度数变为维度数

比如一个100项的表会被分解为2*2*2*2*2*2*2的多维矩阵

对矩阵的索引就是一个七位的二进制数

每次索引都需要七次,没有最好最坏的说法

大多数算命师是采用这种方法或者其变形

-----------------------------------------------------------

有些算命师只让人看三四张表便能确定姓氏

另外很多情况下只要确定两张表中有姓氏项就可以确定姓氏

这是因为他们将频率较高的姓氏采用了更短的编码

在这方面做得比较有名的算法是霍夫曼树生成

根据各项的概率确定其编码,频率最高的码长最短

-----------------------------------------------------------------

下面是一个表的编码与解码的例子

为了算法的简便,仅采用了文中的第三种方法

如果它读取的table.txt是个每行含有一个姓氏的文本文件

那么它就是一个猜姓氏的程序

至于姓氏表,我是从下面给出新百家姓经过简单替换得到的

http://zhidao.baidu.com/question/5479397.html




:: 猜姓氏的延伸——表的编码与解码
:: qzwqzw @ http://bbs.cn-dos.net
:: 2007-01-06 1:16 Revision 1
@echo off
setlocal

for /f %%f in (table.txt) do (
set /a i+=1
set rdx=1
call :encode %%i%% %%f
)
set rdx=1
call :decode
cls
echo.
echo 你的选中项为:
echo.
find "" /v /n < table.txt | find ""
del *.tbl
pause
goto :eof

:encode
set /a val=%1 ^& rdx
if %val% neq 0 set/p=%2 <nul>>%rdx%.tbl
set /a rdx*=2
if %rdx% leq %1 goto encode
goto :eof

:decode
cls
type %rdx%.tbl
echo.
echo.
set ch=
set /p ch=上表中是否有选中项(y为有,否则为无):
if /i "%ch%"=="y" set /a idx+=rdx
set /a rdx*=2
if %rdx% leq %i% goto decode
goto :eof
本帖最近评分记录 (共 3 条) 点击查看详情
评分人分数时间
无奈何 +20 2007-01-07 00:27
lxmxn +20 2007-01-07 01:23
jmz573515 +4 2007-01-07 05:42
6 发表于 2007-01-06 16:20 ·  中国 湖北 武汉 电信
版主
★★★★★
积分 11,386
发帖 4,938
注册 2006-07-23 17:10
19年会员
UID 59080
状态 离线
Originally posted by qzwqzw at 2007-1-6 01:56:
实际上这是一个表的编码与解码问题

所有的姓氏构成一个表

其中的每个姓氏都是其中的一个项

如何对表项进行编码以利于快速解码(或者叫素...

  不得不佩服兄的编程水平,但是我在测试的时候,出现了一点小问题。

  当我以“有”为姓氏时,这段代码判断为我姓“施”,不知何故。

  我的 table.txt 文件如下:


















































































































































































































羿























































宿

怀










































寿













































广


































































































































西






















































西

























本帖最近评分记录 (共 1 条) 点击查看详情
评分人分数时间
tghksj -1 2007-01-10 23:36
7 发表于 2007-01-06 23:13 ·  中国 江西 南昌 电信
银牌会员
★★★
天的白色影子
积分 2,343
发帖 636
注册 2004-03-06 00:00
22年会员
UID 19350
性别 男
状态 离线
没想到真有人将table表发上来

我测试时的表仅100行也没敢往上发

太占阅读空间了

-----------------------------------------------------

“有”的问题是你挑花了眼

请注意有无顺序分别是

y y y n y n n n n y

将这个顺序反过来

再将y变为1,n变为0

就是1000010111

转换为十进制就是535

它就是“有”的行编号

--------------------------------------------------------

另外,你的表很有问题

因为没有正确的处理复姓和一些冗余字

造成了重复项的出现

而这会影响项的索引,造成判断失误

而且老百家姓的表太大了

需要九次判断,很容易让人不耐烦的

而且表的编码速度也被降低了
8 发表于 2007-01-07 01:23 ·  中国 湖北 武汉 电信
版主
★★★★★
积分 11,386
发帖 4,938
注册 2006-07-23 17:10
19年会员
UID 59080
状态 离线
Originally posted by qzwqzw at 2007-1-6 10:13:
没想到真有人将table表发上来

我测试时的表仅100行也没敢往上发

太占阅读空间了

-----------------------------------------------------

“有”的问题是你 ...


  的确。

  当初测试的时候,也只是将百度知道吧页面上的姓氏表复制下来,然后自己写了一个批处理生成了这个 table.txt 文件,并没有考虑复性和冗余的姓氏。

  兄的这个批程序的算法值得学习啊。
9 发表于 2007-01-07 05:45 ·  中国 辽宁 本溪 联通
银牌会员
★★★
积分 1,212
发帖 464
注册 2006-12-13 21:11
19年会员
UID 73417
性别 男
状态 离线
不错,可是这个和我以前写的猜年龄的原理是一样的。
我觉得“猜姓氏”的不是这个原理。(我记得是只要确认两次就能说出你的姓名)
不知道还有没有别更好的方法?
10 发表于 2007-01-07 14:21 ·  中国 湖南 娄底 电信
银牌会员
★★★
积分 2,268
发帖 879
注册 2006-12-19 16:23
19年会员
UID 73968
性别 男
状态 离线
其实原理很简单,我以前在街头见过,回来后用数字和我的同事玩,他们佩服的五体投地.
道理就一个,他给你看的两张表里,只有一个姓是重复的.
11 发表于 2007-01-07 23:29 ·  中国 山东 济南 电信
社区乞丐
★★
此图片另存后死机
积分 -49
发帖 90
注册 2006-12-02 13:00
19年会员
UID 72412
性别 男
状态 离线
又是qzwqzw.....又有的看了.....痛苦啊~~......
本帖最近评分记录 (共 2 条) 点击查看详情
评分人分数时间
lxmxn -16 2007-01-19 05:21
-1 2007-04-09 07:08
我的网络笔记本.非联系本人请勿访问!http://w.vicp.net
12 发表于 2007-01-09 03:45 ·  中国 山东 济南 电信
社区乞丐
★★
此图片另存后死机
积分 -49
发帖 90
注册 2006-12-02 13:00
19年会员
UID 72412
性别 男
状态 离线
lxmxn 老师,麻烦您能不能把您的table.txt附件一下,这样太眼晕了......

qzwqzw 老师 你把问题复杂化了

江湖术士根本不可能对表格进行多维编码.有您这样头脑是绝对不会做江湖术士的 :)

此题只不过是一个平面表格, "经线个数 * 纬线个数 = 网点个数"


:: tghksj @ http://bbs.cn-dos.net
:: tghksj @ http://w.vicp.net
@ECHO %dbg% OFF
setlocal ENABLEDELAYEDEXPANSION
MODE CON COLS=120 LINES=30

SET BJX=赵 钱 孙 李 周 吴 郑 王 冯 陈 诸 卫 蒋 沈 韩 杨 朱 秦 尤 许 何 吕 施 张 孔 曹 严 华 金 魏 陶 姜 戚 谢 邹 喻 柏 水 窦 章 云 苏 潘 葛 奚 范 彭 郎 鲁 韦 昌 马 苗 凤 花 方 俞 任 袁 柳 酆 鲍 史 唐 费 廉 岑 薛 雷 贺 倪 汤 滕 殷 罗 毕 郝 邬 安 常 乐 于 时 傅 皮 卡 齐 康 伍 余 元 卜 顾 孟 平 黄 和 穆 萧 尹 姚 邵 堪 汪 祁 毛 禹 狄 米 贝 明 臧 计 伏 成 戴 谈 宋 茅 庞 熊 纪 舒 屈 项 祝 董 粱 杜 阮 蓝 闵 席 季 麻 强 贾 路 娄 危 江 童 颜 郭 梅 盛 林 刁 钟 徐 邱 骆 高 夏 蔡 田 樊 胡 凌 霍 虞 万 支 柯 咎 管 卢 莫 经 房 裘 缪 干 解 应 宗 丁 宣 贲 邓 郁 单 杭 洪 包 诸 左 石 崔 吉 钮 龚 程 嵇 邢 滑 裴 陆 荣 翁 荀 羊 於 惠 甄 魏 家 封 芮 羿 储 靳 汲 邴 糜 松 井 段 富 巫 乌 焦 巴 弓 牧 隗 山 谷 车 侯 宓 蓬 全 郗 班 仰 秋 仲 伊 宫 宁 仇 栾 暴 甘 钭 厉 戎 祖 武 符 刘 景 詹 束 龙 叶 幸 司 韶 郜 黎 蓟 薄 印 宿 白 怀 蒲 台 从 鄂 索 咸 籍 赖 卓 蔺 屠 蒙 池 乔 阴 郁 胥 能 苍 双 闻 莘 党 翟 谭 贡 劳 逄 姬 申 扶 堵 冉 宰 郦 雍 却 璩 桑 桂 濮 牛 寿 通 边 扈 燕 冀 郏 浦 尚 农 温 别 庄 晏 柴 翟 阎 充 慕 连 茹 习 宦 艾 鱼 容 向 古 易 慎 戈 廖 庚 终 暨 居 衡 步 都 耿 满 弘 匡 国 文 寇 广 禄 阙 东 殴 殳 沃 利 蔚 越 夔 隆 师 巩 厍 聂 晁 勾 敖 融 冷 訾 辛 阚 那 简 饶 空 曾 毋 沙 乜 养 鞠 须 丰 巢 关 蒯 相 查 后 荆 红 游 竺 权 逯 盖 益 桓 公 万俟 司马 上官 欧阳 夏侯 诸葛 闻人 东方 赫连 皇甫 尉迟 公羊 澹台 公冶 宗政 濮阳 淳于 单于 太叔 申屠 公孙 仲孙 轩辕 令狐 钟离 宇文 长孙 慕容 鲜于 闾丘 司徒 司空 亓官 司寇 仉督 子车 颛孙 端木 巫马 公西 漆雕 乐正 壤驷 公良 拓拔 夹谷 宰父 谷粱 晋楚 闫法 汝鄢 涂钦 段干 百里 东郭 南门 呼延 归海 羊舌 微生 岳帅 缑亢 况后 有琴 梁丘 左丘 东门 西门 商牟 佘佴 伯赏 南宫 墨哈 谯笪 年爱 阳佟

SET J=0
SET W=0

::对姓氏表进行22*22的经纬划分.每一个交叉点代表一个姓氏.
FOR %%i IN (%BJX%) DO (
IF !J! == 0 SET /P=!W!: <NUL
SET /P=%%i <NUL
SET J!J!W!W!=%%i
CALL SET J!J!=%%J!J!%% %%i
IF !J! == 21 (SET /A W+=1 & SET J=-1 & ECHO.)
SET /a J+=1
)
ECHO. & SET /P W=请选择你的姓氏所在标签号: & CLS
FOR /L %%i IN (0,1,21) DO (ECHO %%i: !J%%i!)
ECHO. & SET /P J=请选择你的姓氏所在标签号: & CLS
ECHO 你的姓氏为: !J%J%W%W%!


[ Last edited by tghksj on 2007-1-8 at 03:31 PM ]
本帖最近评分记录 (共 1 条) 点击查看详情
评分人分数时间
lxmxn -16 2007-01-19 22:33
我的网络笔记本.非联系本人请勿访问!http://w.vicp.net
13 发表于 2007-01-09 04:12 ·  中国 广东 广州 电信
初级用户
积分 20
发帖 8
注册 2007-01-08 22:25
19年会员
UID 75862
性别 男
状态 离线
不要吧~~~看的我头大了~~~救命啊~~~~~
14 发表于 2007-01-10 00:09 ·  中国 湖北 武汉 电信
版主
★★★★★
积分 11,386
发帖 4,938
注册 2006-07-23 17:10
19年会员
UID 59080
状态 离线
lxmxn 老师,麻烦您能不能把您的table.txt附件一下,这样太眼晕了......


  直接将我发的那段保存为table.txt文件就够了。


[ Last edited by lxmxn on 2007-1-9 at 11:11 AM ]
15 发表于 2007-01-10 03:25 ·  中国 山东 济南 电信
社区乞丐
★★
此图片另存后死机
积分 -49
发帖 90
注册 2006-12-02 13:00
19年会员
UID 72412
性别 男
状态 离线
晕~不知道是不是我的表达能力有问题,

我说你这样占500多行的空间啊~~~能不能打成附件,别直接显示啊???

太占地方了~拉半天才能拉过去啊!!!



还有,保存什么啊?
你的那个表本身就有问题,根本是个错误的表,还叫我保存干什么?

[ Last edited by tghksj on 2007-1-9 at 02:27 PM ]
本帖最近评分记录 (共 2 条) 点击查看详情
评分人分数时间
lxmxn -2 2007-01-18 00:41
electronixtar +2 2007-01-18 01:31
我的网络笔记本.非联系本人请勿访问!http://w.vicp.net
论坛跳转: