• Как проверить корретность битовой маски?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    У вас не битовая маска, так как b и c содержат один и тот же бит 2 и отличить c от b|c невозможно. 2|6 === 6. В битовой маске все уникальные некомбинированные флаги должны быть степенями двойки.
    Работать с вашим набором можно, но флаги придётся складывать через +, а проверять своей функцией, наподобие такой:
    function flags($value) {
        if (!in_array($value, [0, 1, 2, 3, 6, 7, 8, 9])) {
            return false;
        }
        $result = [];
        if (in_array($value, [1, 3, 7, 9])) {
            $result[] = 'a';
        }
        if (in_array($value, [2, 3, 8, 9])) {
            $result[] = 'b';
        }
        if (in_array($value, [6, 7, 8, 9])) {
            $result[] = 'c';
        }
        return $result;
    }
    Ответ написан
  • Найдите все пифагоровы тройки, в которых все числа находятся в диапазоне [1; 5000]?

    Alexandroppolus
    @Alexandroppolus
    кодир
    в википедии есть статья про пифагоровы тройки.
    там приведена "формула евклида".
    по ней можно быстро и беспощадно нагенерить примитивные тройки, которые потом ещё домножать на 2, 3, 4,...

    https://ru.wikipedia.org/wiki/%D0%9F%D0%B8%D1%84%D...
    Ответ написан
    5 комментариев
  • Как заменить все вхождения на различные значения?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    const format = (value, mask) => {
      let i = 0;
      return mask.replaceAll(/#/g, () => (i < value.length ? value[i++] : '#'));
    }
    format('123456789', '(###)-###-###'); // "(123)-456-789"
    format('123', '(###)-###-###'); // "(123)-###-###"
    Ответ написан
    Комментировать
  • Какие материалы или информацию можно изучить, чтобы решить эту задачу?

    tsklab
    @tsklab
    Здесь отвечаю на вопросы.
    В задаче указаны ссылки на учебные материалы.
    Ответ написан
    Комментировать
  • Как вернуть новый массив объектов только с уникальным id вложенного объекта?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Сделаем функцию, которая будет принимать следующие параметры:
    • массив, подлежащий уникализации
    • функцию, принимающую элемент массива и возвращающую значение, по которому осуществляется уникализация

    Чтобы можно было делать так: const result = unique(arr, n => n.user.id);.

    Какие тут возможны варианты:

    const unique = (arr, key) =>
      Object.values(Object.fromEntries(arr.map(n => [ key(n), n ])));
    
    // или, если в результирующий массив должны попадать те из "одинаковых" элементов,
    // что расположены в исходном массиве первыми
    
    const unique = (arr, key) =>
      Object.values(arr.reduce((acc, n) => (acc[key(n)] ??= n, acc), {}));
    
    // или, если надо также сохранять взаимное расположение элементов
    
    const unique = (arr, key) =>
      arr.filter(function(n) {
        const k = key(n);
        return !(this[k] = this.hasOwnProperty(k));
      }, {});

    Если значения, по которым осуществляется уникализация, могут, будучи различными, иметь одинаковый строковый эквивалент, то на помощь приходят Map и Set:

    const unique = (arr, key) =>
      Array.from(new Map(arr.map(n => [ key(n), n ])), n => n[1]);
    
    // или (в отличие от объекта, Map запоминает порядок вставки,
    //      так что тут взаимное расположение элементов сохраняется)
    
    const unique = (arr, key) =>
      [...arr.reduce((acc, n) => {
        const k = key(n);
        return acc.set(k, acc.get(k) ?? n);
      }, new Map).values()];
    
    // или
    
    const unique = (arr, key) =>
      arr.filter(function(n) {
        const k = key(n);
        return !this.has(k) && this.add(k);
      }, new Set);
    Ответ написан
    Комментировать
  • Как сделать рекурсию в js await функции?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    При чём тут рекурсия? Обычный цикл:
    let result = false;
    while(result === false) {
      result = await this.download();
    }
    Ответ написан
    3 комментария
  • Терминология: почему контейнеры называют микросервисами?

    inoise
    @inoise
    Solution Architect, AWS Certified, Serverless
    Нет, контейнер может содержать и монолит и группу сервисов, но это «не принято в приличном обществе».

    Задача контейнеризации - повторяемость и изоляция среды исполнения

    Задача микросервисов - изоляция доступа по контракту и независимый цикл разработки/деплоймента
    Ответ написан
    Комментировать
  • Как защититься от двойного списания в многопоточном приложении?

    @rPman
    Блокировку во время траты уже сказали, но бывает что процесс может длиться достаточно долго, чтобы пользователь в соседнем окошке не смог совершить параллельно оплату (у него будет все висеть), поэтому блокировки реализуют программно

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

    более красиво, вместо одного поля, заводи специальную таблицу - текущие сделки, где в соответствии со статусом вычисляй этот заблокированный баланс (статусы сделка начата, сделка совершена или сделка обломилась), это актуально как раз на тот случай, когда сделка совершается достаточно долго чтобы не проводить ее в пределах транзакции базы данных (а то попадет пользователь на момент обслуживания к примеру перезапуск бд на обновление, и его транзакция пропадет), к тому же эта таблица у тебя уже точно есть, только статусов побольше добавить
    Ответ написан
    Комментировать
  • Как можно вычесть свободные отрезки?

    Tash1moto
    @Tash1moto Автор вопроса
    Написал работающий вариант
    const timeline = {start: 100, end: 300 }
    const offsets = []
    const items = [
        { start: 235, end: 270 },
        { start: 135, end: 170 },
    ]
    .sort((a,b) => {
        if(a.end > b.end) {
            return 1
        }
        if(a.end < b.end) {
            return -1
        }
        return 0
    })
    items.forEach((cur, index, arr) => {
        // Start
        if(index === 0) {
            offsets.push({
                start: timeline.start,
                end: timeline.start + cur.start - timeline.start
            })
        }
        // Middle
        if(arr[index+1]) {
            offsets.push({
                start: cur.end,
                end: cur.end + arr[index+1].start - cur.end
            })
        }
        // End
        if(index === arr.length - 1) {
            offsets.push({
                start: cur.end,
                end: timeline.end
            })
        }
    })
    
    console.log(offsets)
    /*
    Result:
    [ { start: 100, end: 135 },
      { start: 170, end: 235 },
      { start: 270, end: 300 } ]
    */
    Ответ написан
    1 комментарий
  • Как отключить выполнение функции Javascript на других страницах?

    @andand44
    Нужно проверять на существование элемент и потом уже обращаться к нему
    if ( document.querySelectorAll(".info-header-tab").length ) {
        alert("Элемент найден!");
    }
    Ответ написан
    2 комментария
  • Как получить текст выбранного option'а?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Поскольку в показанном select'е у option'ов отсутствуют атрибуты value, то их значениями будет их текстовое содержимое. Так что в данном конкретном случае текст можно получить с помощью метода val.

    Ну а вообще:

    $('select').change(function() {
      const text = $(':checked', this).text();
      console.log(text);
    });

    Или, к чёрту jquery:

    document.querySelector('select').addEventListener('change', function(e) {
      const select = this;
      // или
      // const select = e.target;
      // const select = e.currentTarget;
    
      const option = select.selectedOptions[0];
      // или
      // const option = select.options[select.selectedIndex];
      // const option = select.querySelector(':checked');
      // const option = [...select.children].find(n => n.selected);
    
      const text = option.text;
      // или
      // const text = option.textContent;
      // const text = option.innerText;
    
      console.log(text);
    });
    Ответ написан
    Комментировать
  • Как нарисовать плавные струйки дыма?

    DarkWood
    @DarkWood
    Я опишу вам алгоритм, который позволит создать в Illustrator нечто похожее. Подойдет ли оно вам - смотрите сами. Автоматизировать этап создания кривых - крайне сложно. Думаю, из описания сами поймете почему.

    Начинается, собственно, всё с этим самых кривых. Вам нужно две. Чем больше они между собой переплетаются, тем интереснее потом будет узор. Я специально оставил справа ровную часть, чтобы было видно, что она не дает ничего. Если спросите как я сейчас их нарисовал - просто карандашом.

    61802664abff2460020473.png

    Создаете между ними бленд (Ctrl+Alt+B) с дистанцией в 1 пиксель. Можно поставить меньше - тогда переходных кривых будет больше. При толщине контура в 1 пиксель меньше 0.4 пикселя ставить уже особого смысла не будет.

    618026a380abc845121510.png

    Не переживайте, что всё слилось в одноцветье. Кстати, желаемый цвет вы можете задать как сейчас, так и на следующем этапе. Рекомендую делать это как раз там.

    На всякий случай скопируйте бленд (Ctrl+C > Ctrl+F), чтобы была возможность что-то исправить, если последующий результат не понравится.

    Выполните команду Object> Blend> Expand.

    Далее Shift+Ctrl+G

    Задаете малую непрозрачность (около 10%). Как раз сейчас лучше всего менять цвет. Можете также поменять режим смешивания.

    618026b345bc8360746368.png

    Ctrl+G.

    Большее свечение на "петлях" можно сделать дубликатом этой группы (Ctrl+C > Ctrl+F). Эту копию тоже надо будет потом разгруппировать (Shift+Ctrl+G) изменить цвет на более светлый, непрозрачность и режим смешивания по вкусу.

    618026de13dcb347638107.png

    Собственно, узор готов.

    При создании бленда вы можете нарисовать еще одну кривую и расположить ее в панели слоев между двух других. Дальше весь фокус в том, что ей нужно задать цвет фона. И в данном случае цвет других кривых нужно задавать сейчас. Потом тоже можно через команду Recolor Artwork, но это лишние действия.

    618026e910192073261890.png

    Продолжение такое же: Shift+Ctrl+G, меняете прозрачность, режим смешивания и т.п.

    618027083db5a504901276.png

    Можно добавить еще одну кривую цвета фона и переплести ее с остальными. Можно переплетать два бленда от основного цвета к цвету фона и т.д. и т.п.

    Все команды, кроме рисования кривых, прекрасно записываются в экшен.
    Ответ написан
    2 комментария
  • Как получить счастливое число?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    Тут всё плохо:
    function isHappy(array){
      // записываем пустой массив в array
      // (не важно что там мы получили, теперь этого нет)
      array = [] 
      // получаем 6 переменных с значением "ничего"(undefined)
      let[x,y,z,b,n,v] = array
      // сравниваем x+y+z == b+n и выкидываем, никак не используя
      // с помощью оператора запятая(,) в if попадает только v
      // как мы знаем во всех переменных undefined - if(undefined) - ложь
      if(x+y+z == b+n,v){
        console.log(`Число ${array} - счастливое!`);
      }
      else{
        console.log(`Число ${array} - несчастливое`);
      }
    }
    // вызываем isHappy с аргументом 000000, который является числом 0, 
    // просто записанным длинно, а не массивом
    isHappy(000000)
    Ответ написан
    8 комментариев
  • Как классифицировать/сгруппировать элементы числового ряда так, чтобы сумма элементов в каждой группе была примерно одинаковой?

    wataru
    @wataru Куратор тега Математика
    Разработчик на С++, экс-олимпиадник.
    Это задача об оптимальном разбиении на подмножества, она NP-сложная. Тут нет какого-то простого и быстрого алгоритма.

    Полный перебор, метод ветвей и границ, всякие методы отжига и генетические алгоритмы вам в помощь.

    В отдельных случаях (сумма не очень большая и множеств всего 2; числа очень маленькие) возможны быстрые алгоритмы на основе динамического программирования
    Ответ написан
  • Вывести все числа у которых 5 делителей до 300?

    YuriyVorobyov1333
    @YuriyVorobyov1333
    Software Developer
    Вы не обнуляете nums, счетчик постоянно наращивается
    Ответ написан
    2 комментария
  • Как совместить elasticsearch и php 7.0?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    > хочется понять насколько сложно сделать апдейт на 3 версии.

    Несложно. Отличия минимальны. В рамках одной мажорной версии вообще никаких проблем. Тут вопрос даже не в трудностях, а в том, что оставаться на 7.0 это вообще не вариант.
    Только переезжать надо на 7.4, потому что поддержка 7.3 прекращается через месяц.

    И вообще, версию надо подтягивать не когда жареный петух в зад клюнет, а планово.
    Ответ написан
    1 комментарий