Комментарии 13
Автор, у тебя пытливый мозг.
И не лень тебе такие задачки под новый год решать? )
Решена она была несколько раньше, сейчас решил написать только. Есть еще вариант на C#.
Круто, но по-моему, оптимальным инструментом для этого является prolog
Ушел ровно час. Немного смутил 12-й вопрос — пришлось предположить, что в нём подходит ровно один вариант ответа (с учётом вопроса 19 это могло быть и не так).
Предлагаю использовать этот (или подобный) метод для КАПЧИ на адекватность пользователя, сидящего за компьютером. (усталость, болезнь, опьянение)
Вместо букв в вариантах ответов — можно использовать изображения.
Будет, по-моему, отличный фильтр!
Ну нельзя такое писать в рабочее время: полтора часа убил на решение на mySQL!
Получилось так — lexx918.ru/works/?id50=58 (простите уж за говновёрстку: не дизайнер я и не верстальщик).
Запрос отрабатывает за 100мс. Но, возможно, просто машина пошустрее попалась.
На какой версии (и сборке) MySQL у вас отрабатывает за 100мс? У меня меньше, чем за 250 мс не отдается нигде.
Первое что пришло в голову, так это создать граф где каждый узел это вопрос, затем соединяем узлы направленными дугами в зависимости от того, как тот или иной вопрос зависит от другого вопроса. К примеру, вопрос 6 зависит от вопроса 17, значит создаем дугу от 17 к 6. В итоге производим топологическую сортировку и начинаем решать вопросы в зависимости от того, как узлы были отсортированы.
Примерно так и решил на C# — даже без графа. Для каждого вопроса выписал. от какого ответа он зависит. Затем отсортировал список вопросов так, чтобы требуемое количество вариантов ответов возрастало. То есть, например, чтобы проверить, выполняется ли условие 6 и условие 17, достаточно только ответов 6 и 17. Поэтому перебираю в двух вложенных циклах только их и переходим к дальнейшему анализу только если условия истинны. Добавляю циклы по 10 и 16 ответам, проверяю их условия 10 и 16 вопросов. Добавляю 7 и 8 ответы, проверяю 7 условие и так далее. Результат работает быстро, но на анализ взаимосвязей вопросов и написание программы у меня ушло намного больше времени, чем на написание запроса «в лоб».
Хмъ, ничего особенного в решении не вижу — элементарно в лоб прописаны условия. Я как минимум его сократил бы раза в два-три по количеству кода.
Например,
  (select level a from dual connect by level <= 5) q1,
  (select level a from dual connect by level <= 5) q2,
  (select level a from dual connect by level <= 5) q3,
  (select level a from dual connect by level <= 5) q4,
  (select level a from dual connect by level <= 5) q5,
  (select level a from dual connect by level <= 5) q6,
  (select level a from dual connect by level <= 5) q7,
  (select level a from dual connect by level <= 5) q8,
  (select level a from dual connect by level <= 5) q9,
  (select level a from dual connect by level <= 5) q10,
  (select level a from dual connect by level <= 5) q11,
  (select level a from dual connect by level <= 5) q12,
  (select level a from dual connect by level <= 5) q13,
  (select level a from dual connect by level <= 5) q14,
  (select level a from dual connect by level <= 5) q15,
  (select level a from dual connect by level <= 5) q16,
  (select level a from dual connect by level <= 5) q17,
  (select level a from dual connect by level <= 5) q18,
  (select level a from dual connect by level <= 5) q19,
  (select level a from dual connect by level <= 5) q20

сократить до:
with g as (select level a from dual connect by level <= 5)
select * 
from g  q1, g  q2, g  q3, g  q4, g  q5, g  q6, g  q7, g  q8, g  q9, g q10
    ,g q11, g q12, g q13, g q14, g q15, g q16, g q17, g q18, g q19, g q20
Да, элементарно в лоб, причем сознательно. Даже заведомо ложные условия — для того, чтобы соответствие исходному вопросу было очевидно.
Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.