Board logo

标题: [求助]谁能写一个类似街头"猜姓氏"的批处理 [打印本页]

作者: jmz573515     时间: 2007-1-6 04:14    标题: [求助]谁能写一个类似街头"猜姓氏"的批处理

以前我看过有人在街头用几张写了"姓氏"(有的可能也不是姓氏)卡片,只要你指出你的姓氏在哪两张卡片里,所谓"算命"人就能指出你的姓氏,到现在也没有弄清楚是什么原理,希望哪位能写一个这样的批处理(VBS),再说一下是什么原理,谢谢!
作者: vkill     时间: 2007-1-6 05:31
说的不够清楚,我也没有见过
作者: namejm     时间: 2007-1-6 06:25
  原理似乎是这样:两张卡片中,其中一张的内容绝对不可能作为姓氏出现。
作者: NaturalJ0     时间: 2007-1-6 06:29
似乎挺有意思,小时候看过,但不知道原理。
作者: qzwqzw     时间: 2007-1-6 14:56
实际上这是一个表的编码与解码问题

所有的姓氏构成一个表

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

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

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

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

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

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

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

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

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

比如一个有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 "[%idx%]"
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

作者: lxmxn     时间: 2007-1-6 16:20


  Quote:
Originally posted by qzwqzw at 2007-1-6 01:56:
实际上这是一个表的编码与解码问题

所有的姓氏构成一个表

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

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

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

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

  我的 table.txt 文件如下:

















































































































































































































羿























































宿

怀










































寿













































广


































































































































西






















































西

























作者: qzwqzw     时间: 2007-1-6 23:13
没想到真有人将table表发上来

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

太占阅读空间了

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

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

请注意有无顺序分别是

y y y n y n n n n y

将这个顺序反过来

再将y变为1,n变为0

就是1000010111

转换为十进制就是535

它就是“有”的行编号

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

另外,你的表很有问题

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

造成了重复项的出现

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

而且老百家姓的表太大了

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

而且表的编码速度也被降低了
作者: lxmxn     时间: 2007-1-7 01:23


  Quote:
Originally posted by qzwqzw at 2007-1-6 10:13:
没想到真有人将table表发上来

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

太占阅读空间了

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

“有”的问题是你 ...


  的确。

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

  兄的这个批程序的算法值得学习啊。

作者: jmz573515     时间: 2007-1-7 05:45
不错,可是这个和我以前写的猜年龄的原理是一样的。
我觉得“猜姓氏”的不是这个原理。(我记得是只要确认两次就能说出你的姓名)
不知道还有没有别更好的方法?
作者: 26933062     时间: 2007-1-7 14:21
其实原理很简单,我以前在街头见过,回来后用数字和我的同事玩,他们佩服的五体投地.
道理就一个,他给你看的两张表里,只有一个姓是重复的.
作者: tghksj     时间: 2007-1-7 23:29
又是qzwqzw.....又有的看了.....痛苦啊~~......
作者: tghksj     时间: 2007-1-9 03:45
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 ]
作者: 52enjoy     时间: 2007-1-9 04:12
不要吧~~~看的我头大了~~~救命啊~~~~~
作者: lxmxn     时间: 2007-1-10 00:09


  Quote:
lxmxn 老师,麻烦您能不能把您的table.txt附件一下,这样太眼晕了......


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


[ Last edited by lxmxn on 2007-1-9 at 11:11 AM ]
作者: tghksj     时间: 2007-1-10 03:25
晕~不知道是不是我的表达能力有问题,

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

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



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

[ Last edited by tghksj on 2007-1-9 at 02:27 PM ]
作者: yxii001     时间: 2007-1-17 23:31
12F
精辟
作者: qzwqzw     时间: 2007-1-17 23:52
tghksj

不知是否我在5楼做的注释仍不够清晰

如果你确切理解了我说的意思

那我只能说你口中的江湖术士跟我口中的算命师完全是两个概念

江湖术士也许可以不学无术

但算命师至少一定要精通一门古代科学——数术

它与现代的数学有许多相通之处

比如在处理具体问题的算法思想上

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

事实上猜姓氏这个游戏

真正的算命师所使用的算法要比我所使用算法更为复杂和易于操作

你所说的算法,即我提到第二类算法我也曾有了解

其实质上障眼为主,算法为辅

我所说的第四类算法,我曾亲见

他所给出的姓氏卡片中,专门有一张是供算命师索引姓氏的

其实质上算法为主,障眼为辅

而高明的算命师玩这个游戏是不需要用障眼法的

完全依靠心算来实现姓氏的索引
作者: tghksj     时间: 2007-1-18 00:40
感谢 qzwqzw 老师的回复.

您是我的偶像

在我来这里的时候willsort老师就已经走了.

无奈何老师也是一位高人,无奈这位老师的代码只注重实用精简,实在是晦涩难懂,

我经常来这里不是为了学习批处理的而通过这个桥梁来学习算法.

您每出一段代码算法都十分精妙,每一段我几乎都要花上40几个小时来学习.

正如您所说的,我的这个猜姓氏的代码在我还没写之前就认为这是个骗人的把戏.

您在5楼所写的关于表的2维编码和多维编码我现在还在刻苦钻研..痛苦ing

我在12楼所讲,只是指出街头骗人把戏的原理,对您所讲的关于表的编码方式没有任何异议。

悄悄的问一句qzwqzw 老师你不会就是willsort吧?我能不能拜您为师啊?