• Как разделить "веса" на кластеры КОРРЕКТНО?

    wataru
    @wataru Куратор тега Математика
    Разработчик на С++, экс-олимпиадник.
    Сначала вам нужно определиться, нужно ли вам фиксированное количество кластеров, или переменное. Затем вам нужно придумать метрику, которая говорила бы, какая кластеризация лучше другой.

    Варианты метрик:

    - Для каждого кластера считается наибольшее расстояние между двумя элементами, и это суммируется по всем кластерам. Можно суммировать квадраты этих расстояний, тогда будут наказываться кластеризации с очень большими кластерами.
    - отношение максимального расстояния между соседними точками в любом кластере и минимального расстояния между кластерами.
    - Это может быть и качественная метрика. Любая кластеризация, где расстояние между соседними точками в кластере меньше расстояния между кластерами считается хорошей. Это частный случай предыдущей метрики, но вам достаточно искать не минимум, а любое значение <1.

    Некоторые метрики имеют смысл только при фиксированном количестве кластеров, как первая.

    Разные метрики дают разные кластеризации и все они в каком-то смысле хорошие. Что именно подходит вам в вашей задаче - можете судить только вы эмпирически.

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

    Многие метрики, если они аддитивны как первая, можно считать динамическим программированием: f(i,k) - значение метрики если мы разбили первые i точек на k кластеров.

    Для других, как для второй придется смешивать дихотомию по ответу и динамическое программирование (бинарный поиск по ответу, далее проверяем, а есть ли разбиение с такой или лучшей метрикой. Внутри динамика - минимально достижимое значение максимума между соседними точками в классе среди первых i при разбиении на k кластеров. При переборе последнего кластера нужно смотреть, чтобы расстояние между ним и соседними не превышало ответа динамики деленного на перебираемый коэффициент).

    Еще можно применять стандартные методы без оптимизаций опирающихся на то, что у нас одномерное пространство - тупо применяйте метод k ближайших соседей, например.

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

    Jeer
    @Jeer
    уверенный пользователь
    Могу порекомендовать книгу Графика на javascript Рафаэлло Чекко - там в одной главе делается игра space invaders и разбирается, в том числе, ваш вопрос
    Ответ написан
    1 комментарий
  • Нужни ли знания математики для unity 2d?

    GavriKos
    @GavriKos Куратор тега Разработка игр
    Нужны. Желательно все школьные, минимум
    Если уж так по темам - то приблизительно:
    - базовая математика (класса до 6)
    - векторная алгебра
    - тригонометрия
    - планиметрия (т.е. геометрия на плоскости)
    - все сопутствующее для понимания вышеперечисленного
    Ответ написан
    2 комментария
  • Как сделать,чтобы бот писал в лс при заходе игрока?

    Alexandre888
    @Alexandre888 Куратор тега Боты
    Javascript-разработчик
    bot.on("guildMemberAdd", member => {
      member.send("определённое сообщение")
    })

    не забудьте включить SERVER MEMBERS INTENT, без этого работать не будет. (Discord Developer Portal > ваш бот > Bot > SERVER MEMBERS INTENT)

    с наступающим Новым годом.
    Ответ написан
    Комментировать
  • Почему появляется ошибка console.log is not a function?

    lazalu68
    @lazalu68
    Salmon
    Давайте оставим в коде только строки имеющие отношение к проблеме, тогда всё будет понятно:

    console = false;
    ...
    console.log('something');
    // Uncaught TypeError: console.log is not a function
    Ответ написан
    Комментировать
  • Как отсортировать массив массивов строк в js?

    WblCHA
    @WblCHA
    Раз такое дело, Дмитрий Беляев, Роман, оцените.)
    (() => {
      const orderArray = (arr) => {
        const itemsForMap = arr.map((items) => ([items[0], { items, prev: undefined }]))
        const itemsMap = new Map(itemsForMap);
    
        let last;
        itemsMap.forEach((node) => {
          const next = itemsMap.get(node.items[1]);
          if(next) {
            next.prev = node;
          }
          else {
            last = node;
          }
        });
    
        const result = [];
        result.length = arr.length;
    
        let current = last;
        for(let i = result.length - 1; i > -1; i--) {
          result[i] = current.items;
          current = current.prev;
        }
    
        return result;
      };
      
      return orderArray([['butter', 'jelly'], ['bananas', 'apples'], ['peanuts', 'butter'], ['jelly', 'bananas']]);
    })()

    Вроде всё верно, но я это в 7 утра перед сном писал...
    Ответ написан
    1 комментарий
  • Как отсортировать массив массивов строк в js?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Данная задача в принципе не решается сортировкой, так как сортировка это про отношение больше/меньше/равно, которого в данном случае нет.
    Самое простое здесь, это построить из этих элементов двусвязный список, а затем преобразовать его в результирующий массив:
    function orderArray(arr) {
      // для начала построим ноды списка и соберем их в 2 HashMap по обоим строкам
      const maps = arr.reduce((acc, item) => {
        const node = {item, next: null, prev: null};
        acc[0][item[0]] = node;
        acc[1][item[1]] = node;
        return acc;
      }, [{}, {}]);
    
      // после пройдемся по обоим HashMap и соединим связи
      for(const key of Object.keys(maps[0])) {
        maps[0][key].next = maps[0][maps[0][key].item[1]] || null;
      }
      for(const key of Object.keys(maps[1])) {
        maps[1][key].prev = maps[1][maps[1][key].item[0]] || null;
      }
    
      // найдем начальную ноду списка (ноду без предыдущей ноды)
      let cur = Object.values(maps[0]).find(({prev}) => prev === null);
    
      // и начиная с нее соберем список в массив
      const result = [];
      while(cur) {
        result.push(cur.item);
        cur = cur.next;
      }
    
      return result;
    }
    
    console.log(orderArray([['butter', 'jelly'], ['bananas', 'apples'], ['peanuts', 'butter'], ['jelly', 'bananas']]));
    Ответ написан
    1 комментарий
  • Как посчитать угол по 2-м координатам?

    alpha = arccos (deltaX / deltaY)
    PS а "высшая математика" в тэгах к вопросу - это маркетинг? :)

    UPD: ойблин, пардон... все учителя математики моей юности, простите меня :/

    конечно же alpha = atan ( deltaY / deltaX )
    ну а при deltaX=0, alpha = sign(deltaY) * pi/2;
    Ответ написан
    4 комментария
  • Если обнулить ссылку в объекте, которая ссылаеться на подобъект, то этот подобъект удалится?

    sinneren
    @sinneren
    Выше уже сказали ,если удалить и ссылок нет, то удалится. Но в вашем примере вы просто присваиваете subBruh значение null, так что сам subBruh останется, аналогично и для subObj.
    Правильно делать через delete: delete obj1.subObj - удалит весь объект subObj.
    Ответ написан
    Комментировать
  • Как подключить синтез речи к сайту?

    vabka
    @vabka
    Токсичный шарпист
    У Yandex speech kit есть api.
    Вы можете к этому api обращаться, а потом при помощи js воспроизводить сгенерированную речь.
    Тк в speech kit тарификация идёт за количество - лучше кэшировать результат для всех неизменённых текстов.

    UPD: но вообще не вижу смысла в этом. В большинство браузеров уже включена такая функция совершенно бесплатно. Кому это реально надо (например слепым) - уже и так пользуются всякими разными экранными дикторами. Лучше озаботьтесь тем, чтобы экранные диктормы могли корректно прочитать разметку вашего сайта.
    Ответ написан
    Комментировать
  • С помощью какой программы можно нанести размерные линии со сносками на изображение?

    leahch
    @leahch
    3Д специалист. Долго, Дорого, Дерьмово.
    Inkscape.org например.
    Ответ написан
    Комментировать
  • Как предпочтительнее вешать обработчик событий на элемент?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Чтобы ответить на этот вопрос, достаточно подумать над тем, как будет выглядеть подключение ещё одного обработчика в каждом из представленных случаев.
    Ответ написан
    1 комментарий
  • Как сделать команды с "похожим" текстом?

    bingo347
    @bingo347 Куратор тега Node.js
    Crazy on performance...
    Если набор возможных команд небольшой, то расстояние левенштейна Вам подойдет, с какой командой расстояние минимально - ту и подразумевал пользователь, ну и стоит вести некое пороговое значение, если все команды "дальше" этого значения, то введена бессмыслица
    Ответ написан
    Комментировать
  • Как реализовать данную структуру в виде двух массивов: NAME и NEXT?

    Gremlin92
    @Gremlin92
    Целеустремленный
    В одном массиве значения, а в другом порядок a[b[n]]
    Ответ написан
    2 комментария
  • В чем ошибка мат формулы?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Если записано математическими терминами, то:
    |x| => Math.abs(x),
    [x] => Math.floor(x).
    Проценты дописываются уже при выводе результата.
    Ответ написан
    1 комментарий
  • Можно ли jquery код преобразовать в чистый javascript?

    cannibal_corpse
    @cannibal_corpse
    Верстальщик руками
    //объявляем переменные, в которые записываем DOM-элементы
    let contactBtn = document.querySelector('.contact_btn'); 
    let contactWrapper = document.querySelector('.contact_wrapper');
    let contactBlock = document.querySelector('.contact_block');
    
    //ставим обработчик на клик
    concatBtn.onclick = () => {
     contactBlock.style.display = 'block';
     contactWrapper.style.display = 'none';
    }
    Ответ написан
    Комментировать
  • Можно ли jquery код преобразовать в чистый javascript?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Ответ написан
    Комментировать
  • Где брать дешевый трафик для сайта?

    DanArst
    @DanArst
    Гриффиндор в моде при любой погоде!
    Попробуйте буксы всякие. Зарегайтесь и разместите задание по типу "Тест", где надо будет зайти на сайт и найти ответы на вопросы на соответствующих страницах. Цену за задание установите сами.
    Плюс такого трафика, то что будет хорошая глубина просмотра и продолжительность сеанса.
    Ответ написан
    1 комментарий
  • Какие знания требуются для js trainee?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Чё-то смеюсь. Раньше вы хотели быть джуном. То, что за прошедшие два с лишним года вы свои амбиции поумерили - это хорошо. Правда, не до конца - ну да это ничего, ещё через два года наверняка дозреете до осознания того факта, что не бывать вам программистом. Отсюда кстати и ответ на непосредственно заданный вопрос - вам никакие знания не требуются. Успокойтесь, и идите работать в такси.
    Ответ написан
    2 комментария
  • Почему не работает решение задачи?

    WblCHA
    @WblCHA
    Интересный алгоритм, но реализация хромает.
    const arr = [1, 2, 23, 23, 23, 0, 4, 2, 11, 4, 3, 3, 3, 3, 23, 23]

    Вот кейс, который ломает работу алгоритма. Если максимальное число в массиве имеет больше всего повторений, а ранее в массиве встречалось число с на 1 меньшим количеством повторений, то усё.
    Причина в этом:
    while(i < arrSort.length-1)
    Почему ты решила, что выходить из цикла на предпоследнем элементе хорошая идея, мне решительно непонятно.

    Помимо этого есть ещё ряд проблем, которые влияют лишь на качество кода:

    let arrSort = arr.sort((a,b)=> a < b ? -1 : 1)

    Во-первых, сорт работает на месте. Во-вторых, что это за извращение в калбеке?
    arr.sort((a, b) => a - b)

    let numberNext = 1;
    let i = 0;

    С чего вдруг первое равно единице, а второе нулю? При первой же паре значений numberNext окажется меньше i, он банально не на каждой итерации увеличивает своё значение, в отличии от i.

    while(i < arrSort.length)

    По какой причине тут используется вайл, когда тут всё для фора заточено?
    ;
        let numberNext = 0;
        let number = arr[0];
    
        for(let i = 1; i < arr.length; i++) {
          if(arr[i] === arr[numberNext]) {
            number = arr[numberNext];
            continue;
          }
          numberNext++;
        }


    numberNext+=1
    i++

    Ты уже определись какой вариант ты будешь использовать.

    И последнее, аллергия на ;?)
    Ответ написан
    3 комментария