标题: [求助]谁能写一个类似街头"猜姓氏"的批处理
[打印本页]
作者: 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吧?我能不能拜您为师啊?