• Как подсчитать кол-во единиц в числах от 0 до N?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Создавать массив длиной в N может быть «дорого» – займёт память. Поэтому для метода «в лоб» предложу простой цикл с циклом для поиска «1» в каждом кандидате:
    const sumone = n => {
      let sum = 0;
      for (let i=n; i>0; i--) {
        const numstr = i.toString(10);
        for (let j=0, len = numstr.length; j<len; j++)
          if (numstr[j] == '1') sum++;
      }
      return sum;
    }

    Но можно подумать над формулой вычисления без перебора. Или частично сократить перебор. Например, для чисел, состоящих из одних «9» искомое число единиц в ряде вычисляется как функция числа цифр: d * 10^(d-1) Вот так:
    9 .. 1 = 1 * 10^0
    99 .. 20 = 2 * 10^1
    999 .. 300 = 3 * 10^2
    9999 .. 4000 = 4 * 10^3
    99999 .. 50000 = 5 * 10^4

    Например, для числа 12345 можно мгновенно получить сумму для 9999 и начать перебирать с 10000 до 12345. Это тоже можно упростить: отбросим первую единицу, она есть каждый раз, и остаётся то же, что от 0000 до 2345 + 2346 единиц.
    0..2345 в свою очередь опять сокращается: сразу известно 0..999, остаётся от 1000 до 2345.
    1000 .. 1999 опять упрощаем отбрасыванием первой единицы: на 999 приходится 300 единиц плюс 1000 первых единиц. Остаётся 2000 .. 2345. Тут можно отбросить двойку и посчитать только 0..345. Снова уходит 0..99. и т.д

    Надо будет ещё подумать над формулой..
    Ответ написан
    Комментировать
  • Как сделать из данного времени код в формате HEX?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Для цвета нужны значения трёх компонентов от 0 до 255 в десятичной системе, или от 00 до FF в шестнадцатиричной. С 16-ричной не обязательно связываться.
    body {
      background-color: rgb(123, 45, 67);
    }

    или динамически
    var R = 123, G = 45, B = 67;
    document.body.style.backgroundColor = `rgb(${R}, ${G}, ${B})`;

    Часы меняются от 0 до 23, минуты и секунды – от 0 до 60.
    Надо «спроецировать» каждое из них на диапазон 0..255.

    Например, часы:
    var D = new Date();
    var hours = D.getHours(); // 0..23
    var RR = Math.floor(255 * hours / 23); // 0 .. 255
    
    // то же с шестнадцатиричностью
    var RR = Math.floor(255 * hours / 23).toString(16); // 0..FF
    // может быть 1 или 2 цифры, надо всегда 2
    RR = ('0' + RR).substr(-2); // дописываем в начале 0 и берем последние две цифры

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

    Ответ написан
    6 комментариев
  • Как соеденить 2 массива?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Метод, как предлагали уже многие:
    1. склеить оба массива в один,
    2. пройтись последовательно по всем, собирая «словарь», где уникальный ключ name, а значение – весь объект с name и value. Перезаписывать предыдущий с таким же name или нет – по условию;
    3. вернуть массив значений этого «словаря» - уцелевшие уникальные объекты.


    const uniq = (a, b) => Object.values(
      a.concat(b).reduce(
        (acc, o) => {
          if (!acc[o.name]) acc[o.name] = o;
          else if (Number.isFinite(o.value)) acc[o.name].value = o.value;
          return acc;
        }, {}
      )
    );

    Для проверки, число это или нет, можно использовать метод Number.isFinite()

    Тесты
    //###########################
    const first = [{ name: 'first', value: '' }, { name: 'second', value: 10 }];
    const second = [{ name: 'first', value: 0 }, { name: 'third', value: 20 }];
    /*
    [
      {
        "name": "first",
        "value": 0
      },
      {
        "name": "second",
        "value": 10
      },
      {
        "name": "third",
        "value": 20
      }
    ]
    */
    
    //###########################
    const first = [{ name: 'first', value: 100 }, { name: 'second', value: 0 }];
    const second = [{ name: 'first', value: -111 }, { name: 'second', value: '' }];
    
    /*
    [
      {
        "name": "first",
        "value": -111
      },
      {
        "name": "second",
        "value": 0
      }
    ]
    */
    Ответ написан
    Комментировать
  • Как написать формулу скидки в зависимости от количества товара?

    Первый вариант: скидка растёт линейно от 0% до максимальной скидки, скажем 50%, которая наступает, если взять 70 единиц товара, и дальше не растёт. Гуглите уравнение прямой, проходящей через две точки.
    график
    5d3083611188d540332498.png


    Второй вариант: использовать сигмоиду (S-образный график) y = 1 / (e^x + 1)
    график

    y = 50 / (ℯ^(5 - x / 8) + 1)
    5d30899121998751229032.png
    Ответ написан
    Комментировать
  • Как переключаться между обычным окном и инкогнито хрома на mac os?

    Комбинация для переключения между окнами одного приложения:
    cmd + `
    или
    cmd + ~
    Ответ написан
    Комментировать
  • Чем заменить body onload?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    window.addEventListener('load', (event) => {
        script.sessionLoaded();
    });


    onload срабатывает, когда загрузилась страница и все её ресурсы: CSS, картинки, шрифты.
    в отличие от DOMContentLoaded, который выстреливает возможно раньше – когда только загрузился HTML и построено DOM дерево, но ещё не подгрузились внешние ресурсы.
    Ответ написан
    Комментировать
  • Хранение данных в localstorage?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Способом, как у вас 2-я строка, получите сохранённый ранее массив users, и в него пушьте.

    Рекомендации:
    1. Названия ключей LS лучше держать в константах, а не писать строкой каждый раз.
    2. Предусмотрите вариант, когда в LS ничего нет – с этим точно столкнётесь впервые с массивом users
    3. Предусмотрите вариант, что LS в принципе недоступно - например в режиме Private Browsing.
    Ответ написан
    3 комментария
  • Как с помощью jsonpath извлечь из массива объектов значение одного свойства зная значение другого?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    $[?(@.population == 2870528)].name

    Попробовать можно на jsonpath.com
    скрин
    5d2f068690488541075820.png


    См. язык запросов. Фильтр ?( условие )
    Ответ написан
    Комментировать
  • Какой самый быстрый язык для бота ВК?

    sergiks
    @sergiks Куратор тега ВКонтакте
    ♬♬
    Ассемблер, Си.
    Но какая разница? Сделайте для начала медленного бота с кучей недостатков.
    У вашего первого бота обязательно должны быть недостатки, иначе неправильно это как-то.
    Ответ написан
    Комментировать
  • Как использовать import?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Скачал jsonpath.min.js, подключил его в index.html (нужно ли это?).

    Всё правильно сделали, так тоже можно. После этого у вас должна быть доступна глобальная переменная jsonpath – к ней и обращайтесь:
    var cities = [
      { name: "London", "population": 8615246 },
      { name: "Berlin", "population": 3517424 },
      { name: "Madrid", "population": 3165235 },
      { name: "Rome",   "population": 2870528 }
    ];
    
    var jp = jsonpath; //  для краткости
    var names = jp.query(cities, '$..name');
    console.log(names); // [ "London", "Berlin", "Madrid", "Rome" ]
    Fiddle

    Ну а вообще рано или поздно всё равно придётся научиться в модули и сборщики – например, Webpack.
    Ответ написан
  • Как сделать элементы массива жирными или курсивом?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Как сделать элементы жирными или курсивом:
    // через методы строки .bold() и .italics()
    var html = "Понедельник".italics(); // html==='<i>Понедельник</i>';
    var html = "Суббота".bold(); // html==='<b>Суббота</b>';
    
    // вручную собрать строку
    var dow = 'Понедельник';
    var html = '<i>' + dow + '</i>'; // html==='<i>Понедельник</i>';
    
    // то же самое в обратных кавычках
    var dow = 'Понедельник';
    var html = `<i>${dow}</i>`; // html==='<i>Понедельник</i>';

    Правильнее через CSS, но сейчас не об этом.

    document.write() – плохая практика, не надо его.
    Лучше собрать HTML в строку и потом присобачить куда-то:
    const week = ['Понедельник', 'Вторник', 'Среда', 'Четверг', 'Пятница', 'Суббота', 'Воскресенье'];
    
    for (let i = 0, len = week.length; i < len; i++) {
        let html = week[i];
        if (i === 0) html = html.italics(); // понедельник
        else if (i > 4) html = html.bold(); // выходные
    
        const div = document.createElement('div');
        div.innerHTML = html;
        document.body.appendChild(div);
    }
    Ответ написан
    1 комментарий
  • Какая квота на API Youtube?

    Квота, видимо, не ключа, а всего «проекта».
    У всех 100 чел – да, лимит общий.
    Но хорошая новость в том, что этот лимит можно поднимать. По мере роста, когда использование приближается к потолку квоты, можно самому запросить повышение квоты.
    скрин
    5d2a36e6dd698507822267.png

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

    Чтобы не усложнять схему БД ещё одной таблицей, если не требуется частый поиск товара по адресу его картинки, можно просто сделать поле типа text и в него складывать адреса картинок через разделитель, скажем, через непечатный ASCII символ, или через пробел, если каждый URL перед этим прогонять через urlencode() или кодировать в JSON массив ссылок на картинки и хранить json-строку:
    $images = [
      'https://site1.ru/images/product.php?getimage&id=123&img=345', 
      'https://site2.ru/images/shkaf.jpg', 
      'https://admin:pwd@site3.ru/admin.php?img=234', 
    ];
    $imgString = json_encode($images);
    // строку $imgString положить в единственное поле для картинок в БД .
    Ответ написан
    1 комментарий
  • Почему возвращается ошибка от VK API?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    method is unavailable with group auth

    «Метод недоступен с токеном сообщества.»

    Посмотрите документацию метода wall.post(), самый первый абзац. Единственный вариант запустить wall.post():
    Этот метод можно вызвать с ключом доступа пользователя, полученным в Standalone-приложении через Implicit Flow, или с использованием окна подтверждения. Требуются права доступа: wall.


    Зарегистрируйте Standalone приложение, получите через него токен админа группы и размещайте записи с параметром from_group=1, чтобы от имени группы.
    Ответ написан
    2 комментария
  • Как получить инициалы из строки с именем и фамилией?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Получить первый символ строки: substring(0, 1) – с какого (0) по какой (1).

    function initials(str) {
      return str.split(/\s+/).map((w,i) => i ? w.substring(0,1).toUpperCase() + '.' : w).join(' ');
    }
    
    initials('Невзубногой иван нилыч');  //  Невзубногой И. Н.
    initials('Держиморда Потап Игнатьич'); // Держиморда П. И.
    initials('кто есть who?'); // кто Е. W.

    Разбили строку в массив по пробелам, если первое слово (index===0) остаётся как есть, у остальных слов взяли первый символ, сделали его заглавным на всякий, приписали точку, склеили массив обратно в строку через пробел.
    Ответ написан
    2 комментария
  • Как работать с двумя жесткими дисками в nginx?

    Если бы это был вопрос только про nginx, то есть директива try_files, которая пробует найти запрошенный файл в разных местах. Что-то типа:
    location / {
      try_files
        /disk_0/images/$uri
        /disk_1/images/$uri
        404;
    }
    Ответ написан
    Комментировать
  • Как умножить переменную на 100% в php?

    Умножить на 100%, видимо, от упомятого аргумента $ipsa3 так:

    $result = $ipsa3 * ((100 / 100) * $ipsa3);
    // или просто
    $result = $ipsa3 * $ipsa3;

    С переменной процентов
    $percent = 100; // сколько процентов
    $result = $ipsa3 * (($percent / 100) * $ipsa3);

    Про проценты

    Проценты это доля от чего-то. Число 1/100 (сотых долей чего-то). Целое что-то это всегда 100% этого чего-то.
    50% это 50/100 или половина чего-то, что-то * 0.5
    Задача «умножить на 100%» хоть и звучит несколько странно, но выполнима, если понять, на 100% от чего просят умножить. Т.е. на целое что? Тут предполагаю, что на целую эту же переменную $ipsa3
    Ответ написан
    2 комментария
  • Как организовать обработку больших объемов данных?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Несколько не связанных идей:
    1. хранить каждую «последовательность» (набор) из 500000 (не важно, сколько) чисел как картинку с 1-битным цветом, 3873*3873px, чтобы покрыть диапазон 0..15e6. Будет 15 млн. таких картинок. Черный пиксель - число, белый - нет числа. Картинки можно накладывать и смотреть, насколько потемнело ) Но в цифре это делать неэффективно, вот если бы аналогом..
    2. хранить последовательность как бинарную строку, где включённые биты означают выбранное число. 15e6 бит примерно 1875e3 байт =~1.9Mb на набор. 1875e3 * 15e6 = 28125e9 байт =~28Тб
    3. хранить как бинарный файл по 3 байта (24 бита) на число. 0–15 млн прекрасно уместятся: 224 = 16 777 216. См. php функции pack() / unpack(). Один набор 500000 * 3 = 1.5Мб, 15млн наборов 22.5Тб
    4. Не хранить всё. Полное покрытие диапазона 0..15 млн. идеально подобранными диапазонами по 500 тыс. потребует всего 30 таких диапазонов.
    5. Гипотеза. Если все выборки действительно случайны, можно брать любые N, они окажутся хуже «настоящего» максимума лишь незначительно.
    6. «Расчеты одной последовательности идут долго порядка 3-х минут» 180 секунд * 15e6 = 27e8 секунд, это почти 86 лет. А вы за несколько дней собирались как-то?

    Ответ написан
    1 комментарий
  • Как узнать screen_name?

    sergiks
    @sergiks Куратор тега ВКонтакте
    ♬♬
    Забыли параметр fields: "screen_name"
    как должно быть
    на этой странице 5d270b53ce352620857298.png

    Попробуйте:
    const [user_info] = await vk.api.users.get({ user_ids: message.senderId, fields: "screen_name" });
    Ответ написан
  • Программное решение для упорядочивания жизни?

    The Brain некоторым знакомым пришелся очень по душе. Мне – нет. (Сейчас опять попробую подружиться с ним, 2nd chance)

    Принцип динамической карты mind-map. Мысли, записи, файлы, цитаты - записываются как узлы графа, устанавливаются связи.
    как выглядит
    MarieCurie.gif


    TheBrain is the ultimate digital memory.

    Intelligent note-taking.
    Non-linear file management.
    Ideas and relationships visualized.
    Ответ написан