• Нужно найти одинаковые числа в массиве?

    lastuniverse
    @lastuniverse
    Всегда вокруг да около IT тем
    const km = [25, 45,  95, 125, 150, 200, 325, 250, 165, 350]
    
    const cof = [1, 1.5, 1,  1.5, 1.2, 1.5, 1 ,  0.5, 1.2, 1.5];
    
    // как то так
    const res = cof.reduce((a,v,i)=>(a[v]=(a[v]||0)+km[i],a),{});
    
    console.log(res); // { 1: 445, "1.5": 720, "1.2": 315, "0.5": 250 }
    
    console.log(Object.values(res)); // [445, 720, 315, 250];
    Ответ написан
    2 комментария
  • Как проверить принадлежность треугольника пересечению двух окружностей?

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

    @yuopi
    C# developer
    После цикла нужно написать
    return false;
    потому что если будет ситуация, что в цикл не попадет программа, то хз что возвращать.

    А вообще алгоритм тоже не верный - ваш цикл остановится после первой же проверки.

    Метод можно переписать так:
    public static bool isProf(string special)
            {
                dynamic sl = JObject.Parse(File.ReadAllText(@"..\..\..\..\data\source\specialization.json"));
    
                foreach (var property in sl.specialization)
                {
                    if (property == special)
                    {
                        return true;
                    }
                }
                return false;
            }


    А может так?
    public static bool isProf(string special)
            {
                var sl = JObject.Parse(File.ReadAllText(@"..\..\..\..\data\source\specialization.json"));
                return sl.specialization.Any(e => e == special);         
            }


    upd: Еще лучше вынести поле sl в класс, и не читать файл каждый раз, а просто обращаться к полю.
    Ответ написан
    Комментировать
  • Алгоритм не принимается валидатором, что в нем не так?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    'абвгдеёжзийклмнопрстуфхцчшщъыьэюя' => 'бавгдеёжзийклмнопрстуфхцчшщъыьэюя'
    Результат должен быть 0, у вас 1.
    Фокус в том, что если есть цикл замен (а => б => а), то должна быть хоть одна свободная буква для того, чтобы разорвать этот цикл. При этом цикл может быть из произвольного количества замен (а => б => в => г => а). Учитывайте, что буква может освободиться при предыдущих заменах.
    Ответ написан
  • Как перебрать сочетания с большим количеством чисел?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    А в чём проблема? Перебор тривиальный.
    for (i = 1; i < 10000;  i++) {
      for (j = i+1; j <= 10000; j++) {
        // пара [i, j]
      }
    }

    Другое дело, что при 10000 чисел вы получите 10000*9999/2 = 49'995'000 пар.
    То есть, вам надо ускорять обработку каждой пары и распараллеливать вычисления.
    Ответ написан
    1 комментарий
  • Как победить в олимпиаде по программированию?

    saboteur_kiev
    @saboteur_kiev Куратор тега Программирование
    software engineer
    1. Пользуясь поиском, находишь результаты и задачи уже прошедших олимпиад.
    2. Пользуясь тетрадкой и ручкой пробуешь решить эти задачи, чтобы ты понимал смысл их решения на логическо-математическом уровне.
    3. Потом пробуешь написать программу, которая решает конкретную задачу.

    Таким образом, программирование - это последний этап. Сперва необходимо понимать как именно вычисляется/находится решение хотя бы руками на бумажке.

    Повторяешь шаги 1-3 раз 10 с разными задачами.

    Потом находишь организатора или тренера в вашем учебном заведении, который у вас занимается олимпиадами, рассказываешь ему что сделал и участвуешь.
    Ответ написан
    Комментировать
  • Алгоритм для нахождения прогрессии?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Питона не знаю, пишу псевдокодом:
    delta = arr[1] - arr[0]
    max_count = 2
    count = 2
    for (i = 1; i < length(arr)-1; i += 1) {
      if (arr[i+1] - arr[i] == delta) {
        count += 1
      } else {
        delta = arr[i+1] - arr[i]
        count = 2
      }
      if (count > max_count) {
        max_count = count
      }
    }
    Ответ написан
    5 комментариев
  • Как решить уравнение данного типа(скриншот)?

    @dadasay
    можно взять производную заданного уравнения: x' = v = t/3 + 1
    v(3) = 3/3 + 1 = 2 м\с
    В дополнение к ответу посоветовал бы прочитать про физический смысл производной
    Ответ написан
    1 комментарий
  • Как переставить элементы массива из конца в начало?

    @Asokr
    function moveToStart(array, n) {
        return [...array.slice(-n),...array.slice(0, array.length - n)]
    }
    Ответ написан
    Комментировать
  • Как определить пересечение двух объектов 3d?

    samodum
    @samodum
    Какой вопрос - такой и ответ
    Здесь нужно знать геометрию объектов, а не их центр и матрицы преобразований.
    Ещё нужно знать из каких примитивов они состоят. Если это сфера, то алгоритм один, если объекто сложный и состоит из набора плоскостей (треугольников), то надо проверять пересечения каждой этой микроплоскости.
    Если это OpenGL, то задача решается через Stencil Buffer
    Короче говоря, оооочень мало данных для ответа на вопрос.

    Если упростить, то можно "вписать" объекты в сферу или параллелепипед и проверять коллизии этих простых объектов. Это уже школьная геометрия, 6-й класс.
    Ответ написан
    Комментировать
  • Как работает ограничение скорости в роутере при раздаче по wifi?

    Stalker_RED
    @Stalker_RED
    https://ru.wikipedia.org/wiki/%D0%A8%D0%B5%D0%B9%D...

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

    freeExec
    @freeExec
    Участник OpenStreetMap
    Готовые реализации на JS
    https://blog.mapbox.com/a-dive-into-spatial-search...
    Ответ написан
    Комментировать
  • Random как сгенерировать случайные числа но с определенной вероятностью выпадения?

    @dmshar
    Эта элементарная задача называется "генерирование дискретных случайных величин с заданным законом распределения". Решается классическим образом.
    Сначала разбиваем наш диапазон от 1 до 100 на следующие интервалы:
    1-35,36-60,61-85,86-95,96-100.
    Затем генерируем число, равномерно распределенное в диапазоне от 1 до 100. Номер интервала, в который это число попадает дает ваши генерируемые цифры - от 1 до 5, причем распределены они в точности по вашей таблице распределения.
    Ответ написан
    11 комментариев
  • На плоскости расположены n предметов, их нужно переместить в заданные n позиций. Как это сделать?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Ну вы бы хотя бы присказку какую-то добавили о том как рассуждали, что у вас не получилось и всё такое.
    А-то вот решите мне эту задачу, а я думать совсем не хочу.

    Давайте, учитесь уже рассуждать. Задачка несложная, видимо олимпиадная, но для каких-нибудь девятых-десятых классов. Хотя че-то, помнится, там посложнее были.

    Вот у вас есть 50 точек. И ещё 50 точек. Между каждой парой из них (а пар 50 в квадрате) есть какое-то расстояние. Там написано, что точки на плоскости, а значит расстояния между точками вас учили считать в школе по теореме пифагора.
    Если знаете расстояние между точками и знаете скорость каждой точки, значит можно посчитать время.
    Осталось что?
    Ну думайте.
    Этот ресурс не для того, чтобы двоечникам помогать.
    Возможно ваши соперники по олимпиаде сейчас сами думают, а вы, позорник, тут халтурите.
    Ответ написан
    Комментировать
  • Как определить видимые ребра многоугольника к точки на плоскости?

    Многоугольник — это набор вершин, заданный в определенном порядке. Вот и определите нормали исходя из этого порядка. Например, задайте себе как стандарт обход многоугольника всегда по часовой стрелке, тогда нормаль грани всегда будет под 90 градусов влево от вектора, проведенного из вершины n в вершину n+1.
    В 2д движках обычно так и делают.
    Ответ написан
    Комментировать
  • Как правильно сравнивать диапазоны углов?

    @Taus
    Одно из решений. Пусть сектор A описывается упорядоченной парой {A1,A2}, т.е. сектором считается область получающаяся при обходе окружности по часовой стрелке от точки А1 до точки А2.
    1. Привести значения всех углов к диапазону от [0, 2pi).
    2. Если A1 > A2, то разобъём сектор на два: S1 = [A1, 2pi) U [0, A2].
    3. С помощью алгебры множеств и алгоритма пересечения обычных отрезков можно найти пересечение:
    [A1, A2] ∩ [B1, B2] - обычный алгоритм
    ( [A1, 2pi) U [0, A2] ) ∩ [B1, B2] = ( [B1, B2] ∩ [A1, 2pi) ) U ( [B1, B2] ∩ [0, A2] ) - для каждого из пересечений обычный алгоритм
    ( [A1, 2pi) U [0, A2] ) ∩ ( [B1, 2pi) U [0, B2] ) - очевидно, что пересекаются как минимум в точке 0
    Ответ написан
    Комментировать
  • Как понять условие задачи?

    @Mercury13
    Программист на «си с крестами» и не только
    Подобный вывод используется, чтобы было понятно, что вы способны, если нужно, вычислить с точностью до обыкновенной дроби, но в длинную арифметику (а дроби бывают длинные) не лезть. Ибо реализации длинной арифметики различаются по эффективности от ЯП к ЯП, а в некоторых вообще нет штатной (внешние библиотеки в олимпиадном программировании запрещены).

    Числа P и Q высчитываем с точностью до остатка от деления на Z := 109+ 7.

    Авторы обещают, что Q mod Z ≠ 0. Z — простое. Тогда НОД(Q mod Z, Z) = 1. Так называемый расширенный алгоритм Евклида (гуглите!) позволяет подобрать такие числа, чтобы m(Q mod Z) + nZ = 1.

    Ваша задача — вывести ((P mod Z) · m) mod Z. Специально указал дважды mod Z: первое у вас будет при работе с числом P, второе — при генерации вывода.

    Почему так? Возьмём вместо здоровенного Z цифру поменьше, 17. Если у вас получился результат 100/400, при расчётах выйдет цифра 15/9, и 9·2+17·(−1) = 1, и ваша задача — вывести (15·2) mod 17 = 13.

    Если же у вас получилось, например, 35/140, при расчётах получается 1/4, 1·(−4)+17·1 = 1, и вы должны вывести (1·(−4)) mod 17 = 13. То есть: независимо от того, насколько сократимая дробь у вас получилась, вы получите один и тот же результат. Тут надо уточнить: там, где возможен отрицательный числитель, нужен не обычный % из Си++, а (a % Z; если получилось отрицательное — добавь Z).

    Ну а арифметических переполнений просто не допускайте, Z = 109 + 7 позволяет умножать в типе long long и не уходить в переполнение.

    UPD. То, что Z — простое, даёт несколько выгод. Часто результат бывает круглый, и простота требует честно считать остаток, а не угадывать. Ну и побочек меньше.
    Ответ написан
    3 комментария
  • Как обойти граф?

    @alexalexes
    Найдите путь по алгоритму Дейкстры между двумя интересуемыми вершинами.
    Все вершины и дуги, которые не входят в этот путь - зачистить.
    Ответ написан
    Комментировать