• Как сконвертировать color-mix в rgb/hex?

    Alexandroppolus
    @Alexandroppolus
    кодир
    getComputedStyleвозвращает значение в формате 'color(srgb 0.5 0.5 1)'

    Выловить отсюда 3 числа регексом, каждое умножить на 255 и округлить, вот собственно они и есть.
    Но это, насколько я понимаю, для "in srgb". У тебя ведь такие?
    Ответ написан
    1 комментарий
  • Что не так с вызовом кастомного хука в React?

    Alexandroppolus
    @Alexandroppolus
    кодир
    Нельзя просто так взять и вызвать хук в обработчике события. Да, здесь он как бы "внутри" Item, но это обман зрения )

    вот так попробуй:
    const useHint = (hintTime?: number): VoidFunction => {
      const dispatch = useAppDispatch();
    
      return () => {
        dispatch({ type: setHintState.type, payload: { state: true } })
        setTimeout(() => {
          dispatch({ type: setHintState.type, payload: { state: false } })
        }, hintTime && 300);
      };
    };
    
    ...
    
    const Item: FC = () => {
      const runHint = useHint(500);
    
      return (
        <>
            <CopyButton
              className='contacts-group-item-field__btn'
              onClick={() => {
                runHint(500);
                navigator.clipboard.writeText('test')
              }}
            />
        </>
      )
    }
    Ответ написан
    Комментировать
  • Какую сложность алгоритма мы получаем при суммировании выборки из начал массива?

    Alexandroppolus
    @Alexandroppolus
    кодир
    Каждый shift сдвигает все элементы массива, т.е. один shift - O(N), а весь обход - O(N^2)

    не используй его в цикле, если у тебя длинный массив
    Ответ написан
    7 комментариев
  • Почему мой тайпскрипт сбоит и как это пофиксить?

    Alexandroppolus
    @Alexandroppolus
    кодир
    const TextEditor: React.FC<{
      value: string;
      setValue: (value: string) => void;
    }> = ...
    Ответ написан
    4 комментария
  • Как составить дерево из вложенных значений в скобки?

    Alexandroppolus
    @Alexandroppolus
    кодир
    конкретно в данном случае (только числа) можно воспользоваться парсингом JSON, предварительно доработав напильником строку
    const result = JSON.parse(
      '(1 (20 (400 5 60 (700) 108 (90)) 3))'
      .replaceAll('(', '[')
      .replaceAll(')', ']')
      .replace(/(\d|\])(?=\s+\d|\s*\[)/g, '$&,'));


    ----
    ну а если по-честному, то надо обходить строку, и либо рекурсией, либо со стеком.

    Примерно так:
    код внутри
    function getTree(str) {
        const tokens = str.match(/\d+|[()]/g);
    
        const stack = [];
        let currentArr = null;
    
        for(let i = 0; i < tokens.length; ++i) {
            const token = tokens[i];
            if (token === ')') {
                if (!stack.length) {
                    return currentArr;
                }
                currentArr = stack.pop();
            } else if (token === '(') {
                const newArr = [];
                if (currentArr) {
                    currentArr.push(newArr);
                    stack.push(currentArr);
                }
                currentArr = newArr;
            } else {
                if (currentArr) {
                    currentArr.push(parseInt(token));
                }
            }
        }
        return currentArr;
    }
    
    const result = getTree('(1 (20 (400 5 60 (700) 108 (90)) 3))');


    Сначала парсим строку, получаем токены, в нашем случае это скобки и числа. Обходим токены, имея на руках стек и текущий массив. Если очередной токен - число, добавляем его в текущий массив, если открывашка, то создаем новый массив, добавляем его в текущий, потом текущий кладем в стек, а новый назначаем текущим. Если закрывашка, то забираем массив из стека.
    То же самое можно сделать через рекурсию, попробуй сам, если интересно.
    Ответ написан
    4 комментария
  • Получение координат графика в Canvas?

    Alexandroppolus
    @Alexandroppolus
    кодир
    сначала взять пиксели изображения через getImageData

    потом найти на них фиолетовые пиксели
    Ответ написан
    Комментировать
  • Почему типы написаны так?

    Alexandroppolus
    @Alexandroppolus
    кодир
    для чего в первом типе используют K extends keyof Exist< O >

    Exist - то же самое, что утилитарный тип NonNullable, он выкидывает из типа O значения undefined и null, что в данном случае абсолютно бессмысленно, ибо на О уже есть ограничение, которому нуллы не соответствуют.

    почему изначально проверка any[] extends A

    потому что условию extends readonly any[] соответствуют как массивы, так и кортежи. any[] extends A - проверка, что это именно массив.

    условие с infer точно отработает, оно соответствует исходному ограничению на А. Но оно здесь опять же не в тему, потому что PickFromArray< number[], 'qqq' > дает number | undefined, что разумеется бред.

    K extends keyof A рассматривается для кейса, когда А оказался не массивом, а кортежем.

    в целом написано довольно бестолково, возможно с помощью чатаГПТ
    предложу более универсальный вариант
    type PickFromObject<O extends {}, K> = O extends O ? K extends K
      ? number extends K
        ? O[K & keyof O] | undefined
        : `${number}` extends K
          ? O[K & keyof O] | undefined
          : [never[], K] extends [O, number | `${number}`]
            ? O[K & keyof O] | undefined
            : K extends keyof O ? O[K] : undefined
      : never : never;


    этот PickFromObject работает как с объектами, так и с массивами/кортежами
    Ответ написан
    Комментировать
  • Алгоритм поиска маршрута?

    Alexandroppolus
    @Alexandroppolus
    кодир
    Если линии, связывающие точки, одинаковы по стоимости/весу/длине, то проще всего поиск в ширину
    Ответ написан
    Комментировать
  • Как в typescript объединить ключи, и если появляются повторы, то сделать объединение типов?

    Alexandroppolus
    @Alexandroppolus
    кодир
    Запилил такой вариант.

    Поддерживаются вложенные объекты и массивы (кортежи), см. пример. Глубина рекурсии произвольная, но результат получается здоровенный, если много всего.

    Решение влоб: сначала находим все пути до простых значений, потом по множеству этих путей собираем объект.
    Ответ написан
    3 комментария
  • Как тут найти функцию площади?

    Alexandroppolus
    @Alexandroppolus
    кодир
    Это известная задача, которую можно решить без интегрирования. Возьми любое сечение твоей фигуры плоскостью x = const. Это равнобедренный прямоугольный треугольник с катетом длиной а и площадью S1 = a*a/2
    Если заменить все эти сечения секторами окружности с углом 45 гр и радиусом тоже a (площадью S2 = Пи*a*a/8), то вся фигура превратится в 1/8 часть шара. Ну и понятно, что объём твоей фигуры равен объему 1/8 шара с радиусом 3, умноженному на S1/S2
    Ответ написан
  • По какой логике bind принимает только первый контекст?

    Alexandroppolus
    @Alexandroppolus
    кодир
    Просто его так задумали. "Кто первый встал, того и тапки". Могли сделать по-другому, но сделали - так.
    Ответ написан
    Комментировать
  • Как показать зависимость скорости от O(nlogn)?

    Alexandroppolus
    @Alexandroppolus
    кодир
    данная сортировка содержит 2 вложенных цикла, и в каждом из них длина внутреннего цикла зависит от итерации.
    надо посчитать суммы длин внутренних циклов для всех итераций внешних.
    для обоих рассматриваем худший случай.

    1) построение пирамиды. Здесь длина внутреннего цикла равна уровню, с которого стартует customDownHeap. Для самого нижнего уровня, в котором N/2 всех элементов, она равна нулю, для следующего (в нем N/4 от всех) равна 1, далее 2 и т.д., и если просуммировать, то будет N/4 + 2 * N/8 + 3 * N/16 + ... = N = O(N), т.е. линейное время.

    2) собственно сортировка. Теперь длина внутреннего цикла равна высоте оставшейся (если отбросить сортированный хвост) пирамиды, т.к. customDownHeap идет с верхушки. Для первой половины элементов (нижний уровень) эта длина будет равна изначальной высоте H = log(2, N), далее для четверти элементов (второй уровень снизу) будет H-1, потом (для 1/8) H-2 и т.д., и здесь уже сумма ряда выйдет O(N * H) = O(N*ln(N))
    Ответ написан
    Комментировать
  • Как найти работу после курсов по фронтенду?

    Alexandroppolus
    @Alexandroppolus
    кодир
    У нас вчера отгремела очередная собесная серия, нашли милла (точнее, предложили оффер, согласится ли, посмотрим). До этого были в феврале. Что я заметил: у всех "опыт Реакт от 3 лет", но по факту большинство чуваков не знает базовую повседневную примитивщину.
    Так что да, кандидатов много, хороших мало (все за каким-то хером ломанулись в айти).

    Тебе надо пройти эйчарские какие-то фильтры. Возможно, придется нарисовать себе красивое резюме с опытом. Да, это неприкольно, ну и что? Если ты за предстоящий год-полтора как следует разберёшься с айтишной наукой и блеснешь интеллектом на тех.собесе, всем будет пофиг, какой на самом деле опыт. Возьмут джуном, я так думаю.
    Ответ написан
    6 комментариев
  • Как nest/тайпскрипт реализует IoC в компиляторе?

    Alexandroppolus
    @Alexandroppolus
    кодир
    Ответ написан
    Комментировать
  • Рекурсивный ввод-вывод последовательности без использования массивов и списоков?

    Alexandroppolus
    @Alexandroppolus
    кодир
    в общем, закину свой вариант, который изложил в комментах. Просто оставлю это здесь.

    Вышло даже немного проще, достаточно передавать только одну ссылку.
    Нет массивов, и нет списков, аллоцированных в куче. Только одиночные стековые переменные.

    кодъ на плюсахъ

    #include <iostream>
    
    struct Node {
        int value;
        Node *next;
    };
    
    void RecursiveOutput( Node* item )
    {
        if ( item != 0 )
        {
            RecursiveOutput(item->next);
            std::cout << item->value << std::endl;
        }
    }
    
    void RecursiveInput( int n, int index = 1, Node* item = 0 )
    {
        if ( index <= n )
        {
            Node data;
            std::cin >> data.value;
            data.next = item;
    
            RecursiveInput( n, index + 1, &data );
        } else {
            std::cout << "RecursiveOutput" << std::endl;
            RecursiveOutput(item);
        }
    }
    
    int DEPTH = 3;
    
    int main()
    {
        std::cout << "input values: "  << std::endl;
        
        RecursiveInput(DEPTH);
        
        std::cout << "end"  << std::endl;
    
        return 0;
    }

    Ответ написан
    Комментировать
  • Как проверить тип объекта при конвертировании из другого типа в TS?

    Alexandroppolus
    @Alexandroppolus
    кодир
    судя по данному примеру, достаточно убрать R из генерика, а тип возвращаемого значения указать как

    {type?: string}

    конкретно здесь Object.assign выглядит как "индусский код", но ведь в реальности что-то более сложное надо?
    Ответ написан
  • Как типизировать массив объектов, чтобы поля содержали суммарно ВСЕ значения enum?

    Alexandroppolus
    @Alexandroppolus
    кодир
    Вариант, допускающий повторы: ссылка

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

    Alexandroppolus
    @Alexandroppolus
    кодир
    function int(x) {
        return Math.floor(x);
    }
    
    function check(x, i) {
        const v = int(x / 2 ** (i - 1));
        
        return v - int(v / 2) * 2;
    }


    Здесь ** - степень, её приоритет выше чем у деления, там х делится на 2 в степени..

    возвращает 1, если выбрано, и 0, если не выбрано.

    i нумеруется с единицы
    Ответ написан
    9 комментариев
  • Как доказать, что граф планарный?

    Alexandroppolus
    @Alexandroppolus
    кодир
    Твой граф стягивается в К33, т.е. он не планарный. Если я правильно понял принцип стягивания.

    Конкретно, тебе требуется:
    1) стянуть в одну вершину три самые правые.
    2) стянуть ребро малого равностороннего треугольника, которое пересекается другим ребром.
    3) никогда больше не выкладывать сюда граф, у которого вершины не обозначены буквами или числами, потому что это пипец как их описывать!!
    Ответ написан
    1 комментарий