Найти тему
Oracle APEX

Детская олимпиада по информатике

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

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

Создадим таблицу вопросов:

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

Лучшие работы неизбежно совпадают.
Выбросить их означает выбросить лучших участников олимпиады.