• Более быстрый способ нахождения всех делителей числа?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Суть вопроса - алгоритм факторизации.

    Чтобы ускорить факторизацию есть много путей. Во первых - отказаться от языка Python в пользу C++ или Rust.

    Во вторых - запоминать найденные primes и использовать их для следующего шага. Грубо говоря факторизация требует эффективного генератора primes. А он в свою очередь... Саморекурсивен. Требует такого-же генератора меньшей мощности.

    И step надо делать не по 1 элементу а по нечётным начиная с 3.

    Есть ещё алгоритм Эратосфена. Обрати внимание.

    И есть очень глобальная задача, такая как доказательство простоты. Для нее есть целый список алгоритмов. Они сложные и интересные. Часть из них - вероятностные. Используются в критпографии.
    Ответ написан
    Комментировать
  • Как правильно распарсить такой массив со строками?

    0xD34F
    @0xD34F Куратор тега JavaScript
    arr.reduce((acc, n) => (
      n = n.match(/(\w+) = (.*)/),
      n && (acc[n[1]] = n[2]),
      acc
    ), {})
    Ответ написан
    2 комментария
  • Golang в чём смысл?

    bingo347
    @bingo347
    Crazy on performance...
    Во-первых, любой бенчмарк можно написать так, что визуально будет выглядеть очень похоже, но на деле у одной технологии будут использоваться сильные стороны, а у другой нет (понятно кто выиграет). Притом это можно сделать как специально, дабы превознести одну из технологий, так и ненамеренно, просто потому-что человек писавший бенчмарк очень хорошо знает одну технологию и посредственно другую.
    Например, я вполне умею написать многие вещи на C, C# и Go, но знаю эти языки очень поверхностно, с другой стороны я очень хорошо знаю JS (в том числе достаточно много копался в кишках v8) и Rust, как думаете, кто победит, если я начну писать бенчмарки для сравнения этих 5 языков?

    хотя Golang изначально и задумывался, как яп для хайлоада
    Go изначально задумывался как ЯП, который сможет быстро освоить любой, кто базово знаком с программированием, дабы Google мог нанять тысячу джунов и они быстро прототипировали идеи без заморочек C/C++.

    А еще вся супер-пупер параллельность - на самом деле асинхронщина, работающая на небольшом пуле реальных потоков ОС. Притом без вариантов. Асинхронный рантайм - это тоже не бесплатно. На всяких I/O штуках асинхронщина показывает себя очень хорошо, но на сугубо вычислительных задачах - все ее преимущества становятся минусами. На шарпе есть контроль, где использовать асинхронщину, а где вынести вычисления в настоящий поток. На Go такой возможности нет.

    P.S. а вообще, в реальном мире Вы практически никогда не упретесь в производительность языка, ну разве что будете всюду втыкать самые неоптимальные алгоритмы. На деле бутылочным горлышком окажутся сеть и диски. И даже в сугубо вычислительных штуках Вы скорее упретесь в оперативку и процессорные кэши, а не в ЯП.
    Ответ написан
    2 комментария
  • Как сделать дерево объектов из массива?

    0xD34F
    @0xD34F Куратор тега JavaScript
    function createTreeFromArray(arr, key, parentKey) {
      const tree = Object.fromEntries(arr.map(n => [ n[key], { ...n } ]));
    
      return Object.fromEntries(Object.entries(tree).filter(([ , n ]) => {
        return !(tree[n[parentKey]] && ((tree[n[parentKey]].children ??= {})[n[key]] = n));
      }));
    }
    
    
    const tree = createTreeFromArray(arr, 'uid', 'parentUID');
    Ответ написан
    4 комментария
  • Как вызвать цепочку ключей в объекте строкой?

    WblCHA
    @WblCHA
    const getValue = (obj, keys) => keys.reduce((acc, key) => acc?.[key], obj);
    Ответ написан
    2 комментария
  • Как получить уникальный идентификатор unix машины?

    saboteur_kiev
    @saboteur_kiev Куратор тега Ubuntu
    software engineer
    попробуй
    1. hostid
    2. cat /etc/machine-id
    3. md5sum /proc/cpuinfo
    4. blkid|grep UUID|md5sum
    5. dmidecode |grep -i uuid

    Не совсем понятно зачем привязываться именно к серийнику CPU, я не совсем уверен что линукс может его получить. А привязаться к списку процессоров + накопителей и других штук, которые при ребуте не меняются - можно просто сгенерировать текстовый отчет и прогнать через md5
    Ответ написан
    3 комментария
  • Как двумерный массив порезать на куски и превратить строки в столбцы?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    const result = [];
    for (let i = 1; i < t.length; i += 2) {
      const sub = [];
      for (j = 0; j < t[0].length; j += 1) {
        sub.push([t[0][j], t[i][j], t[i + 1][j]]);
      }
      result.push(sub);
    }
    console.log(result);
    Ответ написан
    2 комментария
  • Как получить значение из массива, которое используется n раз?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Коротко:

    const getRepetition = (arr, repeated) => Array
      .from(arr.reduce((acc, n) => acc.set(n, -~acc.get(n)), new Map))
      .reduce((acc, n) => (n[1] === repeated && acc.push(n[0]), acc), []);

    Длинно:

    function getRepetition(arr, repeated) {
      const result = [];
      const count = {};
    
      for (const n of arr) {
        if (!count.hasOwnProperty(n)) {
          count[n] = 0;
        }
    
        count[n]++;
      }
    
      for (const n in count) {
        if (count[n] === repeated) {
          result.push(+n);
        }
      }
    
      return result;
    }
    Ответ написан
    1 комментарий
  • Как правильно скрестить 3 массива в один?

    0xD34F
    @0xD34F Куратор тега JavaScript
    const merge = (key, ...arrs) =>
      Object.values(arrs.flat().reduce((acc, n) => (
        Object.assign(acc[n[key]] ??= {}, n),
        acc
      ), {}));
    
    
    const result = merge('id', arr1, arr2, arr3);
    Ответ написан
    Комментировать
  • Как писать нормальный код на Го?

    axifive
    @axifive
    Software Engineer
    Ответ написан
    Комментировать
  • Анимация Canvas на JavaScript?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Комментировать
  • Как решить данную задачу?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Вспомните алгоритм преобразования числа из 10-чной системы в t-ичную - надо делить на t с остатком, пока есть что делить. Остатки - цифры в t-ичной системе счисления (от младших к старшим).

    Так, 323 в десятичной системе, если перевести в 16-ричную будет:
    323 = 16*20+3. Остаток 3, результат 20.
    20 = 16*1+4. Остаток 4, результат 1
    1 = 16*0+1. Остаток 1. результат 0.

    Отсюда получается, что искомое число в 16-ричной системе 143. Проверка 16*16*1+16*4+3 = 256+64+3=323

    Итак, вам надо сделать то же самое, но не в 10-чиной системе, а в k-ичной (ведь переводим не из 10-чной а из k-ичной). Число записано в виде k-ичных цифр в массиве. Это, фактически, длинная арифметика с базой k.

    Для этого надо реализовать деление числа в виде массива цифр на короткое с остатком.
    Это делается со старших разрядов к младшим. Тупо делите каждую цифру с остатком отдельно. Остаток переносите в младший разряд. Последний остаток - это остаток от всего деления. Результаты делений - новые цифры.

    Удобнее хранить цифры от младших к старшим в массиве. Т.е. элемент массива 0 - это единицы. Элемент 1 - это первая степень k. Еще стоит хранить номер последней ненулевой цифры. Смотрите реализацию по ссылке выше.

    Вот пример из условия. Пусть k=666, t=10, число - {2, 179, 113} (в условии цифры от старших к младшим, но мы храним наоборот).

    Делим на 10.

    113/10 = 11 + остаток 3. Переносим 3 в младший разряд (умножив на 666), получаем 3*666+179=2177.
    2177 / 10 = 217 + остаток 7. 7*666+2 = 4664.
    4664 /10 = 466 + остаток 4. Дальше разрядов нет, значит 4 и есть остаток от деления {2, 179, 113} на 10. Результат деления - {466, 217, 11}

    Последний остаток - 4 - это и есть младшая цифра в ответе (он в условии написан - 50241044). Надо продолжать делить результат пока он не окажется 0.

    Повторим для {466, 217, 11}:
    11/10 = 1 + остаток 1. 1*666+217 = 883
    883/10 = 88 + остаток 3. 3*666+446 = 2444
    2444/10 = 244 + остаток 4.
    Опять, последний остаток - это остаток всего деления и следующая цифра в ответе (опять 4).
    Результаты деления - {244, 88, 1}

    И так далее, пока все число не станет 0 (все цифры в массиве 0).
    Ответ написан
    Комментировать