如何使用蛮力来解决和存储多项选择题的解决方案?

时间:2011-10-31 17:53:59

标签: perl brute-force multiple-choice

我在理解这种蛮力方法时遇到了一些麻烦。我正在使用Perl来提取问题和他们的选择。现在所有问题都存储在数组中。我不知道如何处理答案。

我应该如何存储答案并组织我的代码,以便它能做类似的事情......

  1. 选择问题的第一个选项。 (所以通过一个,所有问题都应该选择A)。

  2. 提交以检查答案是否正确。

  3. 解析答案,如果给出的答案是正确的,则标记为“正确”答案,并忘记尝试选择该问题的任何其他选择。

    否则,请在下一次传递中继续查看该问题的答案列表。

  4. 因此,下一个传递将为该问题选择第二个答案,直到多次提交后,它才会通过蛮力找到所有“正确”的答案。

    我无法存储答案并将其与问题相关联,因为错误将其交叉或将其标记为“已找到”。

    我在考虑使用哈希。请告诉我有关如何构建代码的任何建议。

    谢谢!

    修改

    示例数据 -

    所以我使用的是HASH方法...我的哈希看起来像这样:

    打印出哈希:

    question_123 => a,b,c,d
    question_155 => a,b,c
    question_234 => T,F
    

    现在我必须找到一种方法来完成每个选项,直到找到该问题的正确答案。

    修改

    为了澄清某些事情,让我们假设有一个10个问题的池。用户单击“开始练习”,从10个池中生成4个随机问题。因此,在当前状态下,我有4个问题及其答案。我通过并将这些问题及其答案添加到数据结构中(一个来自下面......或者使用文件来存储它们)。接下来我要回答一个问题。然后,用户必须提交这些问题以供审核。点击提交按钮后,提示会显示问题x是否正确或不正确。基于此,数据结构必须更新,这是该问题的正确答案。

    现在冲洗并重复。这次从同一个池生成另外四组随机问题。这次,发现了两个新问题,因此必须将这些问题添加到数据结构中。应该使用类似的逻辑来找到答案。此外,每个答案选项(选择)始终附加一个唯一的数值,以便我的服务器可以使用值检查答案ID。在我的服务器端,每个问题都有一个ID,并且它与正确答案相关联。使用我的表会破坏这个实验的目的。

    视觉发生了什么:

    Pass One -- 4/10 Random Questions
    
    1. Who is the US president?
    21. Barrak
    22. Chap
    23. Jim
    24. Nivea
    
    2. How many states are there?
    25. 99
    26. 90
    27. 51
    
    3. What is the color of the sky?
    28. blue
    29. black
    30. none
    
    4. Is time relative?
    31. False
    32. True
    

    因此,在第一遍中,选择应如下所示:

    1 => a - 21
    2 => a - 99
    3 => a - 28
    4 => False - 31
    

    点击提交按钮。服务器响应:

    1. Correct
    2. Incorrect
    3. Correct
    4. Incorrect
    

    现在使用找到的正确答案更新数据结构。

    程序现在在提示符处请求新的问题集。这次服务器返回:

    Pass Two -- 4/10 Random Questions
    
    4. Is time relative?
    31. False
    32. True
    
    6. What is not a plant?
    65. Cow
    66. Rose
    67. Tree
    
    1. Who is the US president?
    21. Barrack
    22. Chap
    23. Jim
    24. Nivea
    
    8. What is a programming language?
    99. C++
    100. Tylenol
    101. Mr.Monster
    

    看,现在在这个传球上出现了两个新问题。对于这些人来说,必须选择第一个选项,但对于重复的选项,除非已经找到正确的答案,否则应该选择下一个选项。

    所以这将被发送到服务器:

    4. True - 32
    6. Cow - 65
    1. Barrack - 21
    8. C++ - 99
    

    服务器响应:

    4. Correct
    6. Correct
    1. Correct
    8. Correct
    

    同样处理回应。希望这能真正解决问题。另请注意,每个答案将始终附加一个唯一的数字值。

3 个答案:

答案 0 :(得分:1)

我认为你需要一个存储复杂数据的结构。我可能会建议这样的事情。

{ question => 'Of the Marx Brothers who appeared on screen, who is reputed '
            . 'to have evoked resentment for being the funniest offscreen?'
, answers => 
    { A => 'Groucho' 
    , B => 'Chico'
    , C => 'Harpo'
    , D => 'Zeppo'
    }
, answer       => 'D'
, user_guessed => {}
}

答案 1 :(得分:1)

将正确答案和所有可能的选项与每个问题相关联:

my %question = (

    question_123 => {
                      options => [ 'a', 'b', 'c', 'd' ],
                      answer  => 'b',
                    },
    question_155 => {
                      options => [ 'a', 'b', 'c' ],
                      answer  => 'b',
                    },
    question_234 => {
                      options => [ 'T', 'F' ],
                      answer  => 'F',
                    },
);

然后使用简单的脚本循环选项:

my %answers;
QUESTION: foreach my $q ( keys %question ) {        # Loop over questions

    for my $option ( @{ $questions{$q}{options} } ) { # Try different options

        $answers{$q} = $option;
        next QUESTION if $option eq $questions{$q}{answer}; # Move on if correct
    }
}

# Print the answers
print "$_ : $answers{$_}\n" foreach sort keys %answers;

答案 2 :(得分:0)

其他答案都可以,但我会添加一个......

如果您想为探测过程表示一些“状态”或“标志”,您只需在数据结构中添加更多字段,如下所示:

my @questions = (
    {
        text => '2 x 2?',
        answers => [
            {
                text => '2',
                tried => False,
            },
            {
                text => '3',
                tried => True,
                correct => False,
            },
            {
                text => '4',
                tried => False,
            },
        ],
    },
    ...
);

有关在Perl中处理嵌套数据结构的基础知识,请参阅http://perldoc.perl.org/perldsc.html

中的代码示例