• Как узнать, входит ли игрок1 (x,y,z) в поле игрок2 (x,y,z)?

    @WitFed
    Программист
    Это что-то из олимпиадного ? Разовые сдвиги между "кадрами" не очень большие ? Резко прыгать никто не будет между соседними моментами времени ?
    Как видно из рисунка, зелёным помечены круги игроков, расстояние между которыми до 2R, где R -- радиус взаимодействия, одинаковый для всех.
    Расстояния будут попарно считаться как суммы квадратов разностей dx*dx + dy*dy.
    Можно для начала рассматривать для каждого игрока только товарищей, у которых дельты по осям обе не больше 4хR.
    Их тогда в среднем будет сильно меньше 1000.
    Были на 4хR, за "секунду" сблизились каждый на R, и уже "на связи" ! ;)
    Хранить и пересчитывать ближайших с надо запасом, чтобы при небольших сдвигах одного не сравнивать его расстояния со всеми остальными, а только если он сдвинется на R и более.
    Надо иметь массив А[1000,999] с парами {№ соседа, расстояние}, максимальным (вдруг они таки "столпятся" и захотят "пообщаться", и тогда пойдут тормоза, выбрать ближайших будет сильно дольше).
    Ещё массив Л[1000] с текущим количеством "соседей" для каждого А[i].
    И, конечно, позиции Х/У для всех О[1000], где был последний полный пересчёт А[i].
    В первый раз пересчитать все расстояния, каждому в А[i] писать только "недалёких", до 16хRхR.
    Потом -- сортировка всего А[i], и первые ближайшие до 4хRхR окажутся достойными для общения.
    После каждого сдвига игрока И[i] его список пересчитывается целиком, если дельта с О[i] больше RхR (и О[i] обновляется).
    В обратном случае -- просто пересчёт дистанций/сортировка внутри прежнего списка А[i] на длину Л[i].
    Новый список с дистанциями до 4хRхR надо сравнить со старым, и если кто-то там новый появился, то его пометить для перестройки позже.
    И кто "пропал с дистанции" -- тоже требует перестройки.
    Полной или не очень, просто добавить/удалить себя к нему -- надо ещё додумать.
    Инкрементальные действия между "степами" будут пропорциональны количеству немного шевельнувшихся между "степами" игроков И[i], и в основном на длину списков их "соседей", этого достаточно ?
    Ответ написан
    Комментировать
  • Почему Response.status это значение, а status = { Response } это ссылка на Response?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега JavaScript
    Деструкция выглядит так: const { status } = result;
    Вы же создаёте переменную status и в неё записываете объект {result: result}.
    Поэтому возвращает ваша функция вот такую конструкцию:
    {
      data: ...,
      status: {
        result: result,
      }
    }
    Ответ написан
    Комментировать
  • Как в один ключ передать два и более ключа?

    0xD34F
    @0xD34F Куратор тега JavaScript
    const obj = {
      a: {
        b: {
          c: {
            xxx: 666,
          },
        },
      },
    };
    
    const proxy = new Proxy(obj, {
      get(target, key) {
        return key.split('.').reduce((p, c) => p?.[c], target);
      },
      set(target, key, val) {
        const keys = key.split('.');
        const k = keys.pop();
        keys.reduce((p, c) => p[c] ??= {}, target)[k] = val;
        return true;
      },
    });
    
    console.log(proxy['a.b.c.xxx']); // 666
    proxy['x.y.z'] = 187;
    console.log(obj.x.y.z); // 187
    Ответ написан
    4 комментария
  • Как избавиться от неспособности придумать адекватное название блокам?

    delphinpro
    @delphinpro
    frontend developer
    https://tpverstak.ru/common-css-class-names/
    https://github.com/yoksel/common-words
    https://habr.com/ru/post/303174/

    Совмещайте с БЭМ

    .regular-text – обычный текст
    .regular-text_inverted – на темном фоне

    Если фоны могут быть произвольные, имеет смысл сделать отдельные классы-помощники

    .regular-text.bg-black
    .regular-text.bg-reg

    Слайдер можно так и обозвать – .slider
    Если есть еще один – назовите его .carousel
    Что показывает слайдер?
    Картинки из галереи – .gallery-slider
    Карточки с новостями – .news-slider
    И т.д. Помним, что помимо .slider можем использовать .carousel и без лишних заморочек имеем возможность именовать два разных слайдера с новостями. Хотя обычно он один.
    Еще кейс: у вас несколько разных слайдеров, функционально они одинаковые, но сами слайды отличаются. Обзываем из все просто .slider, а слайдам даем отдельные названия. .slide-news, .slide-image и т.п.

    Фантазируйте.
    Ответ написан
    2 комментария
  • Как использовать rotate в canvas HTML5?

    В топике, что вам дали выше есть целый абзац про это:
    Если мы хотим вращать какой-то объект, например, картинку, необходимо правильно взаимодействовать методами rotate и translate, иначе мы никогда не попадём картинкой в нужное место. Самый простой способ осью вращения выбрать центр картинки и отрисовывать её в координаты (-width/2, -height/2). К примеру, мы хотим развернуть картинку размерами 50х50, находящуюся на координатах 100:100. Указываем translate в координату 125:125 и отрисовываем картинку в координату -25:-25. Альтернатива — использовать LibCanvas и метод rotatedImage(или drawImage в ближайшем будущем) и не напрягаться.


    При помощи LibCanvas, который можно скачать с GitHub это будет выглядеть как-то так:
    canvas
      .getContext('2d-libcanvas')
      .drawImage({
          image: yourCanvas,
          from : [15, 40],
          angle: (60).degree()
      });
    


    Если использовать расширение Number.prototype.degree из топика, то ваш код может выглядеть так:
    function rotatedDrawImage (ctx, image, fromX, fromY, angle) {
        ctx.save();
        ctx.translate(fromX + image.width / 2, fromY + image.height / 2);
        ctx.rotate(angle.degree());
        ctx.translate(-(fromX + image.width / 2), -(fromY + image.height / 2));
        ctx.drawImage(image, fromX, fromY);
        ctx.restore();
    }
    rotatedDrawImage(canvas.getContext('2d'), yourCanvas, 15, 40, 60);
    
    Ответ написан
    1 комментарий
  • Че он на элемент не нажимает?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега JavaScript
    Ну короче типа внатуре getElementsByClassName возвращает как бы коллекцию элементов, а у коллекции, мамой клянусь, свойства childNodes нет.

    По секрету, братиш, вот: document.querySelector('.case-print')

    Ну там ещё дальше click работать не будет, но это уж самостоятельно в виде домашнего задания.
    Ответ написан
    Комментировать
  • Как документировать код на JavaScript?

    IonDen
    @IonDen
    JavaScript developer. IonDen.com
    Все придумали до нас: JSDoc
    Ответ написан
    1 комментарий
  • Как процессор распознает длину команды?

    @d-stream
    Готовые решения - не подаю, но...
    Самое простое для понимания:
    например два самых старших бита кода команды определяют ее длину
    соответственно команды
    от 0000000 до 00111111 - будут однобайтовыми
    от 0100000 до 01111111 - будут двухбайтовыми
    от 1000000 до 10111111 - будут трехбайтовыми
    от 1100000 до 11111111 - будут четырехбайтовыми

    Но это не для 8080. Просто для понимания общего смысла.

    А так - на структуре процессора видимо попадался элемент "дешифратор команд" - собственно это его задача понять по коду команды, что означают последующие байты.

    2. Однобайтных команд у 8080 больше одной. Навскидку: NOP, HALT, INT3. RET*, сдвиги, обмен между регистрами

    3. если говорить о 8080 - то удобнее и понятнее даже не логически, а схемотехнически... а так - один из источников
    Ответ написан
    1 комментарий
  • Как проверить null?

    Gvoz1
    @Gvoz1
    Frontend разработчик
    function isEmpty(length ) {
      for (let key in length ) {
        // если тело цикла начнет выполняться - значит в объекте есть свойства
        return false;
      }
      return true;
    }
    Ответ написан
    Комментировать
  • Где здесь замыкание?

    У тебя есть immediately invoked function
    (function(y){ }(i))
    в которую ты передаешь i в качестве параметра
    И есть коллбек
    () => { console.log(y) }
    который выполняется асинхронно (на самом деле не важно как он выполняется)
    В это колбеке ты используешь переменную y которая взята из области IIFE, которую твой коллбек фактически "замкнул" от уборки сборщиком мусора, иначе бы она была убрана значительно раньше.
    Ответ написан
    8 комментариев
  • Основные действия в изучении web программирования?

    iiiBird
    @iiiBird
    Пока ты спишь - твой конкурент совершенствуется
    ну для начала определись в каком направлении ты хочешь развиваться. а дальше к примеру вот схема, довольно правдивая https://proglib.io/p/webdev-2019/
    Ответ написан
    Комментировать
  • Как сделать это на чистом php?

    delphinpro
    @delphinpro Куратор тега PHP
    frontend developer
    Александр Бехоли, Василий Банников, почему нельзя-то?
    Всё можно.

    $data = [1,2,3,4,5,6,7,8,9];
    $perPage = 2;
    $page = $_GET['page'] ?? 1;
    
    $count = $page * $perPage;
    
    $display = array_slice($data, 0, $count);
    
    foreach ($display as $item) {
      echo '<div>'.$item.'</div>';
    }
    echo '<a href="index.php?page='.($page+1).'">Показать ещё</a>';


    вопрос, нахрена так делать, оставим за кадром =))
    Ответ написан
    3 комментария
  • Как вывести текст в стандартный поток nodeJs?

    @Israfil22
    У каждого процесса есть stdout, stdin, stderr.
    В node.js - process.stdout.

    process.stdout and process.stderr differ from other Node.js streams in important ways:
    - They are used internally by console.log() and console.error(), respectively.
    Node.js docs

    Так что да: console.log.
    Ответ написан
    Комментировать
  • Как удалить последний элемент массива?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Удаляем один элемент:

    arr.pop();
    
    // или
    
    arr.length -= !!arr.length;
    
    // или
    
    arr.splice(-1);

    Удаляем несколько (const count = сколько надо удалить;):

    for (let i = count; --i >= 0 && arr.length; arr.pop()) ;
    
    // или
    
    arr.length -= Math.max(0, Math.min(arr.length, count));
    
    // или
    
    count > 0 && arr.splice(-count);
    Ответ написан
    Комментировать
  • Как .then вызывается от объекта?

    Lynn
    @Lynn
    nginx, js, css
    .then всегда возвращает promise. Если функция внутри then вернула не promise, то этот ответ просто заворачивается в Promise.resolve
    Ответ написан
    1 комментарий
  • Устарел ли getElementsBy* и чем лучше querrySelector?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Вот народ ушел в спор о производительности, но никто даже не попытался разобраться, а что под капотом... Производительность ведь искусственными бенчмарками меряют, ага...
    Что ж, времена сейчас такие
    многие на работу кодеров берут, которые даже интереса не имеют в глубь копать. Инженеров брать... - это устаревший подход, как выразился автор "популярного сайта", который прочел автор вопроса. Инженеры они дорогие, и найти их сложно, лучше кодер, пусть и не желающий на работе мозг включать, не говоря уж о желании в устройстве инструментов разбираться.

    Говорить о том, что некие фичи устарели - крайне глупо, если знать, что они ведут себя иначе, чем более модные альтернативы. Предлагаю немного разобраться и начать с того что на поверхности:
    - getElementById и querySelector возвращают конкретную ноду в единственном экземпляре
    - querySelectorAll и getElementsByName возвращает статичную коллекцию NodeList
    - getElementsByClassName, getElementsByTagName и getElementsByTagNameNS возвращают динамическую коллекцию HTMLCollection
    Как видим результат у разного апи различен, а значит и говорить, что некоторые из них устарели - глупо.
    Правда тут есть забавный момент
    в спеке HTMLCollection отмечен как "исторический артефакт", который не стоит использовать при проектировании нового апи. Но заметка эта не для веб-разработчиков, а для тех кто проектирует новое DOM апи.

    С устареванием вроде разобрались, но в вопросе еще есть часть "чем лучше". И тут есть теория, что getElementsBy* быстрее querySelector*. Чисто теоретически звучит логично, querySelector* должен делать полный поиск по дереву со сложностью O(n), а getElementsBy* могут использовать индексы на базе HashMap и получать данные со сложностью O(1), тут и особенности HTMLCollection будут кстати, так как можно не копировать коллекцию, а отдавать одну и ту же (и браузеры действительно так делают). Но без пруфов теория так и останется теорией.
    И бенчмарки - так себе пруф
    Хотя направлять инвесторов в нужную сторону - самое то. Проблема бенчмарков, что можно написать их так, что любая из сравниваемых сторон заметно обгонит другую. Дело техники. Например BubbleSort с O(n2) при определенных условиях в чистую уделывает MergeSort и QuickSort с их O(n×log2n), а именно при n=20 или меньше, 400 простых memswap в наглую рвут 87 рекурсивных операций с memcpy внутри
    Гораздо лучше тут выглядят исходники. И я выбрал исходники chromium, как самого распространенного:
    - getElementsBy* методы все как один обращаются к некой шаблонной функции EnsureCachedCollection, которая в свою очередь обращается к некоему NodeLists кэшу, устроенному внутри действительно как HashMap или что-то наподобие. Никакого поиска тут нет, просто берутся готовые значения, сложность у всего этого действительно константная O(1).
    - querySelector* используют абстракцию SelectorQuery, которая и в самом деле делает поиск по DOM. Но данный поиск неплохо оптимизирован и обвешан кэшами. Притом CSSOM использует абсолютно тот же алгоритм поиска DOM нод для каждого селектора в css.
    Для примера
    в подключенных на странице этого вопроса стилях более 1600 правил (некоторые из которых потенциально могут содержать несколько селекторов), полная обработка стилей из этого файла заняла на моей машине (Ryzen 3600 в стоке) чуть больше 9 мс. Если все это немного округлить, то понадобится 15000 querySelectorAll подряд, притом с разными селекторами, чтоб был промах кэша, дабы я ощутил заметную глазу задержку в ~100мс


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

    lastuniverse
    @lastuniverse
    Всегда вокруг да около IT тем
    5fe9fe587564d777784861.png

    Посмотрите на картинку. Вы для определения видимой высоты стенки в текущей точке используете расстояние от зрачка до пересечения луча с данной точкой стены, это и дает эффект рыбьего глаза.

    Чтобы это исправить вместо данного расстояния вам надо использовать расстояние от точки пересечения до перпендикуляра к направлению взгляда.
    Смотрите сноску в верхнем правом углу на рисунке.
    Где:
    A - камера
    B - точка пересечения луча с преградой
    Ось Y - направление взгляда
    Ось X - перпендикуляр к направлению взгляда
    α - угол между текущим лучем и осью x
    R - расстояние от камеры до точки пересечения луча с преградой
    l - расстояние от точки пересечения луча с преградой до перпендикуляра к направлению взгляда

    Вот пример https://jsfiddle.net/lastuniverse/0t1jo8cr/4/ , в нем есть некоторые искажения, возникающие из-за неправильного расчета length. Дело в том, что ваш алгоритм не находит точные координаты пересечения луча с гранью блока, а находит некую точку внутри блока, что так же добавляет искажения.

    Вот еще вариант https://jsfiddle.net/lastuniverse/6nrsL28g/8/ (переделал из ответа на вопрос Почему данный код работает неправильно? от товарища twobomb ). В нем эффект рыбьего глаза полностью нивелирован (смотрите функцию drawGame(...) ). Как бонус - данный пример работает в несколько десятков раз быстрее, и позволяет ставить блоки нестандартного размера)))

    5fea7f268ea1d386247037.png
    Ответ написан
  • Как сделать инструкцию сайта?

    freislot
    @freislot
    Frontend-разработчик
    reactour думаю что вам нужно что-то подобное

    эта штука гуглится так "название фремворка + tour или guide"
    Ответ написан
    2 комментария
  • API для поиска случайных гифок?

    Посмотрите в сторону giphy - это популярных хостинг для гифок и у них есть богатый апи, который используется во всяких месседжерах.
    И там как раз есть метод для получения случайной гифки
    Ответ написан
    Комментировать
  • Skill_box или Geekbrains?

    sergey-gornostaev
    @sergey-gornostaev
    Седой и строгий
    5fac14ac7ed64056605532.jpeg
    Ответ написан
    Комментировать