Перейти к содержимому


Вопрос с несколькими рукописными вариантами ответа


В теме одно сообщение

#1 Medic84

    Новичок

  • Пользователи
  • Pip
  • 1 сообщений

Отправлено 22 Январь 2016 - 11:38

Здравствуйте. Интересует такой вопрос.
Есть некий вопрос, в котором нужно варианты ответа написать от руки (другие варианты не подходят, люди догадаются)

Впринципе я составил достаточно правильную регулярку на этот случай, но возникает проблема: если человек ошибется хотя бы в названии, или напишет 3 правильных варианта ответа и 1 неправильный (или просто что то добавит несуществующее), то вопрос засчитывается неверным. Можно ли как то по другому составить данные вопросы?

Вопрос:
Какие жанры печатной журналистики Вы знаете? (Назовите не менее 3 жанров)

Регулярка:
((Заметка|репортаж|интервью|рецензия|статья|журналистское расследование|фельетон|очерк|письмо|вопрос-ответ),?\s?){3,}


#2 Administrator

    Менеджер проекта

  • Администраторы
  • 1 109 сообщений

Отправлено 22 Январь 2016 - 15:50

Здравствуйте!

Такие вопросы лучше в регулярки не добавлять, обязательно будут какие-то правильные ответы засчитанные неверно. Пользователь может ввести не запятые, а пробелы, нужно уточнять, что именно нужно разделить запятыми. При этом если он поставит лишний пробел перед запятой или два пробела после нее, то Ваша регулярка крякнет. При этом та проблема, которую Вы указали, что если введет неверный ответ, то тоже не работает. Это относится если он введет неверный ответ в середине. Если неверным ответом будет первый или последний, то нормально, а с серединой проблемы. Эту задачу полюбому можно как-то решить, но все равно останутся какие-то другие проблемы.

Вот это более лояльная запись:
(Заметка.*|репортаж.*|интервью.*|рецензия.*|статья.*|журналистское расследование.*|фельетон.*|очерк.*|письмо.*|вопрос-ответ.*){3,}

Все равно как там пользователь будет разделять эти слова и все равно, что между правильными ответами затеряются неправильные. Главное, чтобы пользователь ввел любые 3 и более фразы из списка. Но все равно остается ещё одна проблема, которая заключается в том, что пользователь может дать один и тот же ответ 3 раза "очерк очерк очерк" и это будет считаться верным. Но это маловероятно (он или хитрый программист или просто упоротый, если так сделает).

Я знаю как решить Вашу задачу, но это будет многокиллометровая запись.

<?php
    function gen_wc(array $array)
    {
        $res = array();

        for ($i = 1; $i < pow(2, count($array)); ++$i) {
            $pre = array();
            for ($j = 0; $j < count($array); ++$j) {
                if ($i & pow(2, $j)) {
                    $pre[] = $array[$j];
                };
            };

            if(count($pre)==3) $res[] = $pre;
        };

        return $res;
    };

    $words = array('заметка','репортаж','интервью','рецензия','статья','журналистское расследование','фельетон','очерк','письмо','вопрос-ответ');
    $combinations = gen_wc($words);
    print_r($combinations);

    $str = '';
    foreach($combinations as $combination)
    {
        $str .= '(';
        foreach($combination as $word)
        {
            $str .= '(=?.*'.$word.')';
        }
        $str .= ')|';
    }
    $str = substr($str,0,-1);
    echo $str;
?>

Функция генерации комбинаций взята из инета. Надеюсь, что работает верно. Вот что получилось в результате:

((=?.*заметка)(=?.*репортаж)(=?.*интервью))|((=?.*заметка)(=?.*репортаж)(=?.*рецензия))|((=?.*заметка)(=?.*интервью)(=?.*рецензия))|((=?.*репортаж)(=?.*интервью)(=?.*рецензия))|((=?.*заметка)(=?.*репортаж)(=?.*статья))|((=?.*заметка)(=?.*интервью)(=?.*статья))|((=?.*репортаж)(=?.*интервью)(=?.*статья))|((=?.*заметка)(=?.*рецензия)(=?.*статья))|((=?.*репортаж)(=?.*рецензия)(=?.*статья))|((=?.*интервью)(=?.*рецензия)(=?.*статья))|((=?.*заметка)(=?.*репортаж)(=?.*журналистское расследование))|((=?.*заметка)(=?.*интервью)(=?.*журналистское расследование))|((=?.*репортаж)(=?.*интервью)(=?.*журналистское расследование))|((=?.*заметка)(=?.*рецензия)(=?.*журналистское расследование))|((=?.*репортаж)(=?.*рецензия)(=?.*журналистское расследование))|((=?.*интервью)(=?.*рецензия)(=?.*журналистское расследование))|((=?.*заметка)(=?.*статья)(=?.*журналистское расследование))|((=?.*репортаж)(=?.*статья)(=?.*журналистское расследование))|((=?.*интервью)(=?.*статья)(=?.*журналистское расследование))|((=?.*рецензия)(=?.*статья)(=?.*журналистское расследование))|((=?.*заметка)(=?.*репортаж)(=?.*фельетон))|((=?.*заметка)(=?.*интервью)(=?.*фельетон))|((=?.*репортаж)(=?.*интервью)(=?.*фельетон))|((=?.*заметка)(=?.*рецензия)(=?.*фельетон))|((=?.*репортаж)(=?.*рецензия)(=?.*фельетон))|((=?.*интервью)(=?.*рецензия)(=?.*фельетон))|((=?.*заметка)(=?.*статья)(=?.*фельетон))|((=?.*репортаж)(=?.*статья)(=?.*фельетон))|((=?.*интервью)(=?.*статья)(=?.*фельетон))|((=?.*рецензия)(=?.*статья)(=?.*фельетон))|((=?.*заметка)(=?.*журналистское расследование)(=?.*фельетон))|((=?.*репортаж)(=?.*журналистское расследование)(=?.*фельетон))|((=?.*интервью)(=?.*журналистское расследование)(=?.*фельетон))|((=?.*рецензия)(=?.*журналистское расследование)(=?.*фельетон))|((=?.*статья)(=?.*журналистское расследование)(=?.*фельетон))|((=?.*заметка)(=?.*репортаж)(=?.*очерк))|((=?.*заметка)(=?.*интервью)(=?.*очерк))|((=?.*репортаж)(=?.*интервью)(=?.*очерк))|((=?.*заметка)(=?.*рецензия)(=?.*очерк))|((=?.*репортаж)(=?.*рецензия)(=?.*очерк))|((=?.*интервью)(=?.*рецензия)(=?.*очерк))|((=?.*заметка)(=?.*статья)(=?.*очерк))|((=?.*репортаж)(=?.*статья)(=?.*очерк))|((=?.*интервью)(=?.*статья)(=?.*очерк))|((=?.*рецензия)(=?.*статья)(=?.*очерк))|((=?.*заметка)(=?.*журналистское расследование)(=?.*очерк))|((=?.*репортаж)(=?.*журналистское расследование)(=?.*очерк))|((=?.*интервью)(=?.*журналистское расследование)(=?.*очерк))|((=?.*рецензия)(=?.*журналистское расследование)(=?.*очерк))|((=?.*статья)(=?.*журналистское расследование)(=?.*очерк))|((=?.*заметка)(=?.*фельетон)(=?.*очерк))|((=?.*репортаж)(=?.*фельетон)(=?.*очерк))|((=?.*интервью)(=?.*фельетон)(=?.*очерк))|((=?.*рецензия)(=?.*фельетон)(=?.*очерк))|((=?.*статья)(=?.*фельетон)(=?.*очерк))|((=?.*журналистское расследование)(=?.*фельетон)(=?.*очерк))|((=?.*заметка)(=?.*репортаж)(=?.*письмо))|((=?.*заметка)(=?.*интервью)(=?.*письмо))|((=?.*репортаж)(=?.*интервью)(=?.*письмо))|((=?.*заметка)(=?.*рецензия)(=?.*письмо))|((=?.*репортаж)(=?.*рецензия)(=?.*письмо))|((=?.*интервью)(=?.*рецензия)(=?.*письмо))|((=?.*заметка)(=?.*статья)(=?.*письмо))|((=?.*репортаж)(=?.*статья)(=?.*письмо))|((=?.*интервью)(=?.*статья)(=?.*письмо))|((=?.*рецензия)(=?.*статья)(=?.*письмо))|((=?.*заметка)(=?.*журналистское расследование)(=?.*письмо))|((=?.*репортаж)(=?.*журналистское расследование)(=?.*письмо))|((=?.*интервью)(=?.*журналистское расследование)(=?.*письмо))|((=?.*рецензия)(=?.*журналистское расследование)(=?.*письмо))|((=?.*статья)(=?.*журналистское расследование)(=?.*письмо))|((=?.*заметка)(=?.*фельетон)(=?.*письмо))|((=?.*репортаж)(=?.*фельетон)(=?.*письмо))|((=?.*интервью)(=?.*фельетон)(=?.*письмо))|((=?.*рецензия)(=?.*фельетон)(=?.*письмо))|((=?.*статья)(=?.*фельетон)(=?.*письмо))|((=?.*журналистское расследование)(=?.*фельетон)(=?.*письмо))|((=?.*заметка)(=?.*очерк)(=?.*письмо))|((=?.*репортаж)(=?.*очерк)(=?.*письмо))|((=?.*интервью)(=?.*очерк)(=?.*письмо))|((=?.*рецензия)(=?.*очерк)(=?.*письмо))|((=?.*статья)(=?.*очерк)(=?.*письмо))|((=?.*журналистское расследование)(=?.*очерк)(=?.*письмо))|((=?.*фельетон)(=?.*очерк)(=?.*письмо))|((=?.*заметка)(=?.*репортаж)(=?.*вопрос-ответ))|((=?.*заметка)(=?.*интервью)(=?.*вопрос-ответ))|((=?.*репортаж)(=?.*интервью)(=?.*вопрос-ответ))|((=?.*заметка)(=?.*рецензия)(=?.*вопрос-ответ))|((=?.*репортаж)(=?.*рецензия)(=?.*вопрос-ответ))|((=?.*интервью)(=?.*рецензия)(=?.*вопрос-ответ))|((=?.*заметка)(=?.*статья)(=?.*вопрос-ответ))|((=?.*репортаж)(=?.*статья)(=?.*вопрос-ответ))|((=?.*интервью)(=?.*статья)(=?.*вопрос-ответ))|((=?.*рецензия)(=?.*статья)(=?.*вопрос-ответ))|((=?.*заметка)(=?.*журналистское расследование)(=?.*вопрос-ответ))|((=?.*репортаж)(=?.*журналистское расследование)(=?.*вопрос-ответ))|((=?.*интервью)(=?.*журналистское расследование)(=?.*вопрос-ответ))|((=?.*рецензия)(=?.*журналистское расследование)(=?.*вопрос-ответ))|((=?.*статья)(=?.*журналистское расследование)(=?.*вопрос-ответ))|((=?.*заметка)(=?.*фельетон)(=?.*вопрос-ответ))|((=?.*репортаж)(=?.*фельетон)(=?.*вопрос-ответ))|((=?.*интервью)(=?.*фельетон)(=?.*вопрос-ответ))|((=?.*рецензия)(=?.*фельетон)(=?.*вопрос-ответ))|((=?.*статья)(=?.*фельетон)(=?.*вопрос-ответ))|((=?.*журналистское расследование)(=?.*фельетон)(=?.*вопрос-ответ))|((=?.*заметка)(=?.*очерк)(=?.*вопрос-ответ))|((=?.*репортаж)(=?.*очерк)(=?.*вопрос-ответ))|((=?.*интервью)(=?.*очерк)(=?.*вопрос-ответ))|((=?.*рецензия)(=?.*очерк)(=?.*вопрос-ответ))|((=?.*статья)(=?.*очерк)(=?.*вопрос-ответ))|((=?.*журналистское расследование)(=?.*очерк)(=?.*вопрос-ответ))|((=?.*фельетон)(=?.*очерк)(=?.*вопрос-ответ))|((=?.*заметка)(=?.*письмо)(=?.*вопрос-ответ))|((=?.*репортаж)(=?.*письмо)(=?.*вопрос-ответ))|((=?.*интервью)(=?.*письмо)(=?.*вопрос-ответ))|((=?.*рецензия)(=?.*письмо)(=?.*вопрос-ответ))|((=?.*статья)(=?.*письмо)(=?.*вопрос-ответ))|((=?.*журналистское расследование)(=?.*письмо)(=?.*вопрос-ответ))|((=?.*фельетон)(=?.*письмо)(=?.*вопрос-ответ))|((=?.*очерк)(=?.*письмо)(=?.*вопрос-ответ))

Текст оказался таким большим, что даже возник глюк с его вставкой в область ввода регулярки. В общем с этим лучше не связываться. Может быть есть решения проще. Просто нужно быть "особенным", чтобы уметь писать сложные вещи на регулярках.

В следующей версии программы появится функция Эссе, когда можно будет создавать вопросы, где ответы ручного ввода должен будет проверить и проставить баллы сам администратор с последующим автоматическим пересчетом баллов.




Ответить



  


Количество пользователей, читающих эту тему: 1

0 пользователей, 1 гостей, 0 анонимных