Студенты vs тесты
от web_demon
Честно долго сомневался где написать этот пост, но пусть он будет все таки в статьях. Приправлю все это самыми "сочными" кусочками кода чтоб соответствовать разделу. Все будет на php, хотя уже я умудрился все это портировать и на Android.
Суть проблемы:
Итак, как многие уже знают что учусь я в медицинском университете и может слышали что учится там очень сложно, но не верьте им, если это не сам ад, то один из филиалов точно. Ну и как во всяком вузе тут есть свои особенности. Да, учится интересно и в меру сложно, но понимаешь что все идет на пользу дела, в конце концов цена наших ошибок в будущем - человеческая жизнь. Но есть и одна сугубо отрицательная вещь - это тесты. Делались они ради благого дела, но получилось как всегда. Примерно за два-три года до того как я поступал в нашем вузе внедрили в обучение "современные технологии" и как итог на многих кафедрах (а впоследствии на всех) тестов появилось безумное количество - 1500 штук на один предмет и даже больше (интересный факт: чем больше тестов тем меньше кафедра связана с медициной), плюс ко всему иногда неадекватная шкала оценки - 50-70% правильных ответов это все еще незачет. Справляются студенты как могут - кто-то учит неделю, кто то забивает и получает два и идет с такой оценкой на экзамен, но у нас особый подход.
Итак учить лень, а плохую оценку неохота, что же делать? Разберемся! Тестов всего два вида:
Первый: тесты выложены в сеть, студент должен дома со своего ПК на сайте вуза эти тесты решить - оценка уходит в журнал.
Второй: тесты пишутся под непосредственным контролем преподов и лаборантов на кафедре.
И если с первым типом все понятно - был написан бот на php (+curl) который 30-40 раз решает эти тесты пропуская вопросы и в конце каждой попытки собирает правильные ответы. Позже бот единственный раз решает но уже правильно, используя накопленную базу, итог работы программы - вся наша группа решает тесты на отлично.
Вот плавно подходим ко второму варианту, тесты надо списать, а главное сделать это вполне реально - преподаватели прекрасно знают что найти нужный тест который рандомно выпал из тысячи ни в какой шпоре нереально, поэтому особо за студентами не смотрят, а если студент и пытается листать методичку/распечатки то только посмеиваются.
Как списать?
C бумаженок списывать нереально - была идея отсортировать все тесты по алфавиту, но шпора была похожа на общую тетрадку, размерами разве что поменьше. Тогда вспомнили про телефон - забить все в txt-файл и искать нужный тест через поиск - но опять же набрать нужный вопрос это очень долго - а времени всего 30 секунд на вопрос.
После нескольких дней размышлений в голову пришла одна идея - а что если искать тесты по первой букве каждого слова. Например для теста:
Пути распространения эпидемических болезней средневековья: - искать прэбс. Идея оказалась настолько удачная, что впоследствии оказалось не надо было вводить все буквы, хватало первых 3, максимум 4 букв и вопрос уже находился. Было решено организовать онлайн-сервис где вводив эти самые буквы можно было получить список из совпадений по тестам. Плюс еще планировалась программа под андроид - все таки хоть и не часто, но на телефоне может периодически отваливаться интернет, что в момент списывания - просто катастрофа.
Итак, приступим.
Все тесты и правильные ответы к ним кафедры заботливо выкладывают в вордовских файликах на сайте, нам это только на руку. Скачиваем, копируем их в txt-файл и заносим маленьким скриптом в базу. Тесты обычно разделены друг от друга двойным переносом, поэтому хватает банального и прохода полученного массива циклом с целью отделить сам текст вопроса + выдрать регулярками правильные ответы. Приводить что-то конкретное не буду, все зависит от способов выделения правильных ответов. Бывает что ответы находятся в отдельном файлике, поэтому приходится разбирать и его. Позже пришлось, правда, отказаться от хранения вопросов в базе Mysql и сделать свой универсальный формат для базы с тестами, чтоб подходил и для онлайн сервиса, и для программы для андрюши.
Общая структура файлика с базами (пускай расширение будет .wdt):
Название предмета|||вно;;;внд|||вопрос номер один;;;вопрос номер два|||ответ к вопросу 1;;;ответ к вопросу 2
Поскольку базы были уже собраны, пришлось их конвертировать в wdt-файлы:
Тут важен механизм построение файлика с базами тестов.
В итоге $filedata[0] содержит название предмета, $pre_head - первые буквы каждого слова в вопросе теста, $test_heads - сами вопросы, $test_bodies - правильные ответы.
И теперь самый "сок" - ищем подходящие тесты в нашей базе:
Вот что в итоге получилось у меня:
Вводим "ксм" получаем:
PS:
Не знаю пригодится кому-нибудь или нет полученный опыт, но все таки надеюсь что было полезно.
Суть проблемы:
Итак, как многие уже знают что учусь я в медицинском университете и может слышали что учится там очень сложно, но не верьте им, если это не сам ад, то один из филиалов точно. Ну и как во всяком вузе тут есть свои особенности. Да, учится интересно и в меру сложно, но понимаешь что все идет на пользу дела, в конце концов цена наших ошибок в будущем - человеческая жизнь. Но есть и одна сугубо отрицательная вещь - это тесты. Делались они ради благого дела, но получилось как всегда. Примерно за два-три года до того как я поступал в нашем вузе внедрили в обучение "современные технологии" и как итог на многих кафедрах (а впоследствии на всех) тестов появилось безумное количество - 1500 штук на один предмет и даже больше (интересный факт: чем больше тестов тем меньше кафедра связана с медициной), плюс ко всему иногда неадекватная шкала оценки - 50-70% правильных ответов это все еще незачет. Справляются студенты как могут - кто-то учит неделю, кто то забивает и получает два и идет с такой оценкой на экзамен, но у нас особый подход.
Итак учить лень, а плохую оценку неохота, что же делать? Разберемся! Тестов всего два вида:
Первый: тесты выложены в сеть, студент должен дома со своего ПК на сайте вуза эти тесты решить - оценка уходит в журнал.
Второй: тесты пишутся под непосредственным контролем преподов и лаборантов на кафедре.
И если с первым типом все понятно - был написан бот на php (+curl) который 30-40 раз решает эти тесты пропуская вопросы и в конце каждой попытки собирает правильные ответы. Позже бот единственный раз решает но уже правильно, используя накопленную базу, итог работы программы - вся наша группа решает тесты на отлично.
Вот плавно подходим ко второму варианту, тесты надо списать, а главное сделать это вполне реально - преподаватели прекрасно знают что найти нужный тест который рандомно выпал из тысячи ни в какой шпоре нереально, поэтому особо за студентами не смотрят, а если студент и пытается листать методичку/распечатки то только посмеиваются.
Как списать?
C бумаженок списывать нереально - была идея отсортировать все тесты по алфавиту, но шпора была похожа на общую тетрадку, размерами разве что поменьше. Тогда вспомнили про телефон - забить все в txt-файл и искать нужный тест через поиск - но опять же набрать нужный вопрос это очень долго - а времени всего 30 секунд на вопрос.
После нескольких дней размышлений в голову пришла одна идея - а что если искать тесты по первой букве каждого слова. Например для теста:
Пути распространения эпидемических болезней средневековья: - искать прэбс. Идея оказалась настолько удачная, что впоследствии оказалось не надо было вводить все буквы, хватало первых 3, максимум 4 букв и вопрос уже находился. Было решено организовать онлайн-сервис где вводив эти самые буквы можно было получить список из совпадений по тестам. Плюс еще планировалась программа под андроид - все таки хоть и не часто, но на телефоне может периодически отваливаться интернет, что в момент списывания - просто катастрофа.
Итак, приступим.
Все тесты и правильные ответы к ним кафедры заботливо выкладывают в вордовских файликах на сайте, нам это только на руку. Скачиваем, копируем их в txt-файл и заносим маленьким скриптом в базу. Тесты обычно разделены друг от друга двойным переносом, поэтому хватает банального
- $array = explode("\n\r\n\r",file_get_contents('file_with_tests.txt'));
Общая структура файлика с базами (пускай расширение будет .wdt):
Название предмета|||вно;;;внд|||вопрос номер один;;;вопрос номер два|||ответ к вопросу 1;;;ответ к вопросу 2
Поскольку базы были уже собраны, пришлось их конвертировать в wdt-файлы:
Тут важен механизм построение файлика с базами тестов.
Открыть спойлер
Нехитрым кодом читаем наш файлик subject.wdt:- $id = 'subject';
- $filedata = file_get_contents('subject.wdt');
- $filedata = explode('|||', $filedata);
- $pre_head = explode(';;;', $filedata[1]);
- $test_heads = explode(';;;', $filedata[2]);
- $test_bodies = explode(';;;', $filedata[3]);
В итоге $filedata[0] содержит название предмета, $pre_head - первые буквы каждого слова в вопросе теста, $test_heads - сами вопросы, $test_bodies - правильные ответы.
И теперь самый "сок" - ищем подходящие тесты в нашей базе:
- //Чтоб не было проблем с кодировкой в строковых функциях
- mb_internal_encoding('UTF-8');
- //Получаем введенные данные
- $let = trim($_POST['letters']);
- //Делаем ограничение, ибо если ввести одну букву,
- // не каждый телефон переварит страницу полученной длины
- if(mb_strlen($let) < 2)
- exit('Минимум 2 буквы!');
- foreach($pre_head AS $key => $value)
- {
- //отсеиваем тесты где общее количество слов меньше полученных букв
- if(mb_strlen($value) >= $let)
- {
- //обрезаем данные из $pre_head до количества введенных символов
- $ch_to = mb_substr($value, 0, mb_strlen($let));
- if($ch_to == $let)
- {
- echo '<span style="color:red">'.$test_heads[$key].'</span><br/>';
- echo $test_bodies[$key].'<hr/>';
- }
- }
- }
Вот что в итоге получилось у меня:
Вводим "ксм" получаем:
PS:
Не знаю пригодится кому-нибудь или нет полученный опыт, но все таки надеюсь что было полезно.