Чіткоди для Літкода #1: проходимо LeetCode Contest за допомогою Selenium WebDriver та ChatGPT
Підписуйтеся на Telegram-канал «DOU #tech», щоб не пропустити нові технічні статті.
Всім привіт, мене звати Олександр, я — Software Engineer. Нещодавно я написав статтю «ChatGPT проти LeetCode: як алгоритм справляється з LeetCode-задачами різної складності» і думаю, що історія була б не закінчена, якби я не спробував ChatGPT для вирішення завдань зі справжнього LeetCode Contest.
У цій статті я хочу розповісти про те, як я автоматизував розв’язання задач з LeetCode Contest за допомогою Selenium WebDriver та ChatGPT.
Скажу одразу — ChatGPT все ще не вивозить, а LeetCode мої облікові записи не заблокував ... поки що.
Про правила LeetCode Contest
Думаю, що навіть ті, хто ніколи не брав участі у контесті на LeetCode розуміють, що існують певні правила, при порушенні яких користувача можуть дискваліфікувати або навіть заблокувати LeetCode акаунт. Тому було б дуже наївно просто копіпастити опис завдання до ChatGPT, а рішення назад до LeetCode.
Правила доволі чітко описані на сторінці будь-якого контесту, наприклад, якщо зайти на Weekly Contest 328 ми побачимо список того, що робити не можна:
- сабмітити одне й те ж рішення з різних облікових записів (що доволі логічно, бо можна завести декілька акаунтів, зайти на контест під одним, витратити час на вирішення завдань, а далі зайти під іншим акаунтом, і просто скопіювати вже готові рішення);
- заважати іншим користувачам брати участь у контесті (не можу сказати, що тут мається на увазі, можливо вони хочуть сказати, що не можна DDoS-ти їх платформу під час контесту);
- розголошувати рішення до задач контесту та обговорювати їх публічно до того, як змагання закінчилося (тут в принципі також все логічно, але зазвичай вже через 10 хвилин після початку рішення можна знайти на YouTube);
Також окремо сказано, що в них нульова терпимість до плагіату та шахрайства. Але ж це не шахрайство, якщо вас не спіймали, правда? 😉
Трошки про код та архітектуру
З точки зору архітектури я вирішив зробити два додати на Node.js. Перший додаток — selenium-webdriver-js-server, відкриває вікно браузера, та контролює його. Другий додаток — leetcode-js-client, відправляє команди до selenium-webdriver-js-server та «розмовляє» з ChatGPT. Додатки між собою спілкуються за допомогою REST. Виглядає це приблизно так:
Маємо декілька ендпоінтів:
POST /leetcode --data @credentials.js
— відправляє username та password і виконує логін у LeetCode;GET /leetcode/:contest
— відкриває сторінку контесту, парсить її та повертає список завдань з посиланнями на них;GET /leetcode/:contest/task?url=...&language=...
— відкриває сторінку завдання, парсить її та повертає опис задачі та темплейт коду, який пропонує LeetCode;POST /leetcode/:contest/task?url=...&language=... --data @solution.js
— відкриває сторінку завдання і набирає код, який згенерував ChatGPT.
Між 3 та 4 leetcode-js-client спілкується з ChatGPT, відправляючи йому щось приблизно таке:
const message = [ `Write ${language} algorithm to solve problem below:`, taskDescription, 'Use code template below:', taskCodeTemplate ].join(newLine);
А назад отримує розв’язання задачі у вигляді коду:
``` class Solution { ... } ```
Дуже добре, що в режимі API ChatGPT просто повертає код, а не пише доповідь, як він це робить у браузерній версії.
Також довелося зробити так, щоб код набирався так, нібито його пише людина. Тобто Selenium WebDriver не просто вставляє код, який згенерував ChatGPT у редактор, а набирає його по одній літері з інтервалом від 25 до 75 мілісекунд. Якщо не дуже зрозуміло, що я маю на увазі, можливо буде легше подивитися на це в коді.
Для інтеграції з ChatGPT API я використовую бібліотеку chatgpt-api.
З точки зору коду все. Якщо цікаво послухати мої думки під час розробки та подивитись, як я пишу код, то про це я зробив окремі відео англійською та іншою мовами.
Що там LeetCode Contest
Додатки я протестував на трьох контестах по декілька разів, використовуючи різні акаунти. Результат був приблизно однаковий — ChatGPT стабільно вирішує одне завдання: або легке, або середнього рівня складності. Жодного разу ChatGPT не впорався з двома завданнями з одного контесту.
Ось, наприклад, результат участі у Weekly Contest 331:
До речі, жоден з моїх трьох облікових записів досі не заблокували та не попередили.
Висновки
Навіть враховуючи те, що ChatGPT не в змозі самостійно вирішити всі 4 завдання, я дуже високо оцінюю його у ролі помічника, бо менше ніж за 4 хвилини я отримав 1 вирішене завдання та «майже робочі» шаблони коду для 3 інших завдань.
В цілому, моя думка про ChatGPT не змінилася, я впевнений, що він витіснить Stack Overflow, але йому все одно буде не просто писати код для складних систем та інтеграцій.
Що далі
Ви, мабуть, помітили, що у назві статті є #1, а це значить, що планується ще #2.
Насправді я почав з розробки Chrome Extension для LeetCode Contest, але зіткнувся з проблемою набирання коду у CodeMirror редакторі, який використовує LeetCode під час контесту. Я спробував Selenium WebDriver і виявилося, що webdriver.WebElement#sendKeys працює з CodeMirror взагалі без проблем, тому я вирішив працювати далі з тим, що працювало.
Як виявилося, це було правильне рішення, бо 8 січня 2023 OpenAI вирішив заблокувати ChatGPT API й наразі воно не працює. Ще я слідкую за Microsoft, який анонсував новий Bing на основі ChatGPT, але там ще немає нормального API, зате є список очікування, пріоритет в якому отримують ті, хто використовує Microsoft Edge браузер у повсякденному житті. Є ще декілька набагато менших гравців у цій області, але їм ще дуже далеко до ChatGPT.
6 коментарів
Додати коментар Підписатись на коментаріВідписатись від коментарів