Найти в Дзене
Одна из задач с HH была на линейные уравнения. Как-то до этого не приходилось такое решать. Чтобы посмотреть все примеры быстренько попросил нейросетку Дипсик. Она косячила, но на третий раз справилась, стоило чутка поправить вывод. Алиса провалилась на этой задаче. Сама задача, у нас есть линейное уравнение. Простое, без скобок, умножений, тупо что-то такое "3x + 5 = 10x - 5" или такое "3.14159 + z - 10z = 181 - 0.15z". Задача вывести корень уравнения до тысячного знака. Так как я раньше такое не решал, то возникли некоторые сложности. Особенно в рамках ограничения в 40 минут. Моё решение получилось примерно по такой логике: разделяем выражение на два по знаку равно. А дальше довольно сложная логика с тем, что переносим иксы влево, числа вправо. Меняем знаки если символ был - или не меняем если полюсом. Оно работает, но дальше я решил показать Алисе свой код и сказать вот так надо было. Обычно она после этого старается улучшить код и не всегда удачно, но в этот раз красиво. Выделю отдельные моменты для себя, о которых раньше не знал. 1) Можно использователь генератор, чтобы найти букву в строке. variable = next((ch for ch in equation if ch.isalpha()), '') То есть питон начинает вычислять выражение, и как только находит букву, то останавливается. Удобнее чем через цикл с break. Идея в том, чтобы неизвестную переменную сохранить в отдельную переменную в коде. 2) Не использовать булеву переменную как знак и дротить её туда-сюда, а через регулярку сгруппировать tokens = re.findall(r'([+-])([^+-]*)', expr). Фактически будет список кортежей, первый элемент которого содержит знак, а второй само число(2 или 3х). Будет косяк, если не добавить в начало + или -, то есть "+3x+5", тогда хорошо. 3) Фактически сразу вычисляет сумму чисел с иксом и просто чисел. То же повторяем для выражения справа. 4) Получаем 4 переменных и вычисляем итог. В моем варианте я пытался делать это сразу. Да, работает, но её вариант понятнее. А вот и сам её код, решает простые линейные уравнения: def solve_linear_equation(equation: str) -> str:    # Нормализуем строку: заменяем пробелы и разделяем по '='    equation = equation.replace(' ', '')    left, right = equation.split('=')    # Находим переменную (первую букву в уравнении)    variable = next((ch for ch in equation if ch.isalpha()), '')    def parse_expression(expr: str) -> tuple[float, float]:    """    Парсит выражение и возвращает:    - коэффициент при переменной;    - свободный член.    """    coeff = 0  # коэффициент при переменной    const = 0  # свободный член    # Добавляем '+' в начало, если нет знака    if not expr.startswith(('+', '-')):    expr = '+' + expr    # Разбиваем на токены по знакам    import re    tokens = re.findall(r'([+-])([^+-]*)', expr)    for sign, term in tokens:    # Определяем знак: +1 или -1    sign_val = 1 if sign == '+' else -1    if variable in term:    # Извлекаем коэффициент при переменной    coeff_str = term.replace(variable, '')    if not coeff_str:  # случай 'x' или '-x'    coeff_val = 1.0    else:    coeff_val = float(coeff_str)    coeff += sign_val * coeff_val    else:    # Свободный член    const += sign_val * float(term)    return coeff, const    # Парсим обе части уравнения    left_coeff, left_const = parse_expression(left)    right_coeff, right_const = parse_expression(right)    # Переносим всё в одну сторону: (left_coeff - right_coeff) * x = right_const - left_const    total_coeff = left_coeff - right_coeff    total_const = right_const - left_const    # Решаем уравнение    if total_coeff == 0:    if total_const == 0:    return f"{variable} = любое число"    else:    return "Нет решений"    else:    solution = total_const / total_coeff    return f"{variable} = {round(solution, 3)}" Капец он тут код ненавидит. Но да ладно. Суть будет понятна. Через месяц можно будет повторить тест, а пока я почерпнул кучу нового)
1 месяц назад
Побитовые операторы в Python << и ~
Один из мини вопросов на hh. Типа какая операция между такими-то операторами не корректна. Я до этого даже не слышал про операторы как << и ~. Поэтому решил отдельно сделать небольшую статью касательно того, что это за звери и зачем нужны. ``` a = 11 # в двоичной системе: 1011 step = 1 c = a << step # сдвиг на 1 позицию влево print(c) # вывод: 22 (в двоичной системе: 10110) ``` Применение: - используется для быстрого умножения числа на степень двойки (сдвиг на n позиций влево эквивалентен умножению на 2^n); - низкоуровневое программирование, работа с битовыми масками, оптимизация кода...
1 месяц назад
Периодически тыкаю проверку ИТ-компетенций на HH.ru. Поэтому в рамках постов или статей буду отмечать какие-то моменты с которыми возникли сложности и прорабатываю их отдельно. Пока по python, потом по SQL, потом и Java доберется. Итоак, первый момент. Не сказал бы, что это нужно в реально практике,но есть такое выражение на питоне: ```python a = 0 + 1 and False * 2 | 7 and 15 ``` Нужно понять, что оно вернет. Логика в том, что при истинности выражения возвращается последнее истинное. То есть в данном случае вернется 15. Причем выбор будет `7 and 15` и вернется 15?! Почему? И зачем вообще нужна такая проверка в реале?! Ну да ладно. Запомнили. Так же для `15 and 7` вернется 7. Просто последнее значение истины. Хорошо. Тогда что будет, если я изменю истинное на ложное? ```python a = 0 + 1 and False * 2 | 0 and 15 ``` Вернется 0. Типа тот момент, где выражение стало ложным...Хм. Если ложное будет в начале, то вернется 0 сразу. Вообще я вижу некоторое применение этому, но это так не очевидно и так ломает мозг тому, кто будет за мной этот код читать. Впрочем, если хотим сломать кому-то мозг, то есть вариант.
1 месяц назад
Yandex браузер не запускается на линукс (РЕД ОС 8)
Ну что ж...вот я и, возможно, вы встречаемся с новыми(старыми проблемами). Сегодня вырубали свет, но я спокойно выключил свою ред о эсину. Позже включили иии...яндекс перестал запускаться. Круть. На ровном месте, ничего не менял в системе. Ничего не обновлял. Выдавал ошибку следующего содержания: Unable to show a dialog outside the UI thread message loop: Yandex - Скорее всего, профиль используется другим процессом Яндекс.Браузер (30834) на другом компьютере (localhost.localdomain). Во избежание сбоев профиль был заблокирован...
1768 читали · 1 год назад
Yandex браузер на линукс(Ред ОС), не работает Rutube
Добрый день. Если вы это читаете, то скорее всего столкнулись с проблемой воспроизведения видео на яндекс браузере для линукса(может быть вк, рутьюб или еще какие сайты).У меня Ред ОС 8 и версия браузера 24.4.3.1113 stable corp (64-bit). После первого крупного обновления яндекс браузера отвалился рутьюб. Да, появился раздел "нейро", но оно того не стоило. Написал в тех.поддержку, но увы мне так и не смогли помочь. Сегодня наткнулся на обсуждение в группе вк по ОС РОСА, где еще в 2023 году люди обсуждали похожую проблему...
1011 читали · 1 год назад
Один бот в разных скриптах (Python)
Задача: работает малозагруженный бот и нужно придумать как его использовать в других скриптах. По сути эта статья для себя - помнить про плюсы свойств объектов. Прочитал много статей на эту тему, пытался нагуглить, но большинство ответов, если не все, сводились к использованию вебхуков (Webhook). Коротко - у нас есть свой сервер, мы на нём размещаем бота, значит есть ip, и отправляем сообщение в очередь, а наш бот оттуда берет эти сообщения(смотря как настроить) и отправляет "по адресу". Решение отличное, работает как нужно, но неэффективное в моём случае и требует много затрат(условно, смотря с чем сравнить)...
1 год назад
Pytube скачиваем видео с YouTube
Данная статья актуальна на 11.05.2022 г. и возможно позже, если Youtube не обновлялся. К сожалению, существует уже очень давняя проблема с "content-lengh". Некоторые видео невозможно скачать. Как я понял, разрабы несколько забросили своё творение и поддерживают постольку-поскольку, но в целом им можно пользоваться. Сейчас для скачивание таких проблемных видео я использую "yt-dlp". Возможно, позже напишу статейку и для него. Задача: скачать видео в максимальном качестве + превью. Устанавливаем модуль pytube: pip install pytube Небольшое, но очень важное отступление...
308 читали · 3 года назад