Итак, дорогой читатель. Эта тема будет интересна тем, кто по образовательной программе должен закрывать на баллы stepik курсы, связанные с программированием. (Ну, или просто тем, кому это интересно). В данной теме рассмотрим курс от ВШЭ (как я понял) "Введение в алгоритмы. Практикум.". Курс рассчитан на пиТоНиСтоВ. Сам лично курс прохожу в качестве внеочередной тренировки моЗга. Представьте, что вам нужно срочно решить задачу до дедлайна (который через полчаса). Как быстро пройти встроенные тесты?
Уверен, мой способ не отличается сильной оригинальностью и остроумием, но, тем не менее, нигде подобной фишки я не видел. (Дада, я просто хочу набрать симпы, но ничем более оригинальным поделиться я с вами, товарищи, не могу)
Итак приступим:
Имеется достаточно интересная задача олимпиадного уровня:
Почему-то именно на этой задаче мне вспомнился интересный инцидент. Года 3-4 тому назад, на всероссийской олимпиаде нашелся умник, который в качестве ответа тестировал код, который пересылает ему входные данные тестов прямо ему на почту. Т.е. он узнал все входные данные от всех тестов (которые, естественно держатся в секрете), после чего ручками на бумажке рассчитывал ответ и, как итог, делал банальную if else конструкцию, реагирующую должным образом на соответствующие входные данные. Олимпиаду этот товарищ закрыл на максимальный балл, но аннулировали ли его результат или нет я так и не знаю.
Я решил повторить такой трюк, на что получил ошибку, которая говорила о том, что машина, на которой проводятся тесты не подключена к интернету:
(способ тестировал на другой задаче, но это не так важно. На всех задачах проверку ведет одна и та же машина)
После чего в голову пришла следующая мысль: раз мы можем видеть на экране все ошибки, которые выдает нам система при неудачном выполнении кода, то почему бы нам не выводить в качестве ошибки "нашу собственную ошибку"? В качестве ответа я написал следующую программу и отправил ее на тестирование. Результат меня сильно порадовал
Т.е., в качестве ошибки мы увидели входные данные, которые подаются в первом тесте. (Можно заметить, что они и так отображаются. Да, это так, но это только для первого из восьми тестов. Дальше такой халявы не будет).
*Здесь стоит отметить, что способ является рабочим в том случае, если кол-во тестов не очень большое. Ибо, если тестов порядка 500-1000 - вы, конечно, сможете получить входные данные на каждый тест, но... хаха. Вы запаритесь*
Итак, весь мой дальнейший способ работает по след. алгоритму:
1) Считываем входные данные
2) Если ответ для данного input известен - выводим его
3) Иначе кидаем исключение, в котором выводим наши входные данные
Поехали:
Первый тест успешно прошли. Выводим input на второй тест на экран.
То же самое, но уже для 3го теста.
Дополняем по той же схеме код, пока не кончатся тесты. Итоговый вариант у меня выглядел так:Посмотреть вложение 28939
(Данные о тесте, а так же имя скрыто, т.к. аккаунт является учебным, и мне очень не хочется портить репутацию человека.)
Как вы видим. Все тесты успешно пройдены. Программа - идеальная - работает за O(1) :).
Спасибо, что дочитали до конца. Не кидайтесь какахами, мало ли кто найдет данный материал для себя полезным.
Успехов - решайте задачки сами
Уверен, мой способ не отличается сильной оригинальностью и остроумием, но, тем не менее, нигде подобной фишки я не видел. (Дада, я просто хочу набрать симпы, но ничем более оригинальным поделиться я с вами, товарищи, не могу)
Итак приступим:
Имеется достаточно интересная задача олимпиадного уровня:
Почему-то именно на этой задаче мне вспомнился интересный инцидент. Года 3-4 тому назад, на всероссийской олимпиаде нашелся умник, который в качестве ответа тестировал код, который пересылает ему входные данные тестов прямо ему на почту. Т.е. он узнал все входные данные от всех тестов (которые, естественно держатся в секрете), после чего ручками на бумажке рассчитывал ответ и, как итог, делал банальную if else конструкцию, реагирующую должным образом на соответствующие входные данные. Олимпиаду этот товарищ закрыл на максимальный балл, но аннулировали ли его результат или нет я так и не знаю.
Я решил повторить такой трюк, на что получил ошибку, которая говорила о том, что машина, на которой проводятся тесты не подключена к интернету:
(способ тестировал на другой задаче, но это не так важно. На всех задачах проверку ведет одна и та же машина)
После чего в голову пришла следующая мысль: раз мы можем видеть на экране все ошибки, которые выдает нам система при неудачном выполнении кода, то почему бы нам не выводить в качестве ошибки "нашу собственную ошибку"? В качестве ответа я написал следующую программу и отправил ее на тестирование. Результат меня сильно порадовал
Т.е., в качестве ошибки мы увидели входные данные, которые подаются в первом тесте. (Можно заметить, что они и так отображаются. Да, это так, но это только для первого из восьми тестов. Дальше такой халявы не будет).
*Здесь стоит отметить, что способ является рабочим в том случае, если кол-во тестов не очень большое. Ибо, если тестов порядка 500-1000 - вы, конечно, сможете получить входные данные на каждый тест, но... хаха. Вы запаритесь*
Итак, весь мой дальнейший способ работает по след. алгоритму:
1) Считываем входные данные
2) Если ответ для данного input известен - выводим его
3) Иначе кидаем исключение, в котором выводим наши входные данные
Поехали:
Первый тест успешно прошли. Выводим input на второй тест на экран.
То же самое, но уже для 3го теста.
Дополняем по той же схеме код, пока не кончатся тесты. Итоговый вариант у меня выглядел так:Посмотреть вложение 28939
(Данные о тесте, а так же имя скрыто, т.к. аккаунт является учебным, и мне очень не хочется портить репутацию человека.)
Как вы видим. Все тесты успешно пройдены. Программа - идеальная - работает за O(1) :).
Спасибо, что дочитали до конца. Не кидайтесь какахами, мало ли кто найдет данный материал для себя полезным.
Успехов - решайте задачки сами
Вложения
Последнее редактирование: