Задать вопрос
  • Как скомбинировать массивы, чтобы получить все варианты сочетаний их элементов?

    0xD34F
    @0xD34F
    Рекурсия есть:

    function combinations($arr = [], ...$arrs) {
      return count($arrs)
        ? array_merge(...array_map(
            fn($n) => array_map(
              fn($m) => [ $n, ...$m ],
              combinations(...$arrs)
            ),
            $arr
          ))
        : array_map(fn($n) => [ $n ], $arr);
    }

    Рекурсии нет:

    function combinations(...$arrs) {
      $result = [];
      $size = array_reduce($arrs, fn($acc, $n) => $acc * count($n), count($arrs) ? 1 : 0);
    
      for ($i = 0; $i < $size; $i++) {
        $row = [];
        for ($index = $i, $j = count($arrs); $j--;) {
          $row[] = $arrs[$j][$index % count($arrs[$j])];
          $index = intval($index / count($arrs[$j]));
        }
        $result[] = array_reverse($row);
      }
    
      return $result;
    }

    Как использовать в вашем случае:

    $result = array_map(
      fn($n) => implode('/', $n),
      combinations($array1, $array2, $array3)
    );
    Ответ написан
    Комментировать
  • Поиск по образцу. Как сделать быстрый поиск вхождения картинок-символов на большом чертеже?

    @dim5x
    ЗИ, ИБ. Помогли? Поблагодарите. Отметьте ответом.
    import cv2
    import numpy as np
    
    # Загрузка изображений:
    dr_image = cv2.imread('original.png')
    
    # Преобразуем в серое:
    gray = cv2.cvtColor(dr_image, cv2.COLOR_BGR2GRAY)
    
    # Бинаризация: черные линии → белые (на чёрном фоне).
    _, binary = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY_INV)
    
    # Шаблоны:
    template1 = cv2.imread('temp2.png', cv2.IMREAD_GRAYSCALE)  # ёлочка
    template2 = cv2.imread('temp1.png', cv2.IMREAD_GRAYSCALE)  # круг
    
    _, template1 = cv2.threshold(template1, 127, 255, cv2.THRESH_BINARY_INV)
    _, template2 = cv2.threshold(template2, 127, 255, cv2.THRESH_BINARY_INV)
    
    # Параметры:
    threshold1 = 0.7  # для ёлочки
    threshold2 = 0.5  # для круга
    
    # Поиск "ёлочки":
    result1 = cv2.matchTemplate(binary, template1, cv2.TM_CCOEFF_NORMED)
    loc1 = np.where(result1 >= threshold1)
    
    # Поиск "круга":
    result2 = cv2.matchTemplate(binary, template2, cv2.TM_CCOEFF_NORMED)
    loc2 = np.where(result2 >= threshold2)
    
    # Результат:
    result = dr_image.copy()
    detected_boxes = []
    
    # Обработка "ёлочки":
    for pt in zip(*loc1[::-1]):
        x, y = pt
        w, h = template1.shape[1], template1.shape[0]
        box = (x, y, x + w, y + h)
    
        if not any(np.allclose(box, b, atol=10) for b in detected_boxes):
            detected_boxes.append(box)
            cv2.rectangle(result, pt, (pt[0] + w, pt[1] + h), (0, 0, 255), 2)
            cv2.putText(result, "Tree", (pt[0], pt[1] - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 255), 1)
    
    # Обработка "круга":
    for pt in zip(*loc2[::-1]):
        x, y = pt
        w, h = template2.shape[1], template2.shape[0]
        box = (x, y, x + w, y + h)
    
        if not any(np.allclose(box, b, atol=10) for b in detected_boxes):
            detected_boxes.append(box)
            cv2.rectangle(result, pt, (pt[0] + w, pt[1] + h), (0, 255, 0), 2)
            cv2.putText(result, "Circle", (pt[0], pt[1] - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 1)
    
    # Сохраняем результат:
    cv2.imwrite('result_with_labels.png', result)
    print(f"Найдено объектов: {len(detected_boxes)}")
    
    # Показываем:
    cv2.imshow('Detected', result)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

    >>> Найдено объектов: 12

    68cd5e8cccadf938039122.png
    Ответ написан
    3 комментария
  • От чего зависит время пинга?

    Не надо путать задержку и пропускную способность.

    RTT - это задержка, измеряется в секундах (милли, микро)
    То что измеряется в битах (байтах) в секунду - это пропускная способность.

    Если очень грубыми сантехническими аналогиями, то задержка определяется длинной трубы, а пропускная способность - её шириной.

    В сетях и на то и на другое влияет очень много факторов:
    1. Количество узлов между отправителем и получателем. Больше узлов - больше задержка
    2. Производительность этих узлов. Чем ниже производительность - тем выше минимальная задержка и меньше пропускная способность.
    3. Нагрузка на каналы связи. При высокой нагрузке будет расти задержка, так как данные будут вставать в очередь (а может и не будут вставать в очередь - они вполне могут просто отбрасываться и тогда будет тот самый packet loss)
    4. То, как эти узлы обрабатывают данные, которые через них проходят. Меньше всяких проверок - меньше задержка.
    5. Физическая среда и физическая длина кабелей. Чем длиннее физический путь и чем хуже среда, тем выше задержка.
    Скорость распространения сигнала в оптике, меди, и по беспроводу отличается.

    Как будет влиять замедление от провайдера - сильно зависит от выбранной стратегии.
    Может увеличится rtt, а может будет packet loss.
    Ответ написан
    3 комментария
  • Какой посоветуете учебник/книгу JavaScript?

    Mike_Ro
    @Mike_Ro Куратор тега JavaScript
    Python, JS, WordPress, SEO, Bots, Adversting
    Ответ написан
    Комментировать
  • Безопасно ли запускать Telegram Бота на компьютере?

    402d
    @402d
    начинал с бейсика на УКНЦ в 1988
    для работы бота виртуалка должна быть доступна со стороны серверов телеграмма.
    А из-за РКН доступность вашего домашнего компа как раз хуже. То есть вместо проблем того, что вы сами не можете попасть на виртуалку будет более плохая ситуация.
    Ответ написан
    Комментировать
  • Как рассмотреть все возможные сочетания во времени случайных событий?

    @WhoMe
    Если я правильно понял пример, то он выглядит довольно линейно.
    Если предположить что X запускается только по событиям А, то логику можно оформить псевдокодом.
    На_Событие_А() {
        if "5 событий C, паузы S секунд и ещё 5 событий C" было меньше P секунда назад {
            X();
        } else if 10 событий B в окне M секунд отменяют было меньше L секунд нада {
            // не запускаем X
        } if (Последний запуск Х был позже 5 сек) или (не было ещё K событий A) {
            Х();
        }
    }


    Графически можно попробовать представить в виде систем переходов.
    680bae0d736a5965525484.png

    Где состояния:
    x_idle - Х не запущен
    x_running - X работает
    x_cooldown - N секунд с запуска X не прошло
    not_yet_K_A - K событий A еще не было
    K_A_occured - K событий A было
    L_cooldown_ON - отмена всех запусков механизма X на следующие L секунд активна
    ...
    ну и т.д.


    Событиями будут, например:
    A
    B
    C
    Запуск X
    Прошло N секунд с запуска X
    K событий A
    10 событий B в окне M секунд
    Прошло L секунд с момента 10 событий B в окне M секунд
    5 событий C, паузы S секунд и ещё 5 событий C
    Прошло P секунд (с момента 5 событий C, паузы S секунд и ещё 5 событий C)

    Соответственно, все возможные сочетания это произведение всех состояний всех систем помноженное на события.

    Т.е берем первую комбинацию
    x_idle, not_yet_K_A, l_cooldown_OFF, green_light_off и проверяем как система реагиурет на каждое событие.
    Это не законченная схема, просто направление мысли.

    Для исчерпывающих тестов также можно попробовать какой-нибудь автоматический верификатор вроде NuSMV, Alloy.
    Ответ написан
    Комментировать
  • Как реализовать функцию для вывода всех ключей объекта, включая ключи его прототипа?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Абсолютно все не получится. Там хитрая таблица.
    Невозможно одновременно получить non-enumerable own и enumerable inherited свойства, а non-enumerable inherited (созданные в родителе через Object.defineProperty) вообще не получить.
    Ответ написан
    Комментировать
  • Как сделать меняющиеся изображение, для WhatsApp, Telegram?

    Steel_Balls
    @Steel_Balls
    Для Telegram легко - делаешь форк отсюда https://github.com/DrKLO/Telegram
    Вносишь свои изменения и ставишь себе на телефон.
    Я так переделал Телеграм под свои нужды - добавил доп. шифрование, которого нет в обычных чатах (шифрование только в секретных чатах, почему-то никто об этом не знает)
    Ответ написан
    Комментировать
  • Как определить свой уровень программирования?

    @Everything_is_bad
    твой уровень программирования "школьник 9го класса, изучающий полгода java"
    Ответ написан
    1 комментарий
  • Как определить свой уровень программирования?

    Lord_of_Rings
    @Lord_of_Rings
    Дунадан - северный странник. Злой, но очень добрый
    Если твой код иногда работает, то поздравляю - ты Junior. Если понимаешь, почему не работает, то ты уже на пути в Middle'ы. А если уже ненавидишь себя за выбор пути и задумываешься о домике на берегу реки - добро пожаловать в Senior'ы
    Ответ написан
    8 комментариев
  • Macbook pro M4 и пиратский софт?

    @Yami-no-Ryuu
    Нет ли тут противоречия?
    Вы профессионал? Тогда покупка инструмента и поддержки не такие уж большие траты.
    Вы не профессионал? Тогда точно ли нужен платный Resolve? Он есть и в бесплатном варианте. Ну и ShotCut / OpenShot / CapCut для обучения, если верить Дипсик.
    Напоминает мой универ, где учили на IBM CATIA, потому что украли её.
    Ответ написан
    5 комментариев
  • Почему i? Почему переменную, используемую в циклах, обычно называют именно i?

    @alexalexes
    index. А вообще, индексы элементов массива пришли из математики - i, j, k для первых трех измерений.
    Просто, первыми компухтеры оседлали математики, отсюда и традиция в циклах использовать эти буквы.
    Ответ написан
    2 комментария
  • Как отслеживать геопозицию в реально времени в телеграмм боте?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Бот не может запросить у пользователя Live Location.
    Пользователь должен сам инициировать отправку Live Location, тогда она периодически будет обновляться через сообщения edited_message, пока не пройдёт заданный пользователем период отслеживания или пользователь сам не остановит отслеживание.
    Ответ написан
    Комментировать
  • Регистрация по номеру телефона?

    @knigaman
    Первый запрос = принимаем на сервере номер телефона, генерируем токен (случайная строка длиной, предположим, 64 символа - цифры, буквы большие и маленькие), отправляем его на клиент. Генерируем код доступа, отправляем его смской на телефон. В зависимости от логики можем и не отправлять (если допустим у нас метод для логина а такого юзера еще нет (он еще не зарегистрирован)).

    Второй запрос = отправляем с клиента токен (тот 64 символьный полученный от сервера) и строку с кодом из смс. Проверяем на сервере токен и код из смс, если все ок - пускаем в аккаунт.

    Примечания:
    1) токены и сами попытки входа должны жить определенное количество времени, предположим 5 минут.
    2) попытки ввода кода (неправильные вводы) должны быть ограничены разумным числом (ну допустим 5 попыток)
    3) если можно то лучше код сделать длиннее - хотя бы 6 цифр, а лучше 8 и более.
    4) попытки входа в аккаунт можно ограничить, но тогда будет можно абузить эту "фичу" и блокировать вход чувакам, тут выбираем меньшее из зол исходя из бизнес требований
    5) можно экономить на смсках и доставлять код в последних цифрах номера / голосовой озвучкой, отправлять в вк, ватсап, телеграм, вайбер

    500 айкью примечания для кое какой защиты от слива бюджета:
    1) можно юзать капчу (можно не всегда а когда начинается аномалия по отправке кодов - всплеск количества отправок)
    2) как уже и говорил разделение входа и регистрации
    3) ставим бот защиту от какого нибудь сервиса по защите от ддос/бот атак
    4) иногда можно не отправить код а отправить клиенту респонс что код отправлен, если клиент вводит код - скорее всего это атака. человек же запросит код повторно (потому что он тупо ему не пришел)
    5) иногда можно отправить код не сразу а через предположим, 30 секунд - если ввели код раньше - значит что-то не так
    Ответ написан
    9 комментариев
  • Как сравнить элементы одного массива с элементами другого массива?

    yarkov
    @yarkov Куратор тега JavaScript
    Помог ответ? Отметь решением.
    Методы массива some и every вам помогут
    Ответ написан
    Комментировать
  • Как отправить кружок в телеграм через telethon с помощью file_id?

    @likkkekey Автор вопроса
    Ошибка была в том, что обычный бот перед сохранением file_id отправлял не video_note, а обычное видео, а надо было именно video_note, чтобы потом юзербот, получив именно video_note, а не видео, сохранил file_id, access_hash, file_reference и пользовался ими как video_note
    Ответ написан
    Комментировать
  • Как узнать дату регистрации в вк с помощью питона?

    @alexalexes
    Только косвенным методом.
    Идентификатор в ВК последовательно возрастающий при появлении новых пользователей, поэтому можно оценить появление первых постов (или другого контента) соседей id-1 и id+1 пользователей (или другой окрестности пользователей), чтобы прикинуть, когда появился пользователь id.
    У вас будет две характеристики: не ранее даты X и не позднее даты Y.
    Ответ написан
    Комментировать
  • Загадка "проталкивания оплаты": совпадение, заговор или техническая особенность?

    @alexalexes
    Проблемы с очередью платежей.
    Ограничения API платежного шлюза.
    Блокировки или задержки на стороне сервера или базы данных.
    Конфликты с кэшированием или балансировкой нагрузки.

    Ну, так закажите аудит логов платежной части сайта, до входа в режим оплаты и есть ли возвраты на страницу сайта после оплаты.
    Если до входа нет скриптов трекинга поведения пользователей в браузере, то пусть разработчики прикрутят их, тогда сможете получать логи до самого последнего шага перед оплатой.
    Нет никакой мистики, вы просто не запрашиваете необходимый анализ при аномальных случаях, или не знаете в какой форме хотите получить отчет по логам сервера.
    Но для этого нужно обеспечить необходимый уровень журналирования на сайте (логирование), чтобы проводить такой анализ. Это нужно обговаривать в ТЗ.
    Ответ написан
    3 комментария
  • Как это посчитать?

    wataru
    @wataru Куратор тега Алгоритмы
    Разработчик на С++, экс-олимпиадник.
    Проще всего двигать элементы по одному, справа-налево. Элемент можно сдвинуть, если справа стоит 0 или такой же элемент. Поддерживаем инвариант, что все элементы правее current уже сдвинуты и уплотнены до предела. Двигаем текущий пока можем. Чтобы не было циклов не двигаем нули.
    int n = a.size();
    int current = n-1;
    while (current >= 0) {
        while (a[current] > 0 && current < n-1 && 
              ((a[current+1] == a[current]) || (a[current+1] == 0))) {
          a[current+1] += a[current];
          a[current] = 0;
          ++current;
        }
        --current;
    }
    Ответ написан
    5 комментариев