• Почему типы написаны так?

    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
    кодир
    Если линии, связывающие точки, одинаковы по стоимости/весу/длине, то проще всего поиск в ширину
    Ответ написан
    Комментировать
  • Как проверить три последние цифры числа и по условию изменить их?

    Alexandroppolus
    @Alexandroppolus
    кодир
    замена на 0 первой ненулевой из трех последних цифр
    const func = (n) => String(n).replace(/[1-9](?=\d{0,2}$)/, '0');
    
    console.log(func(123123)); // 123023
    console.log(func(123023)); // 123003
    console.log(func(123003)); // 123000
    console.log(func(123000)); // 123000


    замена последней (самой правой) ненулевой цифры:
    const func = (n) => String(n).replace(/(?=\d{3}$)(\d*)[1-9]/, '$10');
    Ответ написан
  • Как в 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 комментарий
  • Непонятное поведение своей интерпретации функции Promise.race, почему так происходит?

    Alexandroppolus
    @Alexandroppolus
    кодир
    строка
    promise.then(onFullfiled).catch(onRejected);
    на самом деле работает как
    promise.then(onFullfiled, err => {throw err;}).then(v => v, onRejected);

    Если имеем дело с зарезолвленным/зареджекченным промисом, то здесь первый then ставит микротаск в очередь сразу, а второй - только по выполнении микротаска от первого.

    соответственно, для примера
    const promises = [
      Promise.reject('rejected1'),
      Promise.reject('rejected2'),
      Promise.resolve('resolved'),
    ];


    микротаски составили такую очередь:
    1) err => {throw err;}
    2) err => {throw err;}
    3) onFullfiled
    4) onRejected,
    5) onRejected
    6) v => v,


    Где пункты 1-3 добавились на цикле, а 4-6 по мере выполнения первых трёх.

    вот так и вышло, что onFullfiled вылез вперед.
    Ответ написан
    1 комментарий
  • Почему не пойманная в Promise.all ошибка не попадает в catch?

    Alexandroppolus
    @Alexandroppolus
    кодир
    чтобы промис зареджектился из-за throw, в нем случившемся, оный throw должен произойти синхронно. А у тебя - по таймауту.
    Для асинхронного реджекта надо функцию reject вызвать.
    Ответ написан
  • Почему не существует не итерационных/точных методов для вычисления корня из числа?

    Alexandroppolus
    @Alexandroppolus
    кодир
    В компьютерной науке, где-то глубоко под капотом (может, даже на уровне аппаратной реализации), все вычисления итерационные в той или иной мере.

    А по поводу точности - иррациональные числа не только вычислить, а даже записать точно нельзя, например тип double - это всего 8 байт, и не получится сколько угодно после запятой. Потому в рамках типа double (или любого другого) можно говорить о "точном" значении корня из двух - о наиболее точном приближении приближении, которое поместилось в тип
    Ответ написан
  • Для чего вызывают apply и call последовательно?

    Alexandroppolus
    @Alexandroppolus
    кодир
    супермозговывертный вызов можно сократить до
    console[level].apply(console, argsWithFormat)

    console[level] - некая функция из консоли, например, console.error. Но в IE9 у неё нет apply, и вызов через точку не сработает. Потому берется стандартный Function.prototype.apply и вызывается через call, так что console[level] станет для него как this (как то, что перед точкой), а остальное - аргументами.
    Ответ написан
    6 комментариев