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

    bingo347
    @bingo347
    Crazy on performance...
    ss = (char*)calloc(n, sizeof(char*)); // выделяем память под строку
    Здесь Вы выделяете гораздо больше байт, чем Вам нужно, sizeof(char*) будет равен 8 на 64 битных архитектурах, когда sizeof(char) - 1. Но при этом стоит не забывать про место под '\0' в конце строки.

    gets(ss);
    printf("Введите свое слово (не забываем про длину строки): ");
    scanf("%s", ss);
    ss = (char*)realloc(i, sizeof(char*));
    gets(ss);
    Почитайте, что делает функция gets. Опять же проблема с размерами символа. Ну и у realloc несколько другая сигнатура. И вообще realloc достаточно недешевая операция, не за чем ее делать в цикле много раз над одним указателем, достаточно 1 раз в конце.

    if (ss[i] != NULL) // проверка на нулевой указатель
    Проверку на NULL нужно делать сразу после аллокации памяти. А вот в цикле ее делать незачем.

    ss[j] = ss[j++];// здесь я заменял тот символ на следующий, тем самым перекидывая его в конец
    Операция j++ меняет j.

    for (int i = 0; i < sizeof(ss); i++)// ну а тут пытался поменять размер
    Операция sizeof(ss) даст размер char*, то есть размер указателя, что соответствует 8 на 64 битных архитектурах. Для вычисления длины строки (терминированной символом '\0') есть функция strlen. А в данном случае вообще можно посчитать количество удаленных символов и из него вычислить длину результирующей строки, что будет дешевле.

    Ну и по самому алгоритму. Все можно сделать за 1 проход, подсчетом удаляемых символов и перемещением текущего символа на количество удаленных символов назад.
    Ответ написан
    Комментировать
  • Как читать дженерики в TypeScript?

    bingo347
    @bingo347 Куратор тега TypeScript
    Crazy on performance...
    Данная функция принимает аргумент constructor любого типа T, который является подтипом типа { new (...args: any[]): {} }

    В свою очередь { new (...args: any[]): {} } - это абсолютно тоже самое, что и new (...args: any[]) => {}. Это сигнатура конструктора, с любым количеством любых элементов и инстанциирующий значение с типом {}.

    Ну и тип {} - это множество всех не нулевых значений (не только объектов), то есть по сути это как тип any, но без null | undefined и с не сломанной вариантностью. Здесь его безболезненно можно заменить на тип unknown, в отличии от тех же аргументов, где из-за контрвариантности аргументов функций (и конструкторов) предикаты на типах ломаются и без any нормально не сделать.

    В целом, под такой дженерик подойдет абсолютно любой конструктор
    Ответ написан
    2 комментария
  • Почему webpack не импортирует node_modules?

    bingo347
    @bingo347
    Crazy on performance...
    Все он импортирует, просто Вы не понимаете как работают модули:
    https://developer.mozilla.org/ru/docs/Web/JavaScri...
    Ответ написан
  • Как убрать такое выделение символов в vscode?

    bingo347
    @bingo347
    Crazy on performance...
    https://code.visualstudio.com/updates/v1_63#_unico...

    Фича вообще полезная, но стоит добавить кириллицу в editor.unicodeHighlight.allowedCharacters
    Ответ написан
    Комментировать
  • В чем моя ошибка stepik?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    произведение элементов массива
    let p = 1;
    // в цикле:
    p *= arr[i];


    кратных 3
    n % 3 === 0

    оканчивающихся на 5
    n % 10 === 5

    если таких элементов нет
    в общем случае делается введением флага:
    let hasElements = false;
    
    if (/* ... */) {
      hasElements = true;
    }
    Но конкретно в этом случае, так как 1 гарантированно не попадает под условия, а все остальные числа изменят произведение, можно проще p !== 1

    Вам осталось дело за малым, объединить эти кусочки знаний в единый алгоритм
    Ответ написан
    Комментировать
  • Что значат эти строки в коде на typescript?

    bingo347
    @bingo347 Куратор тега TypeScript
    Crazy on performance...
    styled.li<{ menu?: any }>`

    Во-первых, к template string literal (``) можно применить функцию-тэг, она будет вызвана с массивом фиксированных строк и интерполируемыми значениями (`${/* вот этими */ value}`).
    Во-вторых, в TS функция может быть дженериком (принимать тип в качестве параметра), при вызове функции в дженерик можно передать конкретный тип (например { menu?: any }) или не передавать (тогда дженерик выведется автоматически из аргументов)
    В-третьих, так как тегирование template string literal по своей сути вызов функции, то и в него можно явно передавать дженерики.

    ${({ menu }) =>
        menu &&
        css
    А тут в качестве интерполируемого значения передается стрелочная функция, в которой деструктурирован первый аргумент. В данном случае это нормально, так как функция-тег получит данную функцию "как есть", без приведения к строке.
    Ответ написан
    1 комментарий
  • Почему определение инкапсуляции дают неправильно?

    bingo347
    @bingo347
    Crazy on performance...
    Цель инкапсуляции это объединение объектов
    кто Вам такое сказал?
    Само слово инкапсуляция происходит от латинского "in capsula", что можно перевести как "закрытый в коробке".
    Цель инкапсуляции - это сокрытие сложности. Не информации, не данных, не кода, а именно сложности.

    Вот представьте, у Вас есть лампочка с выключателем. Вы можете просто нажать на выключатель чтобы включить или выключить ее. Вам не нужно понимать электрические схемы внутри этого устройства, чтобы у Вас был свет. Вам достаточно пользоваться простым интерфейсом - выключателем. Это и есть инкапсуляция. Внутреннее устройство лампочки с выключателем инкапсулировано от Вас.
    Ответ написан
  • Почему так работают битовые сдвиги в Java?

    bingo347
    @bingo347
    Crazy on performance...
    Потому что 1 << 64 != 128 << 56, и вообще 1 << 64 в 64 бита не влазит
    Ответ написан
    2 комментария
  • Что сделать с большими аудиофайлами, чтобы их было удобно слушать на веб-странице?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Я бы пошел путем разбиения файла на куски, это кстати можно автоматизировать через ffmpeg.
    Так же лучше сохранять информацию о всех кусках и их продолжительности (например в json).

    Для непрерывного воспроизведения стоит создавать новый audio и вставлять его на страницу за некоторое время до окончания воспроизведения текущего куска. Отслеживать время можно через событие timeupdate.
    По завершению текущего куска (событие ended) запускать следующий, а элемент audio текущего удалять из страницы.

    Если нужен ползунок, эмулирующий полный файл, то можно сделать кастомный используя информацию из json. Хотя для личного пользования я лично не стал бы заморачиваться и просто вывел бы кнопки для переключения на нужный кусок, все так же на основе информации из json.
    Ответ написан
  • Почему не работает цикл?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Во-первых, у Вас ошибка синтаксиса
    https://developer.mozilla.org/ru/docs/Web/JavaScri...

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

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Для начала почитайте вот это:
    https://developer.mozilla.org/ru/docs/Web/JavaScri...

    Если после прочтения так сходу не понятно, то возьмите листочек с ручкой и распишите свой алгоритм по шагам.
    Ответ написан
    Комментировать
  • Почему JS меняет дату?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Дата не меняется, просто Вы оперируете датой в текущем часовом поясе (Московское время), а в консоль логируется в формате UTCString, а в UTC всегда используется время по Лондону.

    Ну и у строки нет метода setHours, нужно сначала создавать объект Date и уже на нем вызывать этот метод. Хотя для даты сделаной из такой строки этот вызов бессмысленный, так как устанавливаемые параметры и так будут 0
    Ответ написан
    2 комментария
  • Как упростить проверку числа на палиндром и увеличить скорость выполнения кода?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Задача проверки последовательности на палиндром решается за O(n/2). Но для этого нужно иметь последовательный доступ к обоим концам последовательности за O(1).
    Если такой возможности нет и имеется доступ только к одному из концов последовательности, то придется обойти всю последовательность, а это уже O(n). Один из таких, достаточно оптимальных алгоритмов для цифр целого числа уже представил WbICHA.

    Чтоб решить эту задачу за O(n/2) нужно понять, как получить крайние цифры числа за O(1).
    Крайнюю справа цифру можно получить простым остатком от деления на основание системы счисления, то есть, в случае десятичной системы счисления, на 10.
    Для получения крайней справа цифры нужно знать ее порядок (считая справа начиная с 0). Это можно сделать взяв целую часть от логарифма по основанию системы счисления (10). На JS такая операция будет выглядеть так:
    Math.trunc(Math.log10(num))
    Целая часть от деления числа на 10 в степени порядка правой цифры даст саму эту цифру. На JS это выражается так:
    Math.trunc(num / 10 ** Math.trunc(Math.log10(num)))

    Так же алгоритм требует равномерного перемещения по последовательности от краев к центру.
    Для правой цифры опять все просто, можно брать целую часть от деления числа на основание (10).
    Для левой нужно умножить ее на основание в степени порядка и вычесть результат из самого числа, то есть:
    num - leftDigit * 10 ** Math.trunc(Math.log10(num))


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

    Пункт 3 подразумевает рекурсию, но такая рекурсия легко разворачивается в цикл, что конечно же более оптимально.

    По итогу получим такую функцию:
    const isPalindrome = num => {
        let n = num;
        while (n >= 10) {
            const order = 10 ** Math.trunc(Math.log10(n));
            const leftDigit = Math.trunc(n / order);
            const rightDigit = n % 10;
            if (leftDigit !== rightDigit) return false;
            n -= leftDigit * order;
            n /= 10;
            n = Math.trunc(n);
        }
        return true;
    };


    P.S. варианты с приведением числа к строке, а тем более с последующим разбиением на массив чисел и разворотом его, просто отвратительны.
    Приведение числа к строке - это O(n) если не больше, так как в JS тип number - это по сути float64 и алгоритм приведения учитывает, что число может быть с дробной частью.
    Разбиение строки на массив символов (split) - O(n) и требует доп памяти под этот массив.
    Реверс массива - O(n/2)
    Склейка (join) - опять O(n)
    Сравнение строк - еще раз O(n)
    И хотя суммарная сложность останется O(n), количество проходов по цифрам числа будет в 5 раз больше, хотя даже на строках можно уложится в 1.5 обхода:
    const isPalindrome = num => {
        const s = String(num);
        for (let i = 0; i < s.length / 2; i++) {
            if (s[i] !== s[s.length - i - 1]) return false;
        }
        return true;
    };
    Ответ написан
    4 комментария
  • Шаблонизатор/препроцессор для верстки в 2021?

    bingo347
    @bingo347
    Crazy on performance...
    Ответ написан
    Комментировать
  • Как в TypeScript правильно указать тип ключа?

    bingo347
    @bingo347 Куратор тега TypeScript
    Crazy on performance...
    Комментировать
  • Почему Type 'Album' is missing the following properties from type 'Album[]': length, pop, push, concat, and 28 more?

    bingo347
    @bingo347 Куратор тега TypeScript
    Crazy on performance...
    Вот здесь Вы пишите, что ожидаете массив из Album:
    export class AlbumItemComponent implements OnInit {
      //@Input() public album: any;
      @Input() public album: Album[];


    А вот тут передаете объекты Album по одному:
    <div *ngFor="let album of albums">
      <app-album-item [album]="album"></app-album-item>
    </div>
    Ответ написан
    3 комментария
  • Как переключить подсветку на следующий элемент списка при нажатии стрелок вверх-вниз?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Ну для начала, вот сюда:
    list.addEventListener('keydown', function(parentLi) {
    параметром придет KeyboardEvent, в котором есть данные о нажатых клавишах.

    По идее в цикле перебираются li с классом parent, и у того, который должен быть подсвечен добавляется к классу пометка active
    Хранить состояние во view слое очень плохая идея. Запоминайте индекс выделенного элемента в переменной и по событию проверяйте возможность переключения подсветки и меняйте классы.

    Ну и так, замечание:
    for(var i = 0; i < parentLi.length; i++) {
        light(parentLi[i].firstChild)
    }
    
    function light(parentLi) {
        parentLi.addEventListener('mouseover', function() {
            this.style.color = 'pink';
            this.style.backgroundColor = 'grey';
        })
        parentLi.addEventListener('mouseout', function() {
            this.style.color = 'black';
            this.style.backgroundColor = 'white';
        })
    }
    вот тут в цикле создается целая пачка однотипных функций, каждая из которых будет жрать память пользователя. Притом эта задача вообще легко решается на чистом CSS через hover.
    Ответ написан
  • Как правильно копировать интерфейс и переносить функции, события в TypeScript?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    1. У Вас переменная design нигде не объявлена, откуда она должна взяться-то? Аналогично будет с другими переменными: designActive, designNoActive, development, developmentActive, developmentNoActive, promotion, promotionActive, promotionNoActive
    2. Что мешает просто сделать import?
    Ответ написан
    1 комментарий