zoukankan      html  css  js  c++  java
  • 对”心理学测测你的本命专业“的实现与算法的简要分析

    对”心理学测测你的本命专业“的实现与算法的简要分析

    1.使用谷歌浏览器打开https://cdn-act.knowyourself.cc/life_profession/

    2.Fn+F12打开开发者工具。

    3.在Sources中搜索字符串,例如“土木”,搜索结果如图1所示。

    图1 搜索“土木”

    4. 进入console,同时答题。可以看到两个index.tsc文件分别记录了答题的选项以及最后的结果,如图2所示。

     

    图2 答题后的控制台输出

    5.进入result.js,里面有一个getResult()函数。分析得到此文件是对用户的选择处理,可以发现最后的结果是在前端判定的。

    getResult()

    功能:处理用户的选择,返回结果。

    参数:select,用户的选择,是一个二维数组,表示第几题,以及用户选择了哪几个选项。

    返回:max,对应专业编号。

    过程:

    1. 定义每道题每个选项对应的专业。用数组存储,一般为多个。
    2. 处理select。找到用户选择的选项数组对应的专业数组,并将其通过连接的方式存储在result数组中。
    3. 处理result。处理前先打乱result,处理后存储入result_map中,result_map的key为专业的编号,value为对应出现的次数。记录下专业出现次数最多的编号,并赋值给max。

    注:

    1. 函数参数只有select,即用户选择的选项。所以最后的结果与用户答题前填写和选择的专业、姓名和性别无关。
    2. 每个选项对应的专业数组中,其中第十题的答案,不对应任何一个专业,如图3所示。所以无论第十题选什么都不会影响之前选择的结果。

    图 3 第十题对应的专业

      3. 若多个value为max时,选取第一次value为max的key,如图4所示。并且这个key是随机的。在处理result_map前,对result数组打乱顺序,也就是说,固定选项,max对应的value若存在多个,得到的key可能不一样。

      简单测试:五次固定选项时,得到的结果都是同一个值。

    图 4 max的判定

      4.题目的顺序不影响答题结果。

    附录:

    result.js完整代码如下所示。

    // 结果页id:
    
    // 0:经济学
    
    // 1:哲学
    
    // 2:法学
    
    // 3:社会学
    
    // 4:教育学
    
    // 5:汉语言文学
    
    // 6:外国语言学
    
    // 7:新闻学
    
    // 8:历史学
    
    // 9:数学
    
    // 10:物理学
    
    // 11:化学
    
    // 12:生命科学
    
    // 13:地理学
    
    // 14:心理学
    
    // 15:计算机科学与技术
    
    // 16:土木工程学
    
    // 17:建筑学
    
    // 18:机电工程学
    
    // 19:农林学
    
    // 20:医学
    
    // 21:管理学
    
    // 22:艺术
    
    // 23:戏剧影视导演
    
    // 24:表演艺术
    
    // 25:体育学
    
    // 26:考古学
    
    // 27:电子竞技
    
     
    
    //10道题,选择传入数组,因为有多选,数组内套数组
    
    //选择顺序从0开始算,0代表第一个选项,1代表第二个...
    
    //例如 select :[[0],[1],[3],[0],[0,1,2,3],[0,1,2,3,4],[0]]
    
    function getResult(select) {
    
        if (!Array.prototype.shuffle) {
    
            Array.prototype.shuffle = function() {
    
                for (var j, x, i = this.length; i; j = parseInt(Math.random() * i),
    
                x = this[--i],
    
                this[i] = this[j],
    
                this[j] = x)
    
                    return this;
    
            }
    
            ;
    
        }
    
        var config = {
    
            0: {
    
                0: [1, 0, 2, 3, 4, 5, 6, 7, 8, 21, 26],
    
                1: [9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 26],
    
                2: [22, 23, 24, 25, 27],
    
            },
    
            1: {
    
                0: [0, 2, 6, 7, 20, 21, 25],
    
                1: [3, 4, 24],
    
                2: [5, 14, 22],
    
                3: [1, 8, 9, 10, 11, 12, 13, 15, 16, 17, 18, 19, 23, 26, 27],
    
            },
    
            2: {
    
                0: [1, 3, 4, 5, 9, 10, 14, 21, 22, 23, 24, 27],
    
                1: [0, 2, 6, 7, 8, 11, 12, 13, 15, 16, 17, 18, 19, 20, 25, 26],
    
            },
    
            3: {
    
                0: [0, 2, 3, 4, 6, 7, 20, 21, 24, 25],
    
                1: [1, 5, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 22, 23, 26, 27],
    
            },
    
            4: {
    
                0: [1, 3, 4, 5, 9, 10, 14, 21, 22, 23, 24, 27],
    
                1: [0, 2, 6, 7, 8, 11, 12, 13, 15, 16, 17, 18, 19, 20, 25, 26],
    
            },
    
            5: {
    
                0: [1, 0, 2, 6, 7, 8, 9, 10, 11, 12, 13, 15, 16, 17, 18, 19, 20, 21, 23, 25, 26, 27],
    
                1: [3, 4, 5, 14, 22, 24],
    
            },
    
            6: {
    
                0: [1, 8, 9, 10, 11, 12, 13, 20, 26],
    
                1: [5, 22, 23, 24],
    
                2: [15, 16, 17, 18, 19, 25, 27],
    
                3: [3, 4, 6, 7, 14],
    
                4: [0, 2, 21],
    
            },
    
            7: {
    
                0: [1, 8, 9, 10, 11, 12, 13, 20, 26],
    
                1: [5, 22, 23, 24],
    
                2: [15, 16, 17, 18, 19, 25, 27],
    
                3: [3, 4, 6, 7, 14],
    
                4: [0, 2, 21],
    
            },
    
            8: {
    
                0: [4, 5, 7, 14, 21, 23, 6],
    
                1: [6, 15],
    
                2: [13],
    
                3: [10, 16, 17, 18],
    
                4: [12, 19, 20, 25],
    
                5: [1, 2, 7, 21],
    
                6: [0, 9, 15, 16, 18, 10, 14],
    
                7: [17, 22, 24, 23],
    
                8: [3, 8, 26, 13],
    
                9: [11, 12, 19, 20, 26],
    
                10: [25, 27],
    
                11: [22, 24],
    
            },
    
            9: {
    
                0: [],
    
                1: [],
    
                2: []
    
            }
    
        };
    
     
    
        var result = [];
    
        for (var topic_num = 0; topic_num < select.length; topic_num++) {
    
            // 遍历本题答案
    
            for (var j = 0; j < select[topic_num].length; j++) {
    
                var user_select = select[topic_num][j];
    
                // 获取配置
    
                var tmp = config[topic_num][user_select];
    
                // 合并
    
                result = result.concat(tmp);
    
            }
    
        }
    
        var result_map = {};
    
        var max = -1;
    
        // 打乱一下result结果
    
        result.shuffle();
    
        for (var i = 0; i < result.length; i++) {
    
            if (typeof result_map[result[i]] == "undefined") {
    
                result_map[result[i]] = 0;
    
            }
    
            result_map[result[i]]++;
    
            if (max == -1) {
    
                max = result[i];
    
            } else {
    
                if (result_map[result[i]] > result_map[max]) {
    
                    max = result[i];
    
                }
    
            }
    
        }
    
     
    
        //console.log(result);
    
        //console.log(result_map);
    
        //console.log(max);
    
        return max;
    
    }
    
     
    
    // test
    
    // console.log(getResult([[0], [3], [0], [1], [0], [0], [0], [0], [0, 5, 6], [1]]));//期望结果 1
    
    //getResult([[1],[3],[1],[1],[1],[0],[2],[2],[1,2,6],[1]]);//期望结果 15
    
    //getResult([[2],[3],[0],[1],[0],[0],[1],[1],[0,7,10],[1]]);//期望结果 23
    
     
    
    export default getResult;
    View Code
  • 相关阅读:
    指针变量的*p,p以及&p的区别
    C 真正理解二级指针
    二叉树Bynary_Tree(2):二叉树的递归遍历
    二叉树Binary_Tree(1):二叉树及其数组实现
    栈stack(2):栈的链表实现
    栈stack(1):栈的数组实现
    队列queue(2):链表实现队列
    老猿学5G扫盲贴:3GPP规范中与计费相关的主要规范文档列表及下载链接
    老猿学5G扫盲贴:推荐三篇介绍HTTP2协议相关的文章
    老猿学5G扫盲贴:中移动的5G计费架构中Nchf'服务化接口以及CHF中的AGF
  • 原文地址:https://www.cnblogs.com/dul843/p/14825669.html
Copyright © 2011-2022 走看看