2008年7月19日星期六

人品计算器分析报告

前几天,有个MM突然问我人品计算器的原理,并且让我写一个出来。汗,既然是MM的要求,上校偶就万S不辞了,呵呵。

很久之前就玩过,从来不信这个,很奇怪为什么MM这么喜欢玩这些……

首先我用KingsamChen和kingsamchen分别进行了测试,发现的得到的结果不相同。这说明算法没有忽略大小写。直觉告诉我,一般这种算法都是对Unicode(因为能输入汉字)进行运算或者直接计算MD5,但是这个计算器最后还能得到“人品得分”,说明使用MD5的概率很低。

既然和Unicode有关,那么上校偶就尝试性的输入了一些简单的字符。拿什么测试呢,额,就用a吧,谁让他在字母表里面老大。得到的结果让我非常吃惊,居然是97。嗯,97,好熟啊,这个不就是a的Unicode么?不管他,上校偶继续。b:98,c:99,d:0……汗……咋变成0了。不管他,偶再继续。e:1,f:2……

偶分析了一下上面的数据,直觉告诉我,他把Unicode给除以100然后取余数。

那么多个文字呢?上校偶就输入了ab,得到的结果是95。而ad的结果是97。

根据上面的数据,上校有了一个大胆的猜测:他首先获得每个字符的Unicode,然后求和,最后除以100取余数,这个余数就是人品得分。

不过这个只是上校我的个人猜测,虽然我很有把握这个猜测是正确的。但是为求严谨,所以我Down了ImportFlash,把那个SWF给它俯卧撑了,得到了Fla文件。查看了源代码之后,发现和我推测的一模一样。HOHO~

function getResult(str) {
        var _local2 = 0;
        var _local1 = 0;
        while (_local1 < str.length) {
            _local2 = _local2 + str.charCodeAt(_local1);
            _local1++;
        }
        return (_local2 % 100);
    }

看来这个人品计算器也不过尔尔~然后是根据得分返回相应的分的人品~

function getValue(n) {
        var _local2 = "";
        if (n == 0) {
            _local2 = "你一定不是人吧?怎么一点人品都没有?!";
        } else if ((n > 0) && (n <= 5)) {
            _local2 = "算了,跟你没什么人品好谈的...";
        } else if ((n > 5) && (n <= 10)) {
            _local2 = "是我不好...不应该跟你谈人品问题的...";
        } else if ((n > 10) && (n <= 15)) {
            _local2 = "杀过人没有?放过火没有?你应该无恶不做吧?";
        } else if ((n > 15) && (n <= 20)) {
            _local2 = "你貌似应该三岁就偷看隔壁大妈洗澡的吧...";
        } else if ((n > 20) && (n <= 25)) {
            _local2 = "你的人品之低下实在让人惊讶啊...";
        } else if ((n > 25) && (n <= 30)) {
            _local2 = "你的人品太差了。你应该有干坏事的嗜好吧?";
        } else if ((n > 30) && (n <= 35)) {
            _local2 = "你的人品真差!肯定经常做偷鸡摸狗的事...";
        } else if ((n > 35) && (n <= 40)) {
            _local2 = "你拥有如此差的人品请经常祈求佛祖保佑你吧...";
        } else if ((n > 40) && (n <= 45)) {
            _local2 = "老实交待..那些论坛上面经常出现的偷拍照是不是你的杰作?";
        } else if ((n > 45) && (n <= 50)) {
            _local2 = "你随地大小便之类的事没少干吧?";
        } else if ((n > 50) && (n <= 55)) {
            _local2 = "你的人品太差了..稍不小心就会去干坏事了吧?";
        } else if ((n > 55) && (n <= 60)) {
            _local2 = "你的人品很差了..要时刻克制住做坏事的冲动哦..";
        } else if ((n > 60) && (n <= 65)) {
            _local2 = "你的人品比较差了..要好好的约束自己啊..";
        } else if ((n > 65) && (n <= 70)) {
            _local2 = "你的人品勉勉强强..要自己好自为之..";
        } else if ((n > 70) && (n <= 75)) {
            _local2 = "有你这样的人品算是不错了..";
        } else if ((n > 75) && (n <= 80)) {
            _local2 = "你有较好的人品..继续保持..";
        } else if ((n > 80) && (n <= 85)) {
            _local2 = "你的人品不错..应该一表人才吧?";
        } else if ((n > 85) && (n <= 90)) {
            _local2 = "你的人品真好..做好事应该是你的爱好吧..";
        } else if ((n > 90) && (n <= 95)) {
            _local2 = "你的人品太好了..你就是当代活雷锋啊...";
        } else if ((n > 95) && (n <= 99)) {
            _local2 = "你是世人的榜样!";
        } else if (n == 100) {
            _local2 = "天啦!你不是人!你是神!!!";
        } else {
            _local2 = "你的人品竟然负溢出了...我对你无语..";
         }
        return (_local2);
    }


这个作者真TMD的有病,需要写这么多么……5分作为公差为一组,汗……不过这个作者挺爱国的~

PrenameList = new Array ();
PrenameList.push(["日本人", -1]);
PrenameList.push(["小日本", -1]);
PrenameList.push(["日本", -1]);
PrenameList.push(["日本鬼子", -1]);

其实呢,额……日本MM还是不错的。—。—||| 然后就是模拟的部分了,这么点的小东西还是用VB6好了。不过要处理的比较多,所以有点烦。详情看代码~

Option Explicit

'****************************************

'/// Project:CharacterCalculator

'/// File:frmMain.frm

'/// Edition:v1.0.0 Final

'/// Coder:KingsamChen [MDSA Group]

'/// Last Modify:2008-7-19

'****************************************

Private Declare Sub InitCommonControls Lib "comctl32.dll" ()


Private Sub Form_Initialize()

  InitCommonControls
  
End Sub


Private Function DelNameSpace() As String

  '********************************************************
    
  '/// 函数名: DelNameSpace
    
  '/// 输  入: -
    
  '/// 输  出: String
    
  '/// 功  能: 去掉名字中的空格
    
  '********************************************************

  Dim strGetName As String, strDelName As String
  
  '/// 获取名字,首先去掉两端的空格
  
  '/// 然后再去掉字符串内部的空格
  
  strGetName = Trim$(txtName.Text)
  
  strDelName = Replace$(strGetName, " ", "", , , vbTextCompare)

  '/// 传递处理后的字符串
  
  DelNameSpace = strDelName

End Function


Private Function CalculateScore(ByVal strCalculateName As String) As Integer

  '********************************************************
    
  '/// 函数名: CalculateScore
    
  '/// 输  入: ByVal strCalculateName(String) - 要计算的名字
    
  '/// 输  出: Integer
    
  '/// 功  能: 用于计算名字的各个Unicode数之和,并 Mod 100
    
  '********************************************************

  Dim intLength As Integer, lngTotalScore As Long, i As Integer, strGetChar As String, strDBCS As String
  
  '/// 获取名字的长度,用于下面的循环次数
  
  intLength = Len(strCalculateName)
  
  '/// 初始化索引
  
  i = 1

  Do While i <= intLength
    
    '/// 提取字符
    
    strGetChar = Mid$(strCalculateName, i, 1)
    
    '/// 名字的Unicode数的和
    
    strDBCS = AscW(strGetChar)  '/// 文字DBCS值
    
    '/// 汉字的DBCS是负值,转成Unicode需要加上65536
    
    If strDBCS < 0 Then
      
      strDBCS = strDBCS + 65536
      
    End If
    
    lngTotalScore = lngTotalScore + strDBCS
  
    i = i + 1
  
  Loop
  
  CalculateScore = lngTotalScore Mod 100

End Function


Private Function GetCharacter(ByVal intScore As Integer) As String

  '********************************************************
    
  '/// 函数名: GetCharacter
    
  '/// 输  入: ByVal intScore(String) - 名字Unicode计算结果
    
  '/// 输  出: String
    
  '/// 功  能: 用于返回人品类型
    
  '********************************************************

  Dim strResult As String
  
  '/// 根据分数返回RP
  
  '/// 很多,5分一组.这个作者真TMD有病

  If intScore = 0 Then
    
    strResult = "你一定不是人吧?怎么一点人品都没有?!"
    
  ElseIf intScore > 0 And intScore <= 5 Then
    
    strResult = "算了,跟你没什么人品好谈的..."
      
  ElseIf intScore > 5 And intScore <= 10 Then
  
    strResult = "是我不好...不应该跟你谈人品问题的..."
      
  ElseIf intScore > 10 And intScore <= 15 Then
  
    strResult = "杀过人没有?放过火没有?你应该无恶不做吧?"
      
  ElseIf intScore > 15 And intScore <= 20 Then
  
    strResult = "你貌似应该三岁就偷看隔壁大妈洗澡的吧..."
    
  ElseIf intScore > 20 And intScore <= 25 Then
  
    strResult = "你的人品之低下实在让人惊讶啊..."
    
  ElseIf intScore > 25 And intScore <= 30 Then
  
    strResult = "你的人品太差了。你应该有干坏事的嗜好吧?"
    
  ElseIf intScore > 30 And intScore <= 35 Then
  
    strResult = "你的人品真差!肯定经常做偷鸡摸狗的事..."
    
  ElseIf intScore > 35 And intScore <= 40 Then
  
    strResult = "你拥有如此差的人品请经常祈求佛祖保佑你吧..."

  ElseIf intScore > 40 And intScore <= 45 Then
  
    strResult = "老实交待..那些论坛上面经常出现的偷拍照是不是你的杰作?"
    
  ElseIf intScore > 45 And intScore <= 50 Then
  
    strResult = "你随地大小便之类的事没少干吧?"
    
  ElseIf intScore > 50 And intScore <= 55 Then
  
    strResult = "你的人品太差了..稍不小心就会去干坏事了吧?"
    
  ElseIf intScore > 55 And intScore <= 60 Then
  
    strResult = "你的人品很差了..要时刻克制住做坏事的冲动哦.."
    
  ElseIf intScore > 60 And intScore <= 65 Then
  
    strResult = "你的人品比较差了..要好好的约束自己啊.."
    
  ElseIf intScore > 65 And intScore <= 70 Then
  
    strResult = "你的人品勉勉强强..要自己好自为之.."
    
  ElseIf intScore > 70 And intScore <= 75 Then
  
    strResult = "有你这样的人品算是不错了.."
    
  ElseIf intScore > 75 And intScore <= 80 Then
  
    strResult = "你有较好的人品..继续保持.."
    
  ElseIf intScore > 80 And intScore <= 85 Then
  
    strResult = "你的人品不错..应该一表人才吧?"
    
  ElseIf intScore > 85 And intScore <= 90 Then
  
    strResult = "你的人品真好..做好事应该是你的爱好吧.."
    
  ElseIf intScore > 90 And intScore <= 95 Then
  
    strResult = "你的人品太好了..你就是当代活雷锋啊..."
    
  ElseIf intScore > 95 And intScore <= 99 Then
  
    strResult = "你是世人的榜样!"
    
  ElseIf intScore = 100 Then  '/// 这个取得到么?
  
    strResult = "天啦!你不是人!你是神!!!"
    
  Else
  
    strResult = "你的人品竟然负溢出了...我对你无语.."
    
  End If

  GetCharacter = strResult

End Function


Private Sub cmdAbout_Click()

  Load frmAbout

  frmAbout.Show 1

End Sub

Private Sub cmdCalculate_Click()

  Dim strName As String, intScore As Integer, strResult As String
  
  '/// 获取处理过的名字
  strName = DelNameSpace
  
  txtName.Text = strName
  
  '/// 判断是否只有空格
  
  If strName = "" Then
  
    txtResult.Text = "请先输入要计算的名字"
    
    Exit Sub
    
  End If
  
  intScore = CalculateScore(strName)
  
  strResult = "姓名:" & strName & vbNewLine & "人品得分:" & intScore & vbNewLine _
  & "评价:" & GetCharacter(intScore)
  
  txtResult.Text = strResult

End Sub

如此这般,模拟也好了。 可以~去向MM交差咯~HOHO~ CharacterCalculator.zip

4 条评论:

  1. 汗……MM的吸引力比什么都大哈……

    回复删除
  2. python版~

    # -*- coding: utf-8 -*-

    special = {
        "日本人": -1,
        "小日本": -1,
        "日本": -1,
        "日本鬼子": -1
        }

    def get_score(name):
        if name in special:
            return special[name]
        s = 0
        for c in name.replace(' ', ''):
            s += ord(c)
        return s % 100

    table = [
        (-1, "你的人品竟然负溢出了...我对你无语.."),
        (0, "你一定不是人吧?怎么一点人品都没有?!"),
        (5, "算了,跟你没什么人品好谈的..."),
        (10, "是我不好...不应该跟你谈人品问题的..."),
        (15, "杀过人没有?放过火没有?你应该无恶不做吧?"),
        (20, "你貌似应该三岁就偷看隔壁大妈洗澡的吧..."),
        (25, "你的人品之低下实在让人惊讶啊..."),
        (30, "你的人品太差了。你应该有干坏事的嗜好吧?"),
        (35, "你的人品真差!肯定经常做偷鸡摸狗的事..."),
        (40, "你拥有如此差的人品请经常祈求佛祖保佑你吧..."),
        (45, "老实交待..那些论坛上面经常出现的偷拍照是不是你的杰作?"),
        (50, "你随地大小便之类的事没少干吧?"),
        (55, "你的人品太差了..稍不小心就会去干坏事了吧?"),
        (60, "你的人品很差了..要时刻克制住做坏事的冲动哦.."),
        (65, "你的人品比较差了..要好好的约束自己啊.."),
        (70, "你的人品勉勉强强..要自己好自为之.."),
        (75, "有你这样的人品算是不错了.."),
        (80, "你有较好的人品..继续保持.."),
        (85, "你的人品不错..应该一表人才吧?"),
        (90, "你的人品真好..做好事应该是你的爱好吧.."),
        (95, "你的人品太好了..你就是当代活雷锋啊..."),
        (99, "你是世人的榜样!"),
        (100, "天啦!你不是人!你是神!!!")
        ]

    while True:
        print()
        print('姓名: ', end='')
        score = get_score(input())
        print('人品得分:', score)
        print('评价: ', end='')
        for (limit, remark) in table:
            if score <= limit:
                print(remark)
                break
        else:
            print("你的人品竟然负溢出了...我对你无语..")

    回复删除
  3. 寒……算个人品的小程序哪里要那么麻烦……
    加一堆注释,用一堆函数……
    有点杀鸡用牛刀的味道。

    回复删除
  4. 呵呵~
    习惯了把不同的功能分开写成函数~

    回复删除

1、可以使用<b>、<i>、<a>等Html标志,让评论更有特色...
2、支持OpenID登录,技术达到国际先进水平。但切记,评论内容不代表本站观点!
3、当遇到“连接被重置”、“连接超时”和“此网页无法访问”等而发表不了评论的话,请多刷新几次页面,或迟三分钟后再试;
4、对你的浏览造成不便,站长在此代表全国G.FW工作人员向你鞠躬致歉!!!