• Как проксировать файл через express/node?

    Alexandroppolus
    @Alexandroppolus
    кодир
    Как-то так
    response.pipe(res);
    file не нужен
    Ответ написан
    Комментировать
  • Как решить задачу по JS?

    Alexandroppolus
    @Alexandroppolus
    кодир
    Вариант для bigint, который быстро считает результат даже для громадных чисел:

    // вспомогательная функция
    function countDig(n, pow, pow10, pow9) {
        const dig = n / pow10;
        const count = dig < 6n ? dig : dig - 1n;
        return count * pow9 + (dig === 5n || pow < 1n ? 0n : countDig(n % pow10, pow - 1n, pow10 / 10n, pow9 / 9n));
    }
    
    // количество беспятёрочников на отрезке [0...n-1]
    function countWithout5(n) {
        let pow = 0n, pow10 = 1n;
        while (pow10 * 10n <= n) {
            pow++;
            pow10 = pow10 * 10n;
        }
        return countDig(n, pow, pow10, 9n ** pow);
    }
    
    function count(min, max) {
        if (min > max) {
            return 0n;
        }
        if (min >= 0n) {
            return countWithout5(max + 1n) - countWithout5(min);
        }
        if (max <= 0n) {
            return countWithout5(1n - min) - countWithout5(-max);
        }
        return countWithout5(max + 1n) + countWithout5(1n - min) - 1n;
    }
    
    count(4n, 17n);  // 12n
    
    count(-3455534n, 1731643265265475472546254726454363145657453757347547n);
    // результат 7912695757329425999049503116097171379949505558054n


    в решении используется тот факт, что на отрезке от 0 до (10^k)-1 включительно (то есть для неотрицательных чисел длиной не более k) существует всего 9^k чисел, не содержащих пятерку. Почему столько? Это числа длиной k, если слева дозаполнить нулями, и на каждом разряде возможно 9 разных цифр, итого 9^k вариантов.
    Ответ написан
    Комментировать
  • Как решить задачу про поиск за логарифмическую сложность?

    Alexandroppolus
    @Alexandroppolus
    кодир
    гугли по словам "upper_bound" и "lower_bound"

    основное их отличие от поиска - нет досрочного выхода из цикла, если (n === array[middle]). То есть поиск идет до упора, пока интервал не схлопнется до нуля.

    Пашка раскрыл тему здесь: https://www.youtube.com/watch?v=9Wjzf8KKvYQ
    Ответ написан
    Комментировать
  • Как решить задачу на алгоритмы?

    Alexandroppolus
    @Alexandroppolus
    кодир
    если букв и особенно цифр очень много, то можно оптимизировать:
    1) Для каждой стороны получить массив точек с цифрами и отсортировать по расстоянию от левого края или от верха.
    2) Далее для каждой буквы проверять каждую из 4 сторон. При проверке стороны находить на этой стороне цифру, ближайшую к букве, например двоичным поиском, и уже смотреть расстояние до этой цифры. Далее сравнивать результаты для каждой из сторон, выбирать минимум.
    Ответ написан
    2 комментария
  • Как синхронно прочитать Blob?

    Alexandroppolus
    @Alexandroppolus
    кодир
    Старый добрый XMLHttpRequest вроде бы до сих пор поддерживает синхронный режим. Правда, ругается страшно..
    В общем, попробуй URL.createObjectURL + XMLHttpRequest (+URL.revokeObjectURL)
    Ответ написан
    6 комментариев
  • Как при помощи метода forEach указать условие?

    Alexandroppolus
    @Alexandroppolus
    кодир
    const countSheeps(array) => array.reduce((count, item) => item===true  ? count + 1 : count);
    Ответ написан
    Комментировать
  • Почему в этом регулярном выражении всё равно пропускаются пробелы(при валидации) в начале и конце строки?

    Alexandroppolus
    @Alexandroppolus
    кодир
    у тебя там /s, а надо \s
    Ответ написан
    Комментировать
  • Как установить булево значение через computed?

    Alexandroppolus
    @Alexandroppolus
    кодир
    Ответ написан
    Комментировать
  • Как можно реализовать алгоритм замены подстроки в строке?

    Alexandroppolus
    @Alexandroppolus
    кодир
    Две идеи. Как применить, пока не очень понятно.
    1) вместо строки использовать двусвязный список символов. Это поможет делать замены более экономно, не растрачивая память и не сдвигая толпу символов. Хотя, если строки В и С одинаковой длины, можно и массивом обойтись, но это частный случай, не думаю что надо с ним возиться.
    2) сделали первый обход с заменами. Теперь новые вхождения заменяемой строки надо искать не по всей получившейся строке, а только там, где были замены (в районе левого и правого краев вставленной строки; так же условие гарантирует, что В не является подстрокой С). Точнее, даже так: сначала просмотреть строку А, найти (средствами стандартной библиотеки) все вхождения В и поместить их в очередь, потом перегнать строку А в двусвязный список, и далее по принципу обхода в ширину - берем из очереди позицию для замены, делаем замену, находим новые позиции замены (одну или две), добавляем в очередь, тут ещё проверить, что эти вновь добавленные позиции ни с кем не пересекаются..

    Да, этот способ не позволяет сократить число замен, но это уже лучше, чем на каждом этапе заново искать позиции.

    Дальнейшее ускорение - как то сократить число замен, поскипав промежуточные и вычислив результат, но тут много кейсов, и навскидку сказать трудно.
    Ответ написан
  • Как скачать файл с сервера?

    Alexandroppolus
    @Alexandroppolus
    кодир
    Конкретно здесь проблема в том, что ты скачиваешь бинарный файл в строку, а потом эту строку упаковываешь в блоб (при этом, несмотря на type: 'application/zip', конструктор Blob кодирует строку как utf8). XMLHttpRequest и fetch позволяют сразу получить данные как блоб.

    конкретно здесь лучше не "выпендриваться", а просто воткнуть that.downloadDocumentListUrl в window.location.href или a.href, напрямую, без этих твоих xhr, createObjectURL и т.д.
    Ответ написан
    1 комментарий
  • Как предотвратить выход нарисованного прямоугольника за границы области?

    Alexandroppolus
    @Alexandroppolus
    кодир
    сначала определи w, h, angle
    вычисли W и H - размеры ограничивающего прямоугольника (неповернутого прямоугольника, в который вписан твой прямоугольник)
    потом определи центр
    x, y = (np.random.randint(W/2, 640-W/2), np.random.randint(H/2, 480-H/2))

    то есть x - от W/2 до 640-W/2, если я правильно понял что такое np.random.randint
    Ответ написан
  • Как выводить вложенные массивы, с API в ReactJS?

    Alexandroppolus
    @Alexandroppolus
    кодир
    Похоже, у тебя на всё про всё только один useState для modalActive, и при клике по кнопке Info все модалки всплывают на свет божий.

    храни в стейте name (или id) выбранного персонажа
    для модалки устанавливай проп active={item.name === activeName}
    Ответ написан
    Комментировать
  • Когда использовать useReducer, а когда useState?

    Alexandroppolus
    @Alexandroppolus
    кодир
    если новое значение стейта не зависит от текущего значения, то однозначно - useState.

    а если зависит, то useReducer может быть удобнее (как минимум, в ряде случаев позволит обойтись без useCallback), но тут лучше посмотреть на оба варианта и сравнить, какой больше нравится. Хотя вот в простом случае, если в dispatch не нужно кидать параметр, то useReducer явно лучше
    Ответ написан
    Комментировать
  • Как правильно рендерить рекурсивный массив используя useMemo?

    Alexandroppolus
    @Alexandroppolus
    кодир
    reply.replies = [newReply,...reply.replies]
    setReplies(rootReplies=>[...rootReplies])

    ты неправильно обрабатываешь стейт. По факту здесь меняется содержимое некоего узла, а потом возвращается поверхностная копия всего дерева.

    есть 3 варианта:
    1) Продолжать использовать дерево в useState. Но менять его надо иммутабельно. То есть если у какого-то узла что-то поменялось, то надо заменить узел и все его паренты, а не только корневой массив.
    2) Нормализовать данные в плоскую структуру. Каждому реплаю присваивается уникальный id, все реплаи складываются в объект, где ключем будет id. В массиве replies у каждого объекта будут лежать не сами объекты, а только id, и потом надо будет их соединять во время рендера. Этот вариант канонично используется для redux, но как зайдет для useState, навскидку не совсем понятно.
    3) Использовать MobX с этими его observable.deep (или просто observable). Как всегда, самый простой и удобный вариант.
    Ответ написан
    Комментировать
  • Какой тип давать event, при вводе данных в инпут, в typescript?

    Alexandroppolus
    @Alexandroppolus
    кодир
    e: React.ChangeEvent<HTMLInputElement>

    но если ты создаешь функцию прямо в пропсе элемента (как в примере из вопроса), то тип для e можно не указывать - функция протипизируется "снаружи".
    Ответ написан
    Комментировать
  • Как наложить pattern в JS в форме круга?

    Alexandroppolus
    @Alexandroppolus
    кодир
    Сотвори path на канве, и закрась его через fill

    https://developer.mozilla.org/ru/docs/Web/API/Canv... и т.д.
    https://developer.mozilla.org/ru/docs/Web/API/Canv...
    Ответ написан
    Комментировать
  • Как дождаться выполнения промиса?

    Alexandroppolus
    @Alexandroppolus
    кодир
    а как выглядит этот твой "btn submit"? какая у него верстка?
    если внутри него есть дочерний элемент, то повесь "click" на этот чилд и вызывай e.stopPropagation(), тогда клик не дойдет до кнопки

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

    Alexandroppolus
    @Alexandroppolus
    кодир
    а точно нужен объект WhenChange?
    если вместо одного объекта передавать в функцию аргументы по отдельности, то всё просто
    interface User {
       name: string
       age: number
       validate: boolean
    }
    
    let data = {}
    
    function handleChange<K extends keyof User>(field: K, value: User[K]) {
      data = {
       [field]: value,
      };
    }
    
    handleChange('validate', true);


    с объектом такое не прокатывает, приходится резолвить генерик вручную
    Ответ написан
  • Как решить задачу по теории вероятности с карандашами разных цветов?

    Alexandroppolus
    @Alexandroppolus
    кодир
    везде далее C(x, y) - количество сочетаний
    С(x, y) = x! / (y! * (x-y)!)
    https://ru.wikipedia.org/wiki/%D0%A1%D0%BE%D1%87%D...

    Итак, сначала считаем 2 синих

    количество способов выбрать 6 из 17 карандашей равно
    C(17, 6)
    количество удачных выборов (когда выбрали 2 синих из 6, и 4 не синих из 11) равно
    C(6, 2) * C(11, 4)

    вероятность выбрать 2 синих равна C(6, 2) * C(11, 4) / C(17, 6)

    далее считаем условную вероятность выбрать хотя бы один красных, при том, что 2 синих мы таки выбрали.

    всего возможных выборов, как ранее говорилось, C(11, 4)

    из них неудачных способов, то есть когда ни одного красного, C(4, 4) = 1, то есть среди этих 4 карандашей только черные.
    вероятность не выбрать красные получается 1/C(11, 4)
    тогда вероятность выбрать хотя бы один красный равна (C(11, 4) - 1) / C(11, 4)

    но это была условная вероятность. А полная будет произведением

    P = (C(6, 2) * C(11, 4) / C(17, 6)) * (C(11, 4) - 1) / C(11, 4)
    Ответ написан
    Комментировать
  • Как конвертировать svg в react в двоичное .png?

    Alexandroppolus
    @Alexandroppolus
    кодир
    попробуй закинуть картинку на canvas и потом получить блоб для отправки на бэк
    Ответ написан
    Комментировать