Так ли хорош ChatGPT и действительно ли он может помочь разработчикам решать задачи? Сегодня мы выясним это, столкнувшись с задачей LeetCode с помощью ChatGPT.

Здравствуйте, мои любимые любители битов.

Для тех, кто не в курсе, что такое ChatGPT — это чат-бот, разработанный компанией OpenAI. Он имеет встроенные функции искусственного интеллекта, которые позволяют ответить на любой вопрос, включая ответ на «Ответ на жизнь, вселенную и все остальное». Кстати, сейчас 42.

Отказ от ответственности

Я не призываю вас обманывать LeetCode, и эта статья — просто забавный эксперимент с функциями ChatGPT. Я думаю, что проверять свои навыки на LeetCode или любой другой платформе должны исключительно вы, без посторонней помощи.

Но может ли ChatGPT писать код?

Написание кода

Хм, давайте попросим его написать простой код Singleton Pattern на JavaScript.

Интересно… ChatGPT определенно может реализовать Singleton Pattern и небольшую, но эффективную функцию с подсветкой кода. Давайте сразу заметим слона в комнате, по какой-то причине ChatGPT думает, что это код Kotlin, давайте пока проигнорируем его и предположим, что это просто ошибка отображения.

Но одно дело говорить о внедрении общей, широко распространенной кодовой базы, и совсем другое — решать проблемы с LeetCode.

LeetCode

Как вы все знаете, в LeetCode есть задачи (проблемы) с разной степенью сложности, мы собираемся протестировать ChatGPT для работы с каждой из них. К сожалению, ChatGPT может работать только с текстами, поэтому мы будем игнорировать проблемы с пояснениями к изображениям.

Задача легкой сложности: «Число палиндрома».

В моей учетной записи LeetCode у меня есть задача под названием «9. Число палиндрома» еще не разгадано. Посмотрим, как ChatGPT справится с этим.

Вот описание задачи:

Дано целое число x, вернуть true, если x является палиндромом, и false в противном случае.

Пример 1:

Input: x = 121
Output: true
Explanation: 121 reads as 121 from left to right and from right to left.

Пример 2:

Input: x = -121
Output: false
Explanation: From left to right, it reads -121. From right to left, it becomes 121-. Therefore it is not a palindrome.

Пример 3:

Input: x = 10
Output: false
Explanation: Reads 01 from right to left. Therefore it is not a palindrome.

Давайте попросим ChatGPT решить эту проблему.

Итак, как вы видите, ChatGPT удалось сгенерировать для нас синтаксически правильный рабочий код. Результаты кода:

function isPalindrome(x) {
    if (x < 0) return false;
    let original = x;
    let reverse = 0;
    while (x > 0) {
        reverse = reverse * 10 + (x % 10);
        x = Math.floor(x / 10);
    }
    return original === reverse;
}

Нет, давайте посмотрим, пройдет ли этот код тестовые наборы LeetCode:

ДА!

Это прошло. А по эффективности памяти — довольно эффективно.

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

"Это чертовски гениально!"

Вот код, созданный ChatGPT:

function isPalindrome(x) {
    if (x < 0 || (x % 10 === 0 && x !== 0)) return false;
    let reverse = 0;
    while (x > reverse) {
        reverse = reverse * 10 + (x % 10);
        x = Math.floor(x / 10);
    }
    return x === reverse || x === Math.floor(reverse / 10);
}

Если мы посмотрим на эффективность, то по логике вещей мы имеем раннюю отдачу, которая может помочь нам с оптимизацией производительности. Что LeetCode думает об этой оптимизации?

Как видите, с точки зрения LeetCode время выполнения сократилось с 182 мс до 171 мс, так что да, «10 баллов в ChatGPT.

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

Задача средней сложности: «Самая длинная подстрока без повторяющихся символов»

Простая задача — это простая задача, давайте посмотрим, как ChatGPT справится с более сложной задачей.

Еще раз, в моем аккаунте LeetCode у меня есть задача средней сложности с названием «Самая длинная подстрока без повторяющихся символов», вот ее описание:

Имея строку s, найдите длину самой длинной подстроки без повторяющихся символов.

Пример 1:

Input: s = "abcabcbb"
Output: 3
Explanation: The answer is "abc", with the length of 3.

Пример 2:

Input: s = "bbbbb"
Output: 1
Explanation: The answer is "b", with the length of 1.

Пример 3:

Input: s = "pwwkew"
Output: 3
Explanation: The answer is "wke", with the length of 3.
Notice that the answer must be a substring, "pwke" is a subsequence and not a substring.

Посмотрим, что выдаст ChatGPT:

Вот код:

var lengthOfLongestSubstring = function(s) {
    let map = new Map();
    let left = 0;
    let maxLength = 0;
    for (let i = 0; i < s.length; i++) {
        if (map.has(s[i]) && map.get(s[i]) >= left) {
            left = map.get(s[i]) + 1;
        }
        map.set(s[i], i);
        maxLength = Math.max(maxLength, i - left + 1);
    }
    return maxLength;
};

И теперь мы отправим его в LeetCode:

Ты видишь? LeetCode принял его, и, кстати, он довольно эффективен. Прекрасный!

Задание сложной сложности «Медиана двух отсортированных массивов»

Давайте посмотрим, как ChatGPT справится с самой сложной проблемой в LeetCode.

Вот описание задачи:

Имея два отсортированных массива nums1 и nums2 размером m и n соответственно, возвращает медиану двух отсортированных массивов.

Общая сложность времени выполнения должна быть O(log (m+n)).

Пример 1:

Input: nums1 = [1,3], nums2 = [2]
Output: 2.00000
Explanation: merged array = [1,2,3] and median is 2.

Пример 2:

Input: nums1 = [1,2], nums2 = [3,4]
Output: 2.50000
Explanation: merged array = [1,2,3,4] and median is (2 + 3) / 2 = 2.5.

Давайте скормим это чат-боту.

На этот раз он произвел тонну кода, вот код:

var findMedianSortedArrays = function(nums1, nums2) {
    let m = nums1.length, n = nums2.length;
    if (m > n) return findMedianSortedArrays(nums2, nums1);
    let imin = 0, imax = m, halfLen = Math.floor((m + n + 1) / 2);
    while (imin <= imax) {
        let i = Math.floor((imin + imax) / 2);
        let j = halfLen - i;
        if (i < m && nums2[j-1] > nums1[i]) {
            imin = i + 1;
        } else if (i > 0 && nums1[i-1] > nums2[j]) {
            imax = i - 1;
        } else {
            let maxLeft = 0;
            if (i === 0) {
                maxLeft = nums2[j-1];
            } else if (j === 0) {
                maxLeft = nums1[i-1];
            } else {
                maxLeft = Math.max(nums1[i-1], nums2[j-1]);
            }
            if ((m + n) % 2 === 1) return maxLeft;
            let minRight = 0;
            if (i === m) {
                minRight = nums2[j];
            } else if (j === n) {
                minRight = nums1[i];
            } else {
                minRight = Math.min(nums1[i], nums2[j]);
            }
            return (maxLeft + minRight) / 2;
        }
    }
    return 0;
};

Теперь давайте посмотрим, примет ли его LeetCode:

УХ ТЫ. Опять же, LeetCode принял код, созданный ChatGPT, и он довольно эффективен.

Заключение

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

К сожалению, может работать только с текстом, а это значит, что мы не можем вставлять картинки.

Сначала мы научили ИИ водить машину, потом рисовать картинки, потом генерировать тексты, и мы приходим, когда он может генерировать код. Да, ИИ еще довольно далеко, чтобы генерировать целые приложения, делать что-то более сложное, но направление уже просматривается.

ChatGPT — отличный инструмент, который определенно может помочь разработчику в повседневной работе.

На сегодня все. Надеюсь, у вас был веселый день.

Не забудьте подписаться на меня, чтобы узнать больше!

Ваша часть. 01101100 01101111 01110110 01100101