• Как решить задачу?

    wataru
    @wataru Куратор тега Алгоритмы
    Разработчик на С++, экс-олимпиадник.
    Быстрое решение - построить для этого массива суффиксное дерево алгоритмом Укконена (или вот ссылка), потом обойти его, найти самую глубокую вершину, у которой есть более одного ребенка, и вывести путь до нее от корня. Работает за O(n).

    Edit:

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

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

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

    Lynn
    @Lynn
    nginx, js, css
    Почитайте статьи как работают движки JS.
    Можно начать с этой https://mathiasbynens.be/notes/prototypes

    Если очень кратко, то V8 (движок JS в Chrome, node.js и т.п.) анализирует и оптимизирует выполняемый код. В частности в первом случае он понимает что на входе всегда один и тот же класс и оптимизирует доступ к его полям. Во втором случае он каждый раз честно проверяет «а есть ли атрибут buffer_data_calc? есть ли у него атрибут color? а это точно массив? а в нём есть 3 элемент? и т.п»
    Ответ написан
    6 комментариев
  • Как работает сборщик мусор с колбеками Promise?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Сборщики мусора (далее GC) бывают разные, в том же v8 используется сразу 3 типа GC в зависимости от поколения объектов (упрощенно молодое, старое и сложные случаи), но в большинстве своем принцип работы сводится к просчету достижимости из некоторого корня в дереве объектов (например глобального объекта, но не только его). v8 не является исключением, и его GC содержит C++ api для создания таких корней. Из JS мы данным api можем воспользоваться лишь косвенно, через сущности языка предоставляемые либо самим v8 либо платформой (браузером, node.js, deno и т.д.)
    Чтоб было понятно давайте рассмотрим простой пример:
    const h = 'Hello world!';
    const n = 'nothing';
    setTimeout(() => {
      console.log(h);
    }, 1000);
    У нас есть строковые переменные h и n. Переменная n нигде больше не используется и ее память очистится при ближайшей работе GC. А вот переменная h оказалась в замыкании созданном стрелочной функцией. И хотя в JS мы не можем достучаться до h имея ссылку на эту функцию, сама функция все таки имеет ссылку на h, а значит h не может быть уничтожена пока не будет уничтожена сама функция. В терминах GC ссылка на h будет серой, то есть сама ссылка на h недоступна из корня напрямую, но сейчас мы проверяем объекты, которые на нее ссылаются и истина будет зависеть от них (подробнее можете погуглить "mark black white and gray memory in gc").
    Давайте посмотрим на саму стрелочную функцию, которая держит h в замыкании. Из кода видно, что мы ее передаем в функцию setTimeout, о которой известно, что это api предоставленное платформой (а значит вероятно какая-то часть написана на C++), а так же, что она асинхронная. Платформе реализующей setTimeout наша функция понадобится после асинхронного ожидания и никто платформе не сможет гарантировать, что во время этого ожидания не будет работы GC, поэтому ей ничего не остается, кроме как запросить у v8 создание нового корневого дерева объектов, в которое и будет положена ссылка на данную функцию.
    После же выполнения таймаута платформе больше не нужна наша функция, поэтому ссылка на нее будет удалена из дерева объектов. А так как других ссылок на функцию нет, и она больше не доступна ни из одного корня - GC удалит из памяти и функцию и строку связанную h, которая так же стала недоступна из корня.

    Посмотрим на пример из вопроса. У нас есть стрелочная функция, которая удерживает на себе инстанс компонента через this ссылку (так как стрелочные функции замыкают this). Саму функцию в памяти удерживает промис порожденный вызовом loader('url'), так как мы отдали её в метод then. Других ссылок на данную функцию нет, а значит и сама функция и ее замыкание (инстанс компонента) будут "жить" не менее "жизни" промиса.
    Скажем был отправлен запрос на сервер, но потом компонент в котором был объявлен промис и колбек был удален.
    И после удаления приходит ответ от сервера, и он выполнит колбек. Это значит что колбек остался в памяти со всеми переменными контекста
    Если других ссылок не осталось, то инстанс компонента будет удерживаться от очистки через промис.

    Теперь стоит разобраться с самим промисом. У него может быть 3 состояния - pending, resolved или rejected. После перехода в состояния resolved или rejected промис может выполнить сохраненные колбэки в ближайшем микротаске, а после он удалит на них ссылки из себя, в следствии чего, память удерживаемая замыканием колбэка может быть очищена (при отсутствии на нее других ссылок, достижимых из какого-либо корня).
    В состоянии pending промис может потенциально находится бесконечно долго, при этом ссылаясь на все колбэки переданные ему в методы then, catch или finally, а значит так же косвенно ссылаясь на их замыкания. И тут все зависит от того, кто ссылается на данный промис, и достижим ли он из корня. И да, промис вполне может быть удален из памяти так и не дождавшись своего завершения.
    интересное умозаключение
    Если Promise - это обещание, то в данном случае оно будет нарушено?


    В комментах к вопросу есть еще один интересный пример:
    function getSomething(){
      return new Promise((resolve, reject)=>{
        if(sys_condition){
           resolve();
        } 
      })
    }
    
    function testPromise(){
      let config = {....}
      getSomething().then(()=>{
         #use config
         goOn(...config)
      })
    }
    
    testPromise();
    У нас есть вызванная 1 раз функция testPromise, которая получает из функции getSomething промис, в который с помощью метода then сохраняет колбэк, удерживающий в замыкании переменную config. Сам промис она нигде не сохраняет, что здесь очень важно.
    В функции getSomething мы просто возвращаем промис созданный через его конструктор, который как мы уже знаем нигде больше не сохраняется. И на этом могло бы все и закончится, без вызова колбэка независимо ни от чего. Но конструктор промиса выполняет свой колбэк синхронно, а кроме того он передает в него 2 функции - resolve и reject, которые в своем замыкании ссылаются на только что созданный промис (а это уже 2 ссылки на него, хотя мы то его никуда не сохраняли). Переменная reject никак не используется, а значит спокойно может быть удалена после завершения колбэка. Переменная resolve просто вызывается как функция внутри условия, но более тоже никак не используется и никуда не сохраняется, а значит так же может быть удалена.
    В этом примере. если sys_condition = false и resolve не вызовется, это значит что создается утечка памяти
    Нет, утечки памяти не будет. Колбэк созданный в testPromise будет удален вместе с замыканием, так и не вызвавшись ни разу.
    Ответ написан
    3 комментария
  • 22 H1 на страницу это вообще законно?

    Kiriniy
    @Kiriniy
    Графический и веб-дизайнер
    Да, с переходом на HTML5 это нормально (с оговорками) уже скоро 10 лет как. У самой страницы по прежнему должен быть собственный и единственный h1, но если в ней есть блоки <section> и в частности <article>, то они могут иметь собственную иерархию h1-h6 и это нормально.
    Ответ написан
    Комментировать
  • Как сделать анимацию разворота картинки?

    Четыре варианта сделать анимацию поворота айфона:

    вариант 1
    берёшь первую картинку и поворачиваешь её в css с помощью transform: rotate3d
    Будет плоско, потому что у картинки айфона нет толщины. Зато дёшево и сердито по времени, ресурсам, трудозатратам, нервам и т.д.

    вариант 2
    берёшь где-то 3D-модель айфона с чистым экраном. Открываешь в 3D-редакторе (blender, 3dmax и пр.), фигачишь на него скриншот сайта и делаешь покадровую анимацию поворота. Склеиваешь кадры анимации в gif, mp4 или webp.

    вариант 3
    берёшь 3D-модель и с помощью WebGL отрисовываешь её прям на странице. А так как это 3D, то вращать можешь так, как твоей душеньке угодно - под любыми углами и с любой скоростью.

    вариант 4
    берёшь айфон, камеру, ватман для фона и крутящуюся подставку.
    крепишь айфон на крутящуюся подставку, выставляешь камеру, свет, фон. И начинаешь поворачивать айфон, делая кадры на камеру. Потом, как во втором варианте, склеиваешь фотографии в анимацию в формате mp4, webp или gif
    Ответ написан
    Комментировать
  • Как сделать алгоритм?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Поскольку речь о делителях, то надо рассматривать только простые числа.
    999 < x * (91 * x) < 10000
    999/91 < x2 < 10000/91
    3.313 < x < 10.483
    x - простое число
    Решениями будут 5 и 7
    5 * (91 * 5) = 2275
    7 * (91 * 7) = 4459
    Ответ написан
    1 комментарий
  • Как вызвать такое окно в JS?

    Seasle
    @Seasle Куратор тега JavaScript
    Window: beforeunload event. Важно, отметил отдельным ответом - необходимо прочесть блок Example.
    Ответ написан
    Комментировать
  • Как сделать линии между блоками сетки?

    HamSter007
    @HamSter007
    HTML/CSS верстальщик
    Такой вариант с flex и смещением на пару пикселей:

    Ответ написан
    1 комментарий
  • Анимация на canvas/js?

    sfi0zy
    @sfi0zy
    Creative frontend developer
    На CSS вы это никак не сделаете - там неравномерное растяжение картинок присутствует. Тут "начальник отдела разработки" либо не шарит во фронтенде, либо пытается сбить цену. Но штука из разряда "ябзаверстал", а я тут как раз собираю коллекцию примеров с шейдерами, так что набросал похожий эффект для нее, только без кляксы в центре (там есть немного лишнего кода, но это издержки, чтобы серия примеров не сильно отличалась).


    * Если вдруг будете копировать себе, не забывайте про лицензию.
    Ответ написан
    8 комментариев
  • Как убрать рамку вокруг монтажной области в Фотошопе?

    @NESTOV
    Привет. Где то в настройках интерфейса, точно есть. Вот тут вроде
    spoiler
    5e79e805e7d02482792795.png
    Ответ написан
    1 комментарий
  • Как правильно настроить внутреннюю тень SVG?

    sfi0zy
    @sfi0zy
    Creative frontend developer
    Тут все дело в том, что вы используете для создания тени не саму кривую штуку, а "прозрачность" вокруг нее. Это немного нелогично с точки зрения понятия "тень". То есть у вас тень отбрасывает "пустота" вокруг кривой штуки (и эта "пустота" еще и обрезается в неудачном месте). Тут нужно использовать обратный подход, когда именно кривая штука используется для создания тени. В вашем примере для этого нужно поменять tableValues в feFuncA с "1 0" на "0 1" и в первом feComposite заменить "in" на "out".

    Как альтернативный пример:


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

    Seasle
    @Seasle Куратор тега JavaScript
    То есть Вы упорно не хотите изучать теорию?

    UPD:
    Там же луч

    Открыть лучше в отдельном окне. На ЛКМ можно переместить точку начала луча.
    Ответ написан
    6 комментариев
  • У кого есть iphone 4, можете посмотреть насколько корректно отображается страница?

    wapster92
    @wapster92 Куратор тега CSS
    Последняя версия ios на iphone4 7.2. Bottstrap 4 сделан на flexbox. Полноценная поддержка flexbox начинается с версии ios 9.2 (с версии 5, но с префиксами и танцами). В вопросе нужно указывать, что за технологии используешь, кто отвечает должен все комменты посмотреть, прежде чем ответить? А ещё лучше посмотреть поддержку на mdn или на аналогичных ресурсах.
    Ответ написан
    2 комментария
  • Как избавиться от повторяющихся цифр в строке?

    0xD34F
    @0xD34F Куратор тега JavaScript
    str.replace(/(\d)\1+/g, '$1')
    
    // или
    
    ''.concat(...str.split(/(\d)\1+/))
    
    // или
    
    Array.from(str).filter((n, i, a) => Number.isNaN(+n) || a[i - 1] !== n).join('')
    
    // или
    
    [...str.matchAll(/(\D+)|(?:(\d)\2*)/g)].reduce((acc, n) => acc + (n[1] ?? n[2]), '')
    Ответ написан
    2 комментария
  • Как анимировать картинку?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬


    Добавил физику. CodePen
    Ответ написан
    Комментировать
  • Как перенести освещение и тени с одного изображения на другое в фотошоп?

    Снизу лого, сверху стена, режим Linear light, прозрачность 70%
    spoiler
    5e033b25104d7507230293.jpeg


    Upd. Лого сделать паттерном и наложить новый слой-Pattern, где указать малый размер, около 10%, чтобы было много повторов.
    Свет - Effects - Render - Lighting Effects...
    и «поиграть с настройками» : ) Пресет - Three down для начала. И держите перед глазами для референса исходную стену.
    5e0358668247e713780700.png
    Ответ написан