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

    oshliaer
    @oshliaer Куратор тега Google Apps Script
    Google Products Expert
    6089a3d8e7bd2069729294.png

    Ну, наверное, это MMULT результатов MMULT

    =INDEX(
      MMULT(
        N(ARRAY_CONSTRAIN(C2:Z/(MMULT(TRANSPOSE(ROW(C2:Z)^0);N(C2:Z)));
        MATCH(2;1/(B2:B<>"");1);
        MATCH(2;1/(C1:1<>"");1)));
        SEQUENCE(MATCH(2;1/(C1:1<>"");1);1)^0)/MATCH(2;1/(C1:1<>"");1)
    )


    Пример и полезные ссылки в Таблице.

    Техника MATCH(2;1/(B2:B<>"");1) может быть избыточна в том смысле, что это поиск последнего действительного значения для обрезки. Если вы будете содержать последовательности заголовков событий и игроков без пробелов, то действительно следующее

    =INDEX(
      MMULT(
        N(ARRAY_CONSTRAIN(C2:Z/(MMULT(TRANSPOSE(ROW(C2:Z)^0);N(C2:Z)));
        COUNTA(B2:B);
        COUNTA(C1:1)));
        SEQUENCE(COUNTA(C1:1);1)^0)/COUNTA(C1:1)
    )


    Диаграмма на скрине приведена неслучайно. Она показывает, что общий вес расчета равен 100%, как проверка.

    С скриптом не стал заморачиваться, но, доверяя Григорий Боев, думаю, что пользовательская функция при должной проработке будет более гибкой. Выбор зависит от конечной цели и циклов проработки результатов и будущих улучшений Таблицы.
    Ответ написан
    Комментировать
  • Как подсчитать количество повторов напротив каждой компании?

    oshliaer
    @oshliaer Куратор тега Google Sheets
    Google Products Expert
    Возможно,

    =ARRAYFORMULA(IF(A3:A100<>"";MMULT(
      (ROW(A3:A100)>=TRANSPOSE(ROW(A3:A100))) *
        (A3:A100=TRANSPOSE(A3:A100))^1;
      ROW(A3:A100)^0
    );))


    60877f145ef43240259991.png

    См. примеры Выполнение расчетов с накоплением. Счет
    Ответ написан
    Комментировать
  • Как из нескольких объектов сделать один, сложив значения свойств с одинаковыми именами?

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

    const sum = (...arr) => arr
      .flatMap(Object.entries)
      .reduce((acc, [ k, v ]) => (
        acc[k] = (acc[k] ?? 0) + v,
        acc
      ), {});

    Длинно:

    function sum() {
      const result = {};
    
      for (const n of arguments) {
        for (const k in n) {
          if (n.hasOwnProperty(k)) {
            if (!result.hasOwnProperty(k)) {
              result[k] = 0;
            }
    
            result[k] += n[k];
          }
        }
      }
    
      return result;
    }

    Использовать, понятное дело, так: const obj = sum(obj1, obj2);.
    Ответ написан
    Комментировать
  • VBA | Как уменьшить шрифт если текст не помещается TextBox?

    Krasnoarmeec
    @Krasnoarmeec
    Вставьте в форму UserForm1 невидимый лейбл Label1.
    Label1: AutoSize = True, Visible = False, Фонт такой же как и у TextBox1 (имя, размер, жирность, курсив).
    Поиграйте с коэффициентом 1.1, если не влезает.

    Private Sub TextBox1_Change()
        Label1.Width = UserForm1.Width
        Label1.Caption = TextBox1.Text
        
        If Label1.Width > TextBox1.Width Then
            Label1.Font.Size = Label1.Font.Size * (TextBox1.Width / Label1.Width / 1.1)
            TextBox1.Font.Size = Label1.Font.Size
        End If
    End Sub
    Ответ написан
    Комментировать
  • Как заставить нейронку на Python подгонять коэффициенты уравнений?

    @dmshar
    Господи, опять велосипед....
    Ну поставили вы в теге "машинное обучение". Значит понимаете, что начинается все не с нейронных сетей, а со статистики. Там ваша задача, которая называется задачей регрессии, 120 лет как решается элементарно.
    В sklearn есть функция LinearRegression.
    В numpy есть модуль numpy.linalg.linalg, в котором есть нужные реализации

    Не хотите готовую функцию - пишите свою, материала в сети тоже навалом:
    https://towardsdatascience.com/linear-regression-f...
    https://machinelearningmastery.com/implement-simpl...

    Причем тут "случайно сгенерированный график" - вообще не понятно. Да и как вы собрались графики сравнивать, если график это рисунок. А сравнивать можно данные. И не надо сразу браться за нелинейные функции, начните с простейших, с линейных, потом - доберетесь и до квадратичных и до нескольких переменных. В общем - рекомендую потратить время и разобраться с азов, что-бы потом не выглядеть вот так:6076c59895078933463804.png
    Ответ написан
    7 комментариев
  • Как сделать пользовательскую структуру данных в JavaScipt?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Деструктурировать-непередеструктурировать:
    const makeUser = ({name, age, lang, skills}) => ({name, age, lang, skills});
    
    const user = makeUser(getInfo());
    
    /* {
      "name": "John",
      "age": "20",
      "lang": "en",
      "skills": ["js", "html", "css"]
    } */
    Ответ написан
    1 комментарий
  • Как получить координаты по окружности?

    @habrspec
    Необходимо использовать формулы Винценти для решения прямой и обратной задач.

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

    https://en.wikipedia.org/wiki/Vincenty%27s_formulae
    https://movable-type.co.uk/scripts/latlong-vincent...
    Ответ написан
    2 комментария
  • Примерно в одно и тоже время пропадает частично интернет?

    dimonchik2013
    @dimonchik2013
    non progredi est regredi
    возможно, внешние силы?
    Ответ написан
    Комментировать
  • Как составить правильное регулярное выражение для notepad?

    @rotarepmipoleved
    Найти:
    (<script(\stype="text\/javascript")?>)(.*?)(<\/script>)


    Заменить на:
    \1\$\(document\).on\('ready', function\(\) \{\3\}\);\4
    Ответ написан
    5 комментариев
  • Как правильно использовать LockService в Google Apps Script?

    oshliaer
    @oshliaer Куратор тега Google Apps Script
    Google Products Expert
    Метод waitLock вызывает исключение, обрабатывайте его.

    var lock = LockService.getPublicLock();
    try {
      lock.waitLock(30000);
      return success();
    } catch (err) {
      Logger.log('Could not obtain lock after 30 seconds.');
      return failure();
    }


    Для неразрывности функции используйте tryLock. Этот метод заворачивает результат блокировки в булево значение:
    var lock = LockService.getPublicLock();
    var success = lock.tryLock(30000);
    if (!success) {
      Logger.log('Could not obtain lock after 30 seconds.');
    }
    Ответ написан
    Комментировать
  • Как быстро проверить, является ли некоторое огромное число (от 100 знаков) квадратом целого числа?

    wataru
    @wataru Куратор тега Математика
    Разработчик на С++, экс-олимпиадник.
    Можно попробовать вычислить корень быстрым алгоритмом. Но там сложно. Гуглите Karatsuba square root. Есть открытые реализации. Есть еще какой-то адский метод через быстрое преобразование Фурье, попробуйте погуглить и его.

    Более простой в реализации, но менее быстрый метод вычисления корня - бинарный поиск. Храните l, r, l^2, r^2 и lr. По этим числам можно вычислить m=(l+r)/2, m^2, m*l, m*r без длинных умножений, а только складывая длинные числа и деля на 2. Вам надо поддерживать, чтобы l^2 <= n <= r^2. Изначально можно сделать l=1, r=10^51 (или больше - половина длины входного числа + немного, чтобы точно квадрат был больше n), потом делить отрезок пополам и отбрасывать ненужную половину.

    Еще есть вероятностный метод через символ Лежандра/Якоби. Это будет самым быстрым методом.

    Это как смотреть на последнюю цифру. Квадраты могут давать там 0, 1, 4, 9, 6, 5. Но нет ни одного квадрата, который оканчивался бы на 2. Т.е. если число заканчивается на 2, то можно сразу говорить, что это не квадрат. Это мы взяли остаток от деления на 10 (последняя цифра) и посмотрели, какие из них хорошие. Вот символ Лежандра - это такая проверка для модуля по любому простому числу (а не 10).

    Если брать некоторое простое число p, то n может быть квадратом, только если символ Лежандра (n/p) - равен 1 или 0 (По научному: n - должно быть квадратичным вычетом).

    Если брать небольшие (<64-битные) простые числа, то можно за линию считать n%p и потом вычислять символ Лежандра (n%p/p) по алгоритму через символ Якоби за O(log(p)^2). Когда подсчитали символ Лежандра и если он -1, то n - точно не корень.

    Тут проблема в том, что это необходимый, но недостаточный критерий - если для какого-то p вы получили -1 - то это точно не квадрат. Но возможно можно подобрать такое число, что все ваши тесты дадут 1, а оно не квадрат. Поэтому надо брать много простых чисел. Скажем, 20. Желательно еще числа брать достаточно большими. Но их не надо искать каждый раз, можно захардкодить. Грубая прикидка говорит, что вероятность ошибки такого алгоритма 2^(-количество простых чисел).

    Т.е. берете много простых чисел. Считаете для каждого n%p выполняя деление большого числа на короткое (один проход по массиву цифр). Потом считаете символ Лежандра. Если получили где-то -1 - то точно не квадрат. Иначе - скорее всего квадрат.

    Можно совместить вероятностный тест и вычисление корня. Сначала проверьте парочку простых чисел на символ Лежандра для отсечения точно не квадратов. Еще проверку последней цифры можно сделать, это очень дешево. Если не отсеклись, то считайте корень. Так будет всегда работать правильно но будет быстрее работать в некоторых случаях.
    Ответ написан
    Комментировать
  • Найдена опасная уязвимость в очень популярном мобильном приложении. Что делать?

    CityCat4
    @CityCat4 Куратор тега Информационная безопасность
    Дома с переломом ноги
    и учечка данных пользователей может обойтись сервису 100.......000$-ми убытками

    Может. Но (тебе) лучше, чтобы об этом сообщил кто-нибудь другой. Потому что скорее всего, тебя же и обвинят во взломе и хищении.
    Обращаться стоит только в том случае, если у сервиса есть программа по исправлению ошибок ("bugs bounty"), если же нет, а аппликуха популярная - лучше перестать пользоваться, застраховаться и не лезть, ну или сообщить с левого одноразового мейла.
    А что до вознаграждения - вот что пишет классик, Иван наш Андреевич Крылов
    Ответ написан
    Комментировать
  • Куда движется индустрия?

    gbg
    @gbg Куратор тега Электроника
    Любые ответы на любые вопросы
    1) Индустрия электроники огромна. Сказать, что вот прямо сразу весь мир прыгнул на 32 битные армы - это солгать. Более правильно сказать, что популярные блоггеры с производительностью пулемета штампуют статьи об stm32, при этом уровня "мигаем ледом".

    2) С точки зрения разработчика, микроконтроллер - это инструмент. Каждый инструмент должен соответствовать задаче и быть до конца понятен тому, кто его использует. Я никому не пожелаю начинать обучения с STM32 - путанная документация и библиотека, которая состоит из макросов, вызывающих макросы, кроме укачивания при многочасовом скроллинге в попытках докопаться до истины, никаких эмоций не вызывает.

    2.a) 32битный монстр с линуксом в стиралке - (и управление стиралкой, написанное на питоне, в тренде времени) - это сумасшествие. Потому что вместе с линуксом и питоном он притащит за собой кучу багов на всех уровнях, необходимость обновлений и прочее админство. Если на телефоне это еще покатит (семь бед - один резет, а через пару лет аппарат в помойку), то в стиралке, один неверно записанный бит может устроить потоп или даже легкий дестрой. Следовательно, когда речь идет об управлении какими-то технологическими процессорами (и о материальной ответственности), индустрия будет консервативна.

    Основные принципы электроники сейчас - максимально запихивание перифирии в один чип. Этот тренд можно проследить с 1970х - начинали с огромных плат, где процессор - отдельно, память - отдельно, АЦП - снова отдельно, куча корпусов для развязки устройств на шине и так далее. Постепенно все эти запчасти стали помещаться в один корпус. Например - ESP8266 - это процессор, память, wi-fi и куча другой периферии, засунутые в один корпус.

    Это дает снижение энергопотребления, повышение производительности, удешевляет платы.
    Ответ написан
    8 комментариев
  • Как вставить картинку непосредственно в ячейку Таблицы?

    oshliaer
    @oshliaer Куратор тега Google Apps Script
    Google Products Expert
    Решение на данный момент

    function insertImageToCell() {
      const image = SpreadsheetApp
        .newCellImage()
        .setSourceUrl('https://upload.wikimedia.org/wikipedia/commons/5/50/Smile_Image.png')
        .build();
      SpreadsheetApp.getActiveRange()
        .setValue(image);
    }

    Предыдущий ответ

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

    Функция вставки
    /**
     * Insert a single image to the cell. A1 is default
     *
     * @param {GoogleAppsScript.Spreadsheet.Sheet} sheet
     * @param {GoogleAppsScript.Base.Blob} blob
     * @param {number} row
     * @param {number} column
     */
    function insertImageBlobToCell_(sheet, blob, row = 1, column = 1) {
      const sheetName = sheet.getName();
      const parentId = sheet.getParent().getId();
      return DocsServiceApp.openBySpreadsheetId(parentId)
        .getSheetByName(sheetName)
        .insertImage([{ blob, range: { row, column } }]);
    }


    Пример вызова
    /**
     * Insert an image blob to the cell
     */
    function userActionRun() {
      const sheet = SpreadsheetApp.getActiveSheet();
      const blob = UrlFetchApp.fetch(
        'https://contributor.pw/img/post/sheets/sheets_mmult-some-uses-cases_01.png'
      ).getBlob();
      insertImageBlobToCell_(sheet, blob);
    }


    Результат
    601a1d24dca43655873570.png

    Не забудьте добавить библиотеку
    108j6x_ZX544wEhGkgddFYM6Ie09edDqXaFwnW3RVFQCLHw_mEueqUHTW
    в свой проект. Пример манифеста в сниппете
    Ответ написан
    4 комментария
  • Почему некорректно работает doGet, если логиниться под другим доменом?

    oshliaer
    @oshliaer Куратор тега Google Apps Script
    Google Products Expert
    Это приложение должен разрешить администратор системы. Ну, или наоборот, администратор системы запретил устанавливать какие-либо приложения, кроме тех, которые разрешил.

    Обратитесь к администратору Google Workspace, с доменом которого возникли проблемы.
    Ответ написан
    5 комментариев
  • Как сделать так, чтобы Google таблица открывалась в нужном месте?

    shebanits
    @shebanits
    function onEdit(e){
      let row = e.range.getRow();
      let column = e.range.getColumn();
    
      let cache = CacheService.getScriptCache();
      cache.putAll({
        "row": `${row}`,
        "column": `${column}`
      });
    }
    
    function onOpen() {
      let cache = CacheService.getScriptCache();
      let sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
      let row = cache.get("row");
      let column = cache.get("column");
      sheet.getRange(+row, +column).activate();
      SpreadsheetApp.flush();
    
    }
    Ответ написан
    Комментировать
  • Существуют ли нормально замкнутые полевики при отсутствии питания?

    Ocelot
    @Ocelot
    Существуют. Называются транзисторы со встроенным каналом (depletion mode MOSFETs), но силовых среди них почти нет. У IXYS есть несколько моделей, которые подойдут вам по параметрам:
    https://www.digikey.com/en/products/filter/transis...

    Гораздо проще сделать схему, которая будет открывать транзистор, используя напряжение, которое тот должен коммутировать. А если вообще никакого питания нет, то какая разница, открыт транзистор или закрыт?
    Ответ написан
    1 комментарий
  • Не подкинете тему для курсовой работы с использованием PIC?

    @Avsmirn0ov
    Блок питания с цифровым управлением, самое напрашивающееся. Скажем, регулировка выхода дискретно 3.3, 5 и 12 вольт, и плавно от 2 до 20 с ограничением в 3 ампера. И выводом на дисплейчик того, что на выходе. Код не самый сложный, только по сути ШИМ и обработка команд, и немного аналоговых деталюх. Сложность может вызвать только трансформатор купить/намотать и защиту сделать на операционнике. Схем в интернете полно
    Ответ написан
    Комментировать