Организаторы школьной олимпиады по информатике борются со списыванием и исключают работы с совпадающими ответами.
Мы попробуем показать, что это ведет к исключению лучших работ.
Вообще говоря, тот факт, что лучшие работы олимпиады с выбором правильного ответа из нескольких предложенных будут неизбежно совпадать, очевиден, но попробуем это доказать.
Создадим таблицу вопросов:
create table oly_quests (id number primary key, quest varchar2(400))
;
select * from oly_quests
;
1 Вопрос 1
2 Вопрос 2
Создадим таблицу ответов - олимпиада в стиле "выберите правильный ответ":
create table oly_answs (id number primary key, quest_id number, answ varchar2(400), is_correct number)
;
select * from oly_answs
;
1 1 Ответ 1 на вопрос 1 0
2 1 Ответ 2 на вопрос 1 1
3 2 Ответ 1 на вопрос 2 1
4 2 Ответ 2 на вопрос 2 0
- по этой таблице организаторы будут проверять правильность сданных участниками работ, правильные ответы имеют (см. последний столбец) ключ 1, неправильные ключ 0; участники, конечно же эти ключи не видят.
Предположим, что участник участвовал в олимпиаде многократно, достаточно, чтоб перебрать все сочетания вопросов и ответов. Соответственно, полностью правильная версия работы существует, равно как и неправильная(ые):
select quest, answ
from oly_quests q, oly_answs a
where a.quest_id = q.id
;
Вопрос 1 Ответ 1 на вопрос 1
Вопрос 1 Ответ 2 на вопрос 1
Вопрос 2 Ответ 1 на вопрос 2
Вопрос 2 Ответ 2 на вопрос 2
Генерируем несколько участников:
select 'Участник '||level as student from dual connect by level <= 3
;
Участник 1
Участник 2
Участник 3
Пусть теперь все участники переберут все варианты сочетаний вопрос-ответ:
with t as (select 'Участник '||level as student from dual connect by level <= 3)
select student, quest, answ
from t, oly_quests q, oly_answs a
where a.quest_id = q.id
order by 1, 2, 3
;
Участник 1 Вопрос 1 Ответ 1 на вопрос 1
Участник 1 Вопрос 1 Ответ 2 на вопрос 1
Участник 1 Вопрос 2 Ответ 1 на вопрос 2
Участник 1 Вопрос 2 Ответ 2 на вопрос 2
Участник 2 Вопрос 1 Ответ 1 на вопрос 1
Участник 2 Вопрос 1 Ответ 2 на вопрос 1
Участник 2 Вопрос 2 Ответ 1 на вопрос 2
Участник 2 Вопрос 2 Ответ 2 на вопрос 2
Участник 3 Вопрос 1 Ответ 1 на вопрос 1
Участник 3 Вопрос 1 Ответ 2 на вопрос 1
Участник 3 Вопрос 2 Ответ 1 на вопрос 2
Участник 3 Вопрос 2 Ответ 2 на вопрос 2
Отберем только лучшие работы, т.е. только те, где все ответы правильные, добавив в запрос условие and is_correct = 1:
with t as (select 'Участник '||level as student from dual connect by level <= 3)
select student, quest, answ
from t, oly_quests q, oly_answs a
where a.quest_id = q.id
and is_correct = 1
order by 1, 2, 3
;
Участник 1 Вопрос 1 Ответ 2 на вопрос 1
Участник 1 Вопрос 2 Ответ 1 на вопрос 2
Участник 2 Вопрос 1 Ответ 2 на вопрос 1
Участник 2 Вопрос 2 Ответ 1 на вопрос 2
Участник 3 Вопрос 1 Ответ 2 на вопрос 1
Участник 3 Вопрос 2 Ответ 1 на вопрос 2
Здесь уже доказано, что все лучшие работы будут идентичными. Запишем это более наглядно:
with t as (select 'Участник '||level as student from dual connect by level <= 3)
select student, listagg(answ, '; ') within group (order by q.id, a.id) as correct_olymp
from t, oly_quests q, oly_answs a
where a.quest_id = q.id
and is_correct = 1
group by student
order by 1
;
Участник 1 Ответ 2 на вопрос 1; Ответ 1 на вопрос 2
Участник 2 Ответ 2 на вопрос 1; Ответ 1 на вопрос 2
Участник 3 Ответ 2 на вопрос 1; Ответ 1 на вопрос 2
Лучшие работы неизбежно совпадают.
Выбросить их означает выбросить лучших участников олимпиады.