• Как дописать значение к массиву если его надо получить промисом или задержкой?

    lastuniverse
    @lastuniverse
    lex bem, вроде как то так:

    код
    // создадим массив в который будем складывать промисы
    const waitLoad = [];
    
    
    
    results = results.slice(0, 1);
    for (const key in results) {
      if (results.hasOwnProperty(key)) {
        const element = results[key];
        element.introtext = h2p(element.introtext);
        element.fulltext = h2p(element.fulltext);
        
        // добавим промис полученный в         
        waitLoad.push(
          clientGI.search(element.title)
          .then(images => {
            element.images = images.map(image => [image.url, image.thumbnail]);
            // возвращаем промис который всегда выполнится
            return Promise.resolve();
          });
        );
      }
    }
    
    
    // когда все картинки загружены выполняем какие либо действия с ними
    Promise.all(waitLoad).then(values => { 
    // ...
    });



    PS: не тестировал.
  • Что может заменить c++?

    lastuniverse
    @lastuniverse
    Денис Загаевский, а я разве не об этом? Но при этом сам по себе asm потенциально самый быстрый:)
  • Что может заменить c++?

    lastuniverse
    @lastuniverse
    Денис Загаевский, возможно вы просто не понимаете то о чем говорите?
    не буду писать много текста, по ссылкам много чего написано:
    1. https://habr.com/post/254121/ (3, 4 и 5 комментарии)
    2. https://pikabu.ru/story/sravnenie_yazyikov_program... (тоже возмущения в комментариях)
    3. https://ru.stackoverflow.com/questions/315275/%D0%...

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


    Помните мою фразу "Он при грамотном использовании будет самым быстрым"? Так вот, ее смысл в том, что все оптимизации программисту предлагается сделать самому, но если их сделать, результат будет существенно лучше чем у любых других языков.
  • Что может заменить c++?

    lastuniverse
    @lastuniverse
    Afafks, если упрощенно, то языки условно можно разделить на 2 группы:
    1. компилируемые - (C, C++, Pascal, GO и др.) программы на этих языках компилируются (преобразуются) в машинный код понятный процессору. Такие программы будут выполнятся в разы (а то и на несколько порядков) быстрее чем программы на интерпретируемых языках
    2. интерпретируемые - (Python, Perl, PHP, JavaScript и др.) программы на этих языках не преобразуются в машинный код, а выполняются другими программами (интерпретаторами)

    так же существует и нечто среднее между 1 и 2 (Java, Perl6 и др.), это языки компилируемые в байткод (не машинный код), который не понятен процессору, но понятен специальной виртуальной машине, умеющей интерпретировать этот байт код. Программы написанные на этих языках быстрее чем программы написанные на интерпретируемых языках но медленнее чем на компилируемых

    Отдельно можно выделить ассемблер, который является компилируемым языком низкого уровня (по сути является очеловеченным видом того же машинного кода с добавками синтаксического сахара). Он при грамотном использовании будет самым быстрым, но писать на нем проги целиком это скорее для задротов. На практике он используется в качестве небольших вставок (в том же С и С++) в тех местах где требуется поистине запредельная скорость выполнения.

    Это я расписал то что касается скорости выполнения.

    Также существует еще критерий, условно назовем его "удобство работы". По этому критерию языки, опять же условно можно разделить на высокоуровневые и низкоуровневые. Ассемблер однозначно относится к низкоуровневым, С и С++ более высокоуровневые, Java, Python, Perl, PHP, JavaScript еще более высокоуровневые. На самом деле градация весьма условная.

    PS: Любая программа это всегда компромисы:
    1. между скоростью выполнения и объемом съедаемой прпгой памяти (увеличить скорость можно путем кэширования результатов вычислений очень часто выполняемых программой, но это в свою очередь будет кушать больше памяти)
    2. между скоростью выполнения и удобством написания/отладки
    3. и др.

    Выбор в любом случае за Вами. А чтобы он был правильный, Вам надо как минимум:
    - определить критерии выбора ЯП и расставить приоритеты этим критериям
    - ознакомится с возможностями различных ЯП и взвесить их относительно выбранных критериев
    - Сделать выбор (за Вас его точно никто сделать не сможет)
  • Что может заменить c++?

    lastuniverse
    @lastuniverse
    Afafks, про ассемблер это была шутка. Он конечно в идеале быстрее чем С и С++, но писать на нем графику это маразм.
    По сути я этим коментарием просто попросил Вас объяснить Ваше понимание термина "мощный"
  • Какой это скрипт?

    lastuniverse
    @lastuniverse
    Jasee Cambatch, пример того, что вы называете "таблица" в студию :))

    PS: таблицы бывают очень разные
  • Какой это скрипт?

    lastuniverse
    @lastuniverse
    BRAGA96, в C нет Объектов и соответственно нет cin-ов и cout-в
  • Что может заменить c++?

    lastuniverse
    @lastuniverse
    если мощные == быстрые то assembler :))
  • Как сделать кнопку маленькой в телеграмм боте nodejs?

    lastuniverse
    @lastuniverse
    Елизавета, понятия не имею:)
    Я своего бота делал на node-telegram-bot-api.
    Покажите кусок кода, в котором вы создаете кнопку, посмотрим что можно сделать:)
  • Для чего var elem = options.elem; и и в чем разница и для чего в 31 строке файла JS change, и "index.html" addEventListener('change')?

    lastuniverse
    @lastuniverse
    olya_097,
    ocument.getElementById('voter').addEventListener('change'
    - навешивает на некий элемент с id="voter" функцию, которая будет вызвана если в элементе произошли изменения (например когда в поле ввода текста введен новый текст)
    CustomEvent - позволяет создать свой объект события который в последствии можно передать своему, кастомному обработчику некого события. Например если текст введенный в поле ввода текста содержит емайл адрес, можно с генерировать событие (назовем его условно) "emailentered", и сформировав свой CustomEvent, одним из параметров которого будет введенный емайл адрес передать его обработчикам события "emailentered".

    подробно про события можно почитать тут
  • Что такое Node.js в сравнении с PHP?

    lastuniverse
    @lastuniverse
    Алексей сложившаяся специфика использования не определяет спектр возможных предназначений.
    нода = чат, пхп = блог
    только лишь потому, что на ноде до сих пор не написан нормальный блогодвижек, что в свою очередь лишь потому, что таких движков, вылизанных временем, с кучей возможностей уже немало написано на php. То есть, если все таки взять и написать качественный блог на node.js он будет ничем не хуже чем написанный на php, просто чтобы это сделать понадобится немало времени и усилий, за которые никто дополнительно денег не даст:)
  • Почему NaN в строке?

    lastuniverse
    @lastuniverse
    Neizvest, вот немного привел код в порядок, убрал знак =, сделал мгновенное преобразование при нажатии на кнопки, для примера добавил кнопки КМ и ВЕРСТ


    ЗЫ: исправил ошибки)
  • Как сделать подключение модулей в браузере с помощью require(...) так же как в это делается в nodejs?

    lastuniverse
    @lastuniverse Автор вопроса
    profesor08, :)))
    Теоретически наверное можно сделать скрипты и со 100500 зависимостей но я не использую кучу уже готового, лежащего в npmjs и написанного для браузера. Загружаю только то что написанного своими руками, каждый файл если и имеет зависимости, то только другие модули написанные мной же. Всего их около 2-3 десятков файлов, подгружаются асинхронно чуть меньше чем за секунду.
    Если уж говорить на чистоту, то предложенный вариант является нишевым решением с очень узким сектором применения.
  • Как нарисовать линию с помощью алгоритма Брезенхема и гамма-коррекции в текстовом файле?

    lastuniverse
    @lastuniverse
    Гамма-коррекция тут никак не поможет. sRGB также не касается вашей задачи. Оба по большей части предназначены для унификации цветопередачи на мониторах и печатной продукции.
    Как вариант, для сглаживания линий используйте Wu Algorithm (алгоритм для сглаживания линий).
    Wu Algorithm
    antialias.pngzoom.png


    Для более "тонкого" сглаживания обратите внимание на возможность субпиксельного сглаживания
    субпиксельное сглаживание
    3_1-666x167.png


    PS: перенес из комментариев 2 имплементации:
    1. попытка соединить Ваш код с кодом WuLine (некий псевдокод для понимания)
    // array[][] - полотно на котором рисуем 
    // (далее все функции переделаны под grayscale вариант)
    
    #include "stdafx.h"
    
    #include <iostream> 
    
    #include <iomanip>
    
    #include <fstream> 
    
    #include <sstream>
    
    using namespace std;
    
    // функция рисования линии
    void WuLine(int** array, int x0, int y0, int x1, int y1)
    {
        var steep = Math.Abs(y1 - y0) > Math.Abs(x1 - x0);
        if (steep)
        {
            Swap(ref x0, ref y0);
            Swap(ref x1, ref y1);
        }
        if (x0 > x1)
        {
            Swap(ref x0, ref x1);
            Swap(ref y0, ref y1);
        }
    
        DrawDarkPoint(steep, x0, y0, 1);
        DrawDarkPoint(steep, x1, y1, 1);
        float dx = x1 - x0;
        float dy = y1 - y0;
        float gradient = dy / dx;
        float y = y0 + gradient;
        for (var x = x0 + 1; x <= x1 - 1; x++)
        {
            DrawDarkPoint(steep, x, (int)y, 1 - (y - (int)y));
            DrawDarkPoint(steep, x, (int)y + 1, y - (int)y);
            y += gradient;
        }
    }
    
    // функция рисования "черной" точки
    void DrawDarkPoint(bool steep, int x, int y, float c)
    {
        if (!steep)
        {
            var color = GetPixel(x, y);
            color *= (1 - c);
            SetPixel(x, y, color);
        }
        else
        {
            var color = GetPixel(y, x);
            color *= (1 - c);
            SetPixel(y, x, color);
        }
    
    }
    
    // считываем значение цвета точки с полотна в координатах x,y
    int GetPixel(int x, int y){
      // настоятельно рекомендую вставить проверку на выход за границы полотна
      return array[x][y];
    }
    
    
    // рисуем точку на полотне в координатах x,y цветос c (число от 0 до 255)
    void SetPixel(int x, int y, int c){
      // настоятельно рекомендую вставить проверку на выход за границы полотна
      array[x][y] = c;
    }
    
    
    // далее почти без изменений Ваш код
    int main(void)
    {
      ofstream fout;
      
      fout.open("E:\\line.pgm");
    
      fout.write("", 0);
    
      fout « "P2" « "\n" ;
    
      int numcols, numrows, x1, x2, y1, y2;
    
      cout « "Enter rows and columns number: ";
    
      cin » numrows » numcols;
    
      cout « "Enter coords x1 and y1: ";
    
      cin » x1 » y1;
    
      cout « "Enter coords x2 and y2: ";
    
      cin » x2 » y2;
    
      fout « numrows « " " « numcols « "\n";
    
      fout « 255 « "\n";
    
      int** array = new int*[numrows];
    
      for (int count = 0; count < numrows; count++)
    
        array[count] = new int[numcols];
    
      for (int i = 0; i < numrows; ++i) {
    
        for (int j = 0; j < numcols; ++j) {
           array[i][j] = 255;
        }
    
      }
    
      WuLine(array, x1, y1, x2, y2);
    
      for (int i = 0; i < numrows; ++i) {
    
        for (int j = 0; j < numcols; ++j) {
          fout « array[i][j] « " ";
        }
    
      }
    
      fout.close();
    
    }

    2. полностью рабочий вариант на nodejs
    // подключаем библиотеку работы с файлами
    const fs = require('fs');
    
    // создаем сласс Canvas
    function Canvas(width,height){
      this.width = width;
      this.height = height;
      this.sheet = [];
      for(let y=0; y<height; y++){
        this.sheet[y]=[];
        for(let x=0; x<width; x++){
          this.sheet[y][x]=255;
        }
      }
    };
    
    // Метод рисования линии
    Canvas.prototype.WuLine = function(x0, y0, x1, y1) {
      const steep = Math.abs(y1 - y0) > Math.abs(x1 - x0);
      if (steep) {
        var swap; 
        swap = x0; x0 = y0; y0 = swap;
        swap = x1; x1 = y1; y1 = swap;
      }
      if (x0 > x1) {
        var swap; 
        swap = x0; x0 = x1; x1 = swap;
        swap = y0; y0 = y1; y1 = swap;
      }
    
      this.DrawDarkPoint(steep, x0, y0, 1);
      this.DrawDarkPoint(steep, x1, y1, 1);
      const dx = x1 - x0;
      const dy = y1 - y0;
      const gradient = dy / dx;
      let y = y0 + gradient;
      for (var x = x0 + 1; x <= x1 - 1; x++)
      {
        this.DrawDarkPoint(steep, x, y, 1 - (y - Math.floor(y) ) );
        this.DrawDarkPoint(steep, x, y + 1, y - Math.floor(y) );
        y += gradient;
      }
    };
    
    // метод рисования "черной" точки
    Canvas.prototype.DrawDarkPoint = function(steep, x, y, c) {
      const xx = Math.floor(x);
      const yy = Math.floor(y);
    
      if (!steep)	{
        var color = this.GetPixel(xx, yy);
        color *= (1 - c);
        this.SetPixel(xx, yy, color);
      } else {
        var color = this.GetPixel(yy, xx);
        color *= (1 - c);
        this.SetPixel(yy, xx, color);
      }
    
    };
    
    // метод получает значение цвета точки с полотна в координатах x,y
    Canvas.prototype.GetPixel = function(x, y) {
      return this.sheet[y][x];
    };
    
    
    // метод устанавливает значение с в точку на полотне в координатах x,y 
    Canvas.prototype.SetPixel = function(x, y, c) {
      c = Math.floor(c);
      if(x<0 && x>=this.width) return;
      if(y<0 && y>=this.height) return;
      this.sheet[y][x] = c;
    };
    
    // метод сохраняет картинку в файл в формате PPM
    Canvas.prototype.savePPM = function(fname) {
      const fd = fs.openSync(fname, 'a');
      fs.writeSync(fd, "P3\n");
      fs.writeSync(fd, "# P3 обозначает, что цвета даны в ASCII,\n");
      fs.writeSync(fd, "# затем идут цифры, обозначающие число колонок и рядов\n");
      fs.writeSync(fd, "# 255 для максимального значения цвета\n");
      fs.writeSync(fd, "# затем триплеты RGB\n");
      fs.writeSync(fd, this.width + " " + this.height + "\n");
      fs.writeSync(fd, "255\n");
      this.sheet.forEach(a=>{
        a.forEach(c=>{
          fs.writeSync(fd, c + " " + c + " " + c + "\n"); 
        });
      });
    };
    
    
    
    
    var canvas = new Canvas(400,400);
    for(let i=0; i<360; i+=10 ){
      const x = 200+Math.round(Math.cos(Math.PI*i/180)*190 );
      const y = 200+Math.round(Math.sin(Math.PI*i/180)*190 );
      canvas.WuLine(200, 200, x, y);
    }
    
    canvas.savePPM("test.ppm");

    5bd6cb8fbf6b3023697404.png
  • Как реализовать алгорим задачи о сумме подмножеств?

    lastuniverse
    @lastuniverse
    Посидел, подумал, ничего толкового не придумал:)
    собрал вариант тупого перебора

    Если задать 330 значений, ждать можно очень долго, возможно день, возможно год, надо считать :) (максимально возможное число вариантов которое будет перебирать алгоритм будет запредельно)
    Поэтому в примере задал множество включающее всего 30 элементов.
    код:
    /**
     * готовим исходные данные (рандомно:)
     */
    
    // искомая сумма, генерируем случайное целое число в диапазоне от 0 до 100.
    var S = Math.floor(Math.random()*50);
    
    // массив в котором хранится подмножество
    var N = [];
    
    // заполняем его случайными целыми числами в диапазоне от -s до +s
    for( var i=0; i<30; i++){
    	N[i] = Math.floor(Math.random()*S*2)-S;
    }
    
    
    /**
     * перебираем (в случае большого числа элементов в N может быть критично по памяти :) 
     */
    
    // начинаем поиск (алелуя :)
    console.log("искомая сумма: ("+S+")");
    console.log("множество значений:\n("+N.join(", ")+")\n");
    
    searchSubN(S, N, [])
    
    // рекурсивная функция (производит полный перебор всех вариантов)
    function searchSubN(S, N, sub) {
    	// начинаем перебор
    	N.forEach((c,i)=>{
    		// клонируем массив решений
    		var cloneSub = sub.slice();
    		if(c===S){
    			// найдено очередное решение
    			cloneSub.push(c);
    			// выводим сообщение
    			console.log("найдено решение: summ("+cloneSub.join(", ")+") = "+cloneSub.reduce( (a,c)=>{return a+c;} ) );
    		}else if(c<S){
    			// возможно это станет решением
    			cloneSub.push(c);
    
    			// делаем клон массива 
    			var clone = N.slice();
    			// удаляем из клона текущий элемент
    			clone.splice(i,1);
    			
    			// ищем следи оставшихся подмножество равное S-c
    			searchSubN(S-c, clone, cloneSub);
    		}
    	});
    }


    результат:
    ~/share/programming/work/test> node search.sub.01.js 
    искомая сумма: (14)
    множество значений:
    (11, 8, -5, 9, -8, -6, 2, 4, 12, -11, -2, -4, 6, -10, -1, -7, -13, -10, 9, -7, 2, -3, 5, 0, -13, 7, -11, -8, 10, -12)
    
    найдено решение: summ(11, -5, 8) = 14
    найдено решение: summ(11, -5, -8, 8, -6, 9, 2, -11, 4, -2, 12) = 14



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

    lastuniverse
    @lastuniverse
    А можно по другому, например вот так :)