Чіткоди для Літкода #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. Виглядає це приблизно так:

Маємо декілька ендпоінтів:

  1. POST /leetcode --data @credentials.js — відправляє username та password і виконує логін у LeetCode;
  2. GET /leetcode/:contest — відкриває сторінку контесту, парсить її та повертає список завдань з посиланнями на них;
  3. GET /leetcode/:contest/task?url=...&language=... — відкриває сторінку завдання, парсить її та повертає опис задачі та темплейт коду, який пропонує LeetCode;
  4. 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.

👍ПодобаєтьсяСподобалось3
До обраногоВ обраному0
LinkedIn
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

а звідки аі буде брати код, якщо со вмре?

Навіщо його брати зі Stack Overflow якщо можна брати напряму від програмістів?

А взагалі ви підіймаєте важливе питання, бо якщо абсолютно всі будуть використовувати штучний інтелект, то хто буде створювати нове? Чи можливо штучний інтелект дійде до того, щоб створювати щось дійсно нове ...

Як будете вирішувати проблему, що не кожне рабоче рішення підходить по складності?
Тобто, наприклад ChatGPT може сгенерувати правильне рішення на O(N^2), але с данними лімітами приймаются лише рішення зі складністю кращою за цю.

Підключати свій мозок 🙂

До речі, ми записували інтервʼю з творцем контенту на LeetCode: dou.ua/...​leetcode-content-creator

Цікаве інтервʼю 👍

Підписатись на коментарі