Задать вопрос
  • Почему в styled-components нельзя использовать такую обёртку?

    Alexandroppolus
    @Alexandroppolus
    кодир
    Рискну предположить, что Table - это и есть Component1.

    Ты передаешь в Component1 проп children, но в самом компоненте этот проп, к сожалению, не используется.

    надобно:
    function Component1({children}) {
      return (
    <StyledComponent1>
          <p>Wrapper</p>
          {children}
    </StyledComponent1>
      );
    }


    куда именно воткнуть children внутри Component1 - это уж сам решай, но куда-то придётся.

    в Component2 и Component3 тоже следует сделать так. Ну и читать доку, пока голова не отвалится.
    Ответ написан
  • Почему происходит задержка изменения состояния?

    Alexandroppolus
    @Alexandroppolus
    кодир
    item.price = item.price * item.count


    у тебя стоимость растет пропорционально факториалу )) 1 экземпляр стоит 1 рубль, а 4 экземпляра - уже 24 рубля (это если были только +1, а при нажатиях на -1 будет совсем наркомания).

    вообще не нужно хранить price в состоянии. Это производный стейт, он вычисляется из другого стейта.
    Ответ написан
    Комментировать
  • А как предков вывести?

    Alexandroppolus
    @Alexandroppolus
    кодир
    здесь никакой bfs не нужен.

    Стартовое число в итоге будет повернуто на 0, 1, 2 или 3 вправо (это разница поворотов вправо и влево). То есть возможны 4 стратегии. Тебе надо сравнить 4 различных сдвигов исходного числа, посчитав для каждого сдвига суммарную стоимость преобразований.

    например,
    A = 2573
    B = 4164

    нулевой сдвиг дает стоимость действий 1 и 2: (4-2) + (5-1) + (7-6) + (4-3) = 2 + 4 + 1 + 1 = 8, плюс ещё надо здесь прикинуть оптимальную стратегию разворотов и посчитать, сколько их будет.

    сдвиг на 1 вправо (стартовое число 3257) по действиям 1 и 2 выходит (4-3) + (2-1) + (6-5) + (7-4) = 6, и снова надо прикинуть развороты.

    определив таким образом оптимальную - самую дешевую - стратегию (т.е. определив, насколько в итоге будет повернуто исходное число), выстраиваешь цепочку переходов.
    Ответ написан
  • Что означает регулярное выражение "(.)\\1*"?

    Alexandroppolus
    @Alexandroppolus
    кодир
    повтор некоторого символа один или более раз.

    символ ловится в скобки (.), далее \1 означает пойманный символ (точнее, то что попалось в первые по счету скобки), и его повторяют.
    Ответ написан
    7 комментариев
  • Как проксировать файл через 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
    Ответ написан
    Комментировать
  • Как синхронно прочитать 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, 0);
    Ответ написан
    Комментировать
  • Как установить булево значение через 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(), тогда клик не дойдет до кнопки

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